]> xenbits.xensource.com Git - people/vhanquez/xen.git/commitdiff
hvm: Allocate an unmapped guard page to separate ordinary low RAM
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 18 Jan 2008 13:54:11 +0000 (13:54 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 18 Jan 2008 13:54:11 +0000 (13:54 +0000)
from special pages (ioreq, xenstore, etc). This will stop some probe
functions (e.g., embedded in memtest) from stomping on the special
pages.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen-unstable changeset:   16728:be960a84e492c1baa0a2dfa76b1a770d0df5e433
xen-unstable date:        Thu Jan 17 12:59:10 2008 +0000

tools/libxc/xc_hvm_build.c

index f3a0707a31678e252f38e05ee08de3fc7a14b30c..71126abcbad61251e93ee6eb62b5d767e8e49cdc 100644 (file)
@@ -85,13 +85,19 @@ static void build_e820map(void *e820_page, unsigned long long mem_size)
     e820entry[nr_map].type = E820_RESERVED;
     nr_map++;
 
-    /* Low RAM goes here. Remove 3 pages for ioreq, bufioreq, and xenstore. */
+    /*
+     * Low RAM goes here. Remove 4 pages for: ioreq, bufioreq, and xenstore.
+     *  1. Guard page.
+     *  2. Buffered ioreq.
+     *  3. Xenstore.
+     *  4. Normal ioreq.
+     */
     e820entry[nr_map].addr = 0x100000;
-    e820entry[nr_map].size = mem_size - 0x100000 - PAGE_SIZE * 3;
+    e820entry[nr_map].size = mem_size - 0x100000 - PAGE_SIZE * 4;
     e820entry[nr_map].type = E820_RAM;
     nr_map++;
 
-    /* Explicitly reserve space for special pages (ioreq and xenstore). */
+    /* Explicitly reserve space for special pages. */
     e820entry[nr_map].addr = mem_size - PAGE_SIZE * 3;
     e820entry[nr_map].size = PAGE_SIZE * 3;
     e820entry[nr_map].type = E820_RESERVED;
@@ -253,6 +259,15 @@ static int setup_guest(int xc_handle,
     else
         shared_page_nr = (v_end >> PAGE_SHIFT) - 1;
 
+    /* Free the guard page that separates low RAM from special pages. */
+    rc = xc_domain_memory_decrease_reservation(
+            xc_handle, dom, 1, 0, &page_array[shared_page_nr-3]);
+    if ( rc != 0 )
+    {
+        PERROR("Could not deallocate guard page for HVM guest.\n");
+        goto error_out;
+    }
+
     /* Paranoia: clean pages. */
     if ( xc_clear_domain_page(xc_handle, dom, shared_page_nr) ||
          xc_clear_domain_page(xc_handle, dom, shared_page_nr-1) ||