aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xc
diff options
context:
space:
mode:
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2003-12-20 12:44:39 +0000
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2003-12-20 12:44:39 +0000
commit832edab791f9f82771fbfda4a79e4ed931baf7c7 (patch)
treeb005484ef17c047b0b3af4acdec66cb7dd8960b9 /tools/xc
parent3ac1c3b681cb1fe75b4ea089e93bdb1d3217f392 (diff)
parent24fa12d9d6bc4f6cf3740475e8403d911e84b53c (diff)
downloadxen-832edab791f9f82771fbfda4a79e4ed931baf7c7.tar.gz
xen-832edab791f9f82771fbfda4a79e4ed931baf7c7.tar.bz2
xen-832edab791f9f82771fbfda4a79e4ed931baf7c7.zip
bitkeeper revision 1.653.1.2 (3fe44437s9U66sHQJ1hA64CActA2uw)
Merge scramble.cl.cam.ac.uk:/auto/groups/xeno/BK/xeno.bk into scramble.cl.cam.ac.uk:/local/scratch/kaf24/xeno
Diffstat (limited to 'tools/xc')
-rw-r--r--tools/xc/lib/xc_linux_build.c28
-rw-r--r--tools/xc/lib/xc_linux_restore.c9
-rw-r--r--tools/xc/lib/xc_linux_save.c18
3 files changed, 29 insertions, 26 deletions
diff --git a/tools/xc/lib/xc_linux_build.c b/tools/xc/lib/xc_linux_build.c
index a0176edfc1..7e5c57bb0d 100644
--- a/tools/xc/lib/xc_linux_build.c
+++ b/tools/xc/lib/xc_linux_build.c
@@ -106,12 +106,12 @@ static int setup_guestos(int xc_handle,
const char *cmdline,
unsigned long shared_info_frame)
{
- l1_pgentry_t *vl1tab = NULL, *vl1e = NULL;
- l2_pgentry_t *vl2tab = NULL, *vl2e = NULL;
+ l1_pgentry_t *vl1tab;
+ l2_pgentry_t *vl2tab;
unsigned long *page_array = NULL;
mmu_update_t *pgt_update_arr = NULL, *pgt_updates = NULL;
int alloc_index, num_pt_pages;
- unsigned long l2tab;
+ unsigned long l2tab, l2e, l1e=0;
unsigned long l1tab = 0;
unsigned long num_pgt_updates = 0;
unsigned long count, pt_start, i, j;
@@ -230,44 +230,46 @@ static int setup_guestos(int xc_handle,
if ( (vl2tab = map_pfn(pm_handle, l2tab >> PAGE_SHIFT)) == NULL )
goto error_out;
memset(vl2tab, 0, PAGE_SIZE);
- vl2e = vl2tab + l2_table_offset(virt_load_addr);
+ unmap_pfn(pm_handle, vl2tab);
+ l2e = l2tab + (l2_table_offset(virt_load_addr)*sizeof(l2_pgentry_t));
for ( count = 0; count < tot_pages; count++ )
{
- if ( ((unsigned long)vl1e & (PAGE_SIZE-1)) == 0 )
+ if ( (l1e & (PAGE_SIZE-1)) == 0 )
{
l1tab = page_array[alloc_index] << PAGE_SHIFT;
if ( (vl1tab = map_pfn(pm_handle, l1tab >> PAGE_SHIFT)) == NULL )
goto error_out;
memset(vl1tab, 0, PAGE_SIZE);
+ unmap_pfn(pm_handle, vl1tab);
alloc_index--;
- vl1e = vl1tab + l1_table_offset(virt_load_addr +
- (count << PAGE_SHIFT));
+ l1e = l1tab + (l1_table_offset(virt_load_addr+(count<<PAGE_SHIFT))*
+ sizeof(l1_pgentry_t));
/* make apropriate entry in the page directory */
- pgt_updates->ptr = (unsigned long)vl2e;
+ pgt_updates->ptr = l2e;
pgt_updates->val = l1tab | L2_PROT;
pgt_updates++;
num_pgt_updates++;
- vl2e++;
+ l2e += sizeof(l2_pgentry_t);
}
if ( count < pt_start )
{
- pgt_updates->ptr = (unsigned long)vl1e;
+ pgt_updates->ptr = l1e;
pgt_updates->val = (page_array[count] << PAGE_SHIFT) | L1_PROT;
pgt_updates++;
num_pgt_updates++;
- vl1e++;
+ l1e += sizeof(l1_pgentry_t);
}
else
{
- pgt_updates->ptr = (unsigned long)vl1e;
+ pgt_updates->ptr = l1e;
pgt_updates->val =
((page_array[count] << PAGE_SHIFT) | L1_PROT) & ~_PAGE_RW;
pgt_updates++;
num_pgt_updates++;
- vl1e++;
+ l1e += sizeof(l1_pgentry_t);
}
pgt_updates->ptr =
diff --git a/tools/xc/lib/xc_linux_restore.c b/tools/xc/lib/xc_linux_restore.c
index 2418d97219..44ebe3c940 100644
--- a/tools/xc/lib/xc_linux_restore.c
+++ b/tools/xc/lib/xc_linux_restore.c
@@ -301,7 +301,8 @@ int xc_linux_restore(int xc_handle,
page[j] |= pfn_to_mfn_table[pfn] << PAGE_SHIFT;
}
if ( add_mmu_update(xc_handle, mmu_updates, &mmu_update_idx,
- (unsigned long)&ppage[j], page[j]) )
+ (mfn<<PAGE_SHIFT)+(j*sizeof(l1_pgentry_t)),
+ page[j]) )
goto out;
}
break;
@@ -337,7 +338,8 @@ int xc_linux_restore(int xc_handle,
page[j] |= pfn_to_mfn_table[pfn] << PAGE_SHIFT;
}
if ( add_mmu_update(xc_handle, mmu_updates, &mmu_update_idx,
- (unsigned long)&ppage[j], page[j]) )
+ (mfn<<PAGE_SHIFT)+(j*sizeof(l2_pgentry_t)),
+ page[j]) )
goto out;
}
break;
@@ -345,9 +347,6 @@ int xc_linux_restore(int xc_handle,
memcpy(ppage, page, PAGE_SIZE);
break;
}
- /* NB. Must flush before unmapping page, as pass VAs to Xen. */
- if ( flush_mmu_updates(xc_handle, mmu_updates, &mmu_update_idx) )
- goto out;
unmap_pfn(pm_handle, ppage);
if ( add_mmu_update(xc_handle, mmu_updates, &mmu_update_idx,
diff --git a/tools/xc/lib/xc_linux_save.c b/tools/xc/lib/xc_linux_save.c
index 463efb7acb..e5f5934cff 100644
--- a/tools/xc/lib/xc_linux_save.c
+++ b/tools/xc/lib/xc_linux_save.c
@@ -44,19 +44,20 @@ static int check_pfn_ownership(int xc_handle,
{
dom0_op_t op;
op.cmd = DOM0_GETPAGEFRAMEINFO;
- op.u.getpageframeinfo.pfn = mfn;
- if ( (do_dom0_op(xc_handle, &op) < 0) ||
- (op.u.getpageframeinfo.domain != dom) )
- return 0;
- return 1;
+ op.u.getpageframeinfo.pfn = mfn;
+ op.u.getpageframeinfo.domain = dom;
+ return (do_dom0_op(xc_handle, &op) >= 0);
}
#define GETPFN_ERR (~0U)
-static unsigned int get_pfn_type(int xc_handle, unsigned long mfn)
+static unsigned int get_pfn_type(int xc_handle,
+ unsigned long mfn,
+ unsigned int dom)
{
dom0_op_t op;
op.cmd = DOM0_GETPAGEFRAMEINFO;
- op.u.getpageframeinfo.pfn = mfn;
+ op.u.getpageframeinfo.pfn = mfn;
+ op.u.getpageframeinfo.domain = dom;
if ( do_dom0_op(xc_handle, &op) < 0 )
{
PERROR("Unexpected failure when getting page frame info!");
@@ -259,7 +260,8 @@ int xc_linux_save(int xc_handle,
mfn_to_pfn_table[mfn] = i;
/* Query page type by MFN, but store it by PFN. */
- if ( (pfn_type[i] = get_pfn_type(xc_handle, mfn)) == GETPFN_ERR )
+ if ( (pfn_type[i] = get_pfn_type(xc_handle, mfn, domid)) ==
+ GETPFN_ERR )
goto out;
}