xen/pvh: place the trampoline at page 0x1

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>
This commit is contained in:
Roger Pau Monne authored and Ian Jackson committed 2018-01-17 16:34:22 +00:00
1 parent 79f797c3f4
commit fa23f2aaa2
2 files changed
+10 -2

No files matched your search

+3
View 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 */
+7 -2
View 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);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.