Messages in this thread | ![/](/images/icornerl.gif) | | From | Jason Andryuk <> | Subject | [PATCH 0/5] x86/pvh: Make PVH entry relocatable | Date | Wed, 10 Apr 2024 15:48:45 -0400 |
| |
Using the PVH entry point, the uncompressed vmlinux is loaded at LOAD_PHYSICAL_ADDR, and execution starts in 32bit mode at the address in XEN_ELFNOTE_PHYS32_ENTRY, pvh_start_xen, with paging disabled.
Loading at LOAD_PHYSICAL_ADDR has not been a problem in the past as virtual machines don't have conflicting memory maps. But Xen now supports a PVH dom0, which uses the host memory map, and there are Coreboot/EDK2 firmwares that have reserved regions conflicting with LOAD_PHYSICAL_ADDR. Xen recently added XEN_ELFNOTE_PHYS32_RELOC to specify an alignment, minimum and maximum load address when LOAD_PHYSICAL_ADDR cannot be used. This patch series makes the PVH entry path PIC to support relocation.
Only x86-64 is converted. The 32bit entry path calling into vmlinux, which is not PIC, will not support relocation.
The entry path needs pages tables to switch to 64bit mode. A new pvh_init_top_pgt is added to make the transition into the startup_64 when the regular init_top_pgt pagetables are setup. This duplication is unfortunate, but it keeps the changes simpler. __startup_64() can't be used to setup init_top_pgt for PVH entry because it is 64bit code - the 32bit entry code doesn't have page tables to use.
This is the straight forward implementation to make it work. Other approaches could be pursued.
checkpatch.pl gives an error: "ERROR: Macros with multiple statements should be enclosed in a do - while loop" about the moved PMDS macro. But PMDS is an assembler macro, so its not applicable. There are some false positive warnings "WARNING: space prohibited between function name and open parenthesis '('" about the macro, too.
Jason Andryuk (5): xen: sync elfnote.h from xen tree x86/pvh: Make PVH entrypoint PIC for x86-64 x86/pvh: Set phys_base when calling xen_prepare_pvh() x86/kernel: Move page table macros to new header x86/pvh: Add 64bit relocation page tables
arch/x86/kernel/head_64.S | 22 +--- arch/x86/kernel/pgtable_64_helpers.h | 28 +++++ arch/x86/platform/pvh/head.S | 157 +++++++++++++++++++++++++-- include/xen/interface/elfnote.h | 93 +++++++++++++++- 4 files changed, 265 insertions(+), 35 deletions(-) create mode 100644 arch/x86/kernel/pgtable_64_helpers.h
-- 2.44.0
| ![\](/images/icornerr.gif) |