arch/x86/include/asm/pgtable_64.h | 23 ++++- arch/x86/kernel/head_64.S | 20 ---- arch/x86/platform/pvh/head.S | 161 +++++++++++++++++++++++++++--- include/xen/interface/elfnote.h | 93 ++++++++++++++++- 4 files changed, 259 insertions(+), 38 deletions(-)
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. v2 addresses review feedback. It also replace LOAD_PHYSICAL_ADDR with _pa(pvh_start_xen) in some offset calculations. They happened to be equal in my original builds. When the two values differ, _pa(pvh_start_xen) is the correct one to use. v3: Fix build error for 32bit. Add Juergen's R-b to patch 4. 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 header x86/pvh: Add 64bit relocation page tables arch/x86/include/asm/pgtable_64.h | 23 ++++- arch/x86/kernel/head_64.S | 20 ---- arch/x86/platform/pvh/head.S | 161 +++++++++++++++++++++++++++--- include/xen/interface/elfnote.h | 93 ++++++++++++++++- 4 files changed, 259 insertions(+), 38 deletions(-) base-commit: 7c626ce4bae1ac14f60076d00eafe71af30450ba -- 2.34.1
x86 maintainers, are you going to pick this series up, or should I take it via the Xen tree? Juergen On 23.08.24 21:36, Jason Andryuk wrote: > 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. > > v2 addresses review feedback. It also replace LOAD_PHYSICAL_ADDR with > _pa(pvh_start_xen) in some offset calculations. They happened to be > equal in my original builds. When the two values differ, > _pa(pvh_start_xen) is the correct one to use. > > v3: Fix build error for 32bit. Add Juergen's R-b to patch 4. > > 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 header > x86/pvh: Add 64bit relocation page tables > > arch/x86/include/asm/pgtable_64.h | 23 ++++- > arch/x86/kernel/head_64.S | 20 ---- > arch/x86/platform/pvh/head.S | 161 +++++++++++++++++++++++++++--- > include/xen/interface/elfnote.h | 93 ++++++++++++++++- > 4 files changed, 259 insertions(+), 38 deletions(-) > > > base-commit: 7c626ce4bae1ac14f60076d00eafe71af30450ba
On 16.09.24 10:44, Juergen Gross wrote: > x86 maintainers, > > are you going to pick this series up, or should I take it via the > Xen tree? I take the silence as a "its okay to go via the Xen tree". Juergen
On 9/25/24 02:28, Juergen Gross wrote: > On 16.09.24 10:44, Juergen Gross wrote: >> x86 maintainers, >> >> are you going to pick this series up, or should I take it via the >> Xen tree? > > I take the silence as a "its okay to go via the Xen tree". Or, "most of us were traveling last week and in a bigger email hole than normal". ;) But, yeah, feel free to take this via the Xen tree. I just acked the only one that's not quite Xen-specific.
© 2016 - 2024 Red Hat, Inc.