diff options
author | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2003-12-20 12:44:39 +0000 |
---|---|---|
committer | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2003-12-20 12:44:39 +0000 |
commit | 832edab791f9f82771fbfda4a79e4ed931baf7c7 (patch) | |
tree | b005484ef17c047b0b3af4acdec66cb7dd8960b9 /tools/xc | |
parent | 3ac1c3b681cb1fe75b4ea089e93bdb1d3217f392 (diff) | |
parent | 24fa12d9d6bc4f6cf3740475e8403d911e84b53c (diff) | |
download | xen-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.c | 28 | ||||
-rw-r--r-- | tools/xc/lib/xc_linux_restore.c | 9 | ||||
-rw-r--r-- | tools/xc/lib/xc_linux_save.c | 18 |
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; } |