]> xenbits.xensource.com Git - people/dariof/xen.git/commitdiff
xen/pvh: place the trampoline at page 0x1 4.10.0-shim-comet-3
authorRoger Pau Monne <roger.pau@citrix.com>
Wed, 17 Jan 2018 12:00:41 +0000 (12:00 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Wed, 17 Jan 2018 16:34:22 +0000 (16:34 +0000)
Since PVH guest jump straight into trampoline_setup trampoline_phys is
not initialized, thus the trampoline is relocated to address 0.

This works, but has the undesirable effect of having VA 0 mapped to
MFN 0, which means NULL pointed dereferences no longer trigger a page
fault.

In order to solve this, place the trampoline at page 0x1 and reserve
the memory used by it.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Wei Liu <wei.liu2@citrix.com>
xen/arch/x86/boot/head.S
xen/arch/x86/mm.c

index 14caca6798f5cc4e1697e7d3d698f4b6dc632a96..c527910478d7b7e0f668d69ea282c1fcdf198b0f 100644 (file)
@@ -411,6 +411,9 @@ __pvh_start:
         /* Skip bootloader setup and bios setup, go straight to trampoline */
         movb    $1, sym_esi(pvh_boot)
         movb    $1, sym_esi(skip_realmode)
+
+        /* Set trampoline_phys to use mfn 1 to avoid having a mapping at VA 0 */
+        movw    $0x1000, sym_esi(trampoline_phys)
         jmp     trampoline_setup
 
 #endif /* CONFIG_PVH_GUEST */
index 371c76402757762f7115e1309718acb9ce6ff503..a8b59617d34dbc48ea9c56687abe013e3749e728 100644 (file)
@@ -292,9 +292,14 @@ void __init arch_init_memory(void)
     /*
      * First 1MB of RAM is historically marked as I/O.  If we booted PVH,
      * reclaim the space.  Irrespective, leave MFN 0 as special for the sake
-     * of 0 being a very common default value.
+     * of 0 being a very common default value. Also reserve page 0x1 which is
+     * used by the trampoline code on PVH.
      */
-    for ( i = 0; i < (pvh_boot ? 1 : 0x100); i++ )
+    BUG_ON(pvh_boot && trampoline_phys != 0x1000);
+    for ( i = 0;
+          i < (pvh_boot ? (1 + PFN_UP(trampoline_end - trampoline_start))
+                        : 0x100);
+          i++ )
         share_xen_page_with_guest(mfn_to_page(_mfn(i)),
                                   dom_io, XENSHARE_writable);