# HG changeset patch
# User sos22@xxxxxxxxxxxxxxxxxxxx
# Node ID 6411e42ae4973719fb6b48740e9f267e6b3fa808
# Parent 4cce50ba45208ff31c2addfe0a9a0ef9083e64a0
Re-arrange things in the domain builder a bit so as to make sure that
when we make a page below 4G in the domain, that gets reflected into
the M2P and P2M tables.
Signed-off-by: Steven Smith, sos22@xxxxxxxxx
diff -r 4cce50ba4520 -r 6411e42ae497 tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c Sun Jan 29 09:55:28 2006
+++ b/tools/libxc/xc_linux_build.c Mon Jan 30 11:53:33 2006
@@ -654,72 +654,6 @@
}
}
- if ( (mmu = xc_init_mmu_updates(xc_handle, dom)) == NULL )
- goto error_out;
-
- /* Write the phys->machine and machine->phys table entries. */
- physmap_pfn = (vphysmap_start - dsi.v_start) >> PAGE_SHIFT;
- physmap = physmap_e = xc_map_foreign_range(
- xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE,
- page_array[physmap_pfn++]);
-
- for ( count = 0; count < nr_pages; count++ )
- {
- if ( xc_add_mmu_update(
- xc_handle, mmu,
- ((uint64_t)page_array[count] << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE,
- count) )
- {
- fprintf(stderr,"m2p update failure p=%lx m=%lx\n",
- count, page_array[count]);
- munmap(physmap, PAGE_SIZE);
- goto error_out;
- }
- *physmap_e++ = page_array[count];
- if ( ((unsigned long)physmap_e & (PAGE_SIZE-1)) == 0 )
- {
- munmap(physmap, PAGE_SIZE);
- physmap = physmap_e = xc_map_foreign_range(
- xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE,
- page_array[physmap_pfn++]);
- }
- }
- munmap(physmap, PAGE_SIZE);
-
- /* Send the page update requests down to the hypervisor. */
- if ( xc_finish_mmu_updates(xc_handle, mmu) )
- goto error_out;
-
- if ( shadow_mode_enabled )
- {
- struct xen_reserved_phys_area xrpa;
-
- /* Enable shadow translate mode */
- if ( xc_shadow_control(xc_handle, dom,
- DOM0_SHADOW_CONTROL_OP_ENABLE_TRANSLATE,
- NULL, 0, NULL) < 0 )
- {
- PERROR("Could not enable translation mode");
- goto error_out;
- }
-
- /* Find the shared info frame. It's guaranteed to be at the
- start of the PFN hole. */
- xrpa.domid = dom;
- xrpa.idx = 0;
- rc = xc_memory_op(xc_handle, XENMEM_reserved_phys_area, &xrpa);
- if ( rc != 0 )
- {
- PERROR("Cannot find shared info pfn");
- goto error_out;
- }
- guest_shared_info_mfn = xrpa.first_pfn;
- }
- else
- {
- guest_shared_info_mfn = shared_info_frame;
- }
-
/* setup page tables */
#if defined(__i386__)
if (dsi.pae_kernel)
@@ -773,6 +707,72 @@
ctxt->ctrlreg[3] >> PAGE_SHIFT, dom) )
goto error_out;
#endif
+
+ if ( (mmu = xc_init_mmu_updates(xc_handle, dom)) == NULL )
+ goto error_out;
+
+ /* Write the phys->machine and machine->phys table entries. */
+ physmap_pfn = (vphysmap_start - dsi.v_start) >> PAGE_SHIFT;
+ physmap = physmap_e = xc_map_foreign_range(
+ xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE,
+ page_array[physmap_pfn++]);
+
+ for ( count = 0; count < nr_pages; count++ )
+ {
+ if ( xc_add_mmu_update(
+ xc_handle, mmu,
+ ((uint64_t)page_array[count] << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE,
+ count) )
+ {
+ fprintf(stderr,"m2p update failure p=%lx m=%lx\n",
+ count, page_array[count]);
+ munmap(physmap, PAGE_SIZE);
+ goto error_out;
+ }
+ *physmap_e++ = page_array[count];
+ if ( ((unsigned long)physmap_e & (PAGE_SIZE-1)) == 0 )
+ {
+ munmap(physmap, PAGE_SIZE);
+ physmap = physmap_e = xc_map_foreign_range(
+ xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE,
+ page_array[physmap_pfn++]);
+ }
+ }
+ munmap(physmap, PAGE_SIZE);
+
+ /* Send the page update requests down to the hypervisor. */
+ if ( xc_finish_mmu_updates(xc_handle, mmu) )
+ goto error_out;
+
+ if ( shadow_mode_enabled )
+ {
+ struct xen_reserved_phys_area xrpa;
+
+ /* Enable shadow translate mode */
+ if ( xc_shadow_control(xc_handle, dom,
+ DOM0_SHADOW_CONTROL_OP_ENABLE_TRANSLATE,
+ NULL, 0, NULL) < 0 )
+ {
+ PERROR("Could not enable translation mode");
+ goto error_out;
+ }
+
+ /* Find the shared info frame. It's guaranteed to be at the
+ start of the PFN hole. */
+ xrpa.domid = dom;
+ xrpa.idx = 0;
+ rc = xc_memory_op(xc_handle, XENMEM_reserved_phys_area, &xrpa);
+ if ( rc != 0 )
+ {
+ PERROR("Cannot find shared info pfn");
+ goto error_out;
+ }
+ guest_shared_info_mfn = xrpa.first_pfn;
+ }
+ else
+ {
+ guest_shared_info_mfn = shared_info_frame;
+ }
*store_mfn = page_array[(vstoreinfo_start-dsi.v_start) >> PAGE_SHIFT];
*console_mfn = page_array[(vconsole_start-dsi.v_start) >> PAGE_SHIFT];
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|