Skip to content

Commit e8fbc0d

Browse files
ardbiesheuveljgross1
authored andcommitted
x86/pvh: Call C code via the kernel virtual mapping
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: 7243b93 ("xen/pvh: Bootstrap PVH guest") Tested-by: Jason Andryuk <jason.andryuk@amd.com> Reviewed-by: Jason Andryuk <jason.andryuk@amd.com> Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Message-ID: <20241009160438.3884381-8-ardb+git@google.com> Signed-off-by: Juergen Gross <jgross@suse.com>
1 parent 8198375 commit e8fbc0d

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

arch/x86/platform/pvh/head.S

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,14 @@ SYM_CODE_START_LOCAL(pvh_start_xen)
172172
movq %rbp, %rbx
173173
subq $_pa(pvh_start_xen), %rbx
174174
movq %rbx, phys_base(%rip)
175-
call xen_prepare_pvh
175+
176+
/* Call xen_prepare_pvh() via the kernel virtual mapping */
177+
leaq xen_prepare_pvh(%rip), %rax
178+
subq phys_base(%rip), %rax
179+
addq $__START_KERNEL_map, %rax
180+
ANNOTATE_RETPOLINE_SAFE
181+
call *%rax
182+
176183
/*
177184
* Clear phys_base. __startup_64 will *add* to its value,
178185
* so reset to 0.

0 commit comments

Comments
 (0)