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>
/* 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 */
/*
* 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);