libxc: Domain builder must align initial virtual mapping to 4MB
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Fri, 2 Feb 2007 15:41:45 +0000 (15:41 +0000)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Fri, 2 Feb 2007 15:41:45 +0000 (15:41 +0000)
boundaries.
From: Gerd Hoffmann <kraxel@suse.de>
Signed-off-by: Keir Fraser <keir@xensource.com>
tools/libxc/xc_dom_core.c
tools/libxc/xc_dom_x86.c

index 8d329ae74f088f17018cbec1bef44064980bfc9a..ae64972ed5277e6adefe51dc3a8c53f2833ebb25 100644 (file)
@@ -717,6 +717,9 @@ int xc_dom_build_image(struct xc_dom_image *dom)
     }
     page_size = XC_DOM_PAGE_SIZE(dom);
 
+    /* 4MB align virtual base address */
+    dom->parms.virt_base &= ~(((uint64_t)1<<22)-1);
+
     /* load kernel */
     if (0 != xc_dom_alloc_segment(dom, &dom->kernel_seg, "kernel",
                                  dom->kernel_seg.vstart,
index 9e489c320d175091dd390adea455144c46bfbc5b..fdc3d4ba5e182916819b42542e3950a4a92adec3 100644 (file)
@@ -66,11 +66,12 @@ static int count_pgtables(struct xc_dom_image *dom, int pae,
 
     extra_pages = dom->alloc_bootstack ? 1 : 0;
     extra_pages += dom->extra_pages;
+    extra_pages += 128; /* 512kB padding */
     pages = extra_pages;
     for (;;)
     {
        try_virt_end = round_up(dom->virt_alloc_end + pages * PAGE_SIZE_X86,
-                               bits_to_mask(l1_bits));
+                               bits_to_mask(22)); /* 4MB alignment */
        dom->pg_l4 =
            nr_page_tables(dom->parms.virt_base, try_virt_end, l4_bits);
        dom->pg_l3 =
@@ -313,6 +314,7 @@ static int alloc_magic_pages(struct xc_dom_image *dom)
     if (xc_dom_feature_translated(dom))
        dom->shared_info_pfn = xc_dom_alloc_page(dom, "shared info");
     dom->alloc_bootstack = 1;
+
     return 0;
 }