Message ID | 20240925150059.3955569-31-ardb+git@google.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | x86: Rely on toolchain for relocatable code | expand |
On 2024-09-25 11:01, Ard Biesheuvel wrote: > From: Ard Biesheuvel <ardb@kernel.org> > > Calling C code via a different mapping than it was linked at is > problematic, because the compiler assumes that RIP-relative and absolute > symbol references are interchangeable. GCC in particular may use > RIP-relative per-CPU variable references even when not using -fpic. > > So call xen_prepare_pvh() via its kernel virtual mapping on x86_64, so > that those RIP-relative references produce the correct values. This > matches the pre-existing behavior for i386, which also invokes > xen_prepare_pvh() via the kernel virtual mapping before invoking > startup_32 with paging disabled again. > > Fixes: 7243b93345f7 ("xen/pvh: Bootstrap PVH guest") > Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Tested-by: Jason Andryuk <jason.andryuk@amd.com> Reviewed-by: Jason Andryuk <jason.andryuk@amd.com> I found that before this change xen_prepare_pvh() would call through some pv_ops function pointers into the kernel virtual mapping. Regards, Jason
diff --git a/arch/x86/platform/pvh/head.S b/arch/x86/platform/pvh/head.S index f7235ef87bc3..a308b79a887c 100644 --- a/arch/x86/platform/pvh/head.S +++ b/arch/x86/platform/pvh/head.S @@ -101,7 +101,11 @@ SYM_CODE_START_LOCAL(pvh_start_xen) xor %edx, %edx wrmsr - call xen_prepare_pvh + /* Call xen_prepare_pvh() via the kernel virtual mapping */ + leaq xen_prepare_pvh(%rip), %rax + addq $__START_KERNEL_map, %rax + ANNOTATE_RETPOLINE_SAFE + call *%rax /* startup_64 expects boot_params in %rsi. */ mov $_pa(pvh_bootparams), %rsi