From: Ard Biesheuvel <ardb+git@google.com>
To: linux-kernel@vger.kernel.org
Cc: Ard Biesheuvel <ardb@kernel.org>,
Jason Andryuk <jason.andryuk@amd.com>,
Juergen Gross <jgross@suse.com>,
Boris Ostrovsky <boris.ostrovsky@oracle.com>,
x86@kernel.org, xen-devel@lists.xenproject.org
Subject: [PATCH 1/5] x86/pvh: Call C code via the kernel virtual mapping
Date: Thu, 26 Sep 2024 12:41:15 +0200 [thread overview]
Message-ID: <20240926104113.80146-8-ardb+git@google.com> (raw)
In-Reply-To: <20240926104113.80146-7-ardb+git@google.com>
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")
Tested-by: Jason Andryuk <jason.andryuk@amd.com>
Reviewed-by: Jason Andryuk <jason.andryuk@amd.com>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
arch/x86/platform/pvh/head.S | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/arch/x86/platform/pvh/head.S b/arch/x86/platform/pvh/head.S
index 64fca49cd88f..98ddd552885a 100644
--- a/arch/x86/platform/pvh/head.S
+++ b/arch/x86/platform/pvh/head.S
@@ -172,7 +172,13 @@ SYM_CODE_START_LOCAL(pvh_start_xen)
movq %rbp, %rbx
subq $_pa(pvh_start_xen), %rbx
movq %rbx, phys_base(%rip)
- 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
+
/*
* Clear phys_base. __startup_64 will *add* to its value,
* so reset to 0.
--
2.46.0.792.g87dc391469-goog
next prev parent reply other threads:[~2024-09-26 10:41 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-26 10:41 [PATCH 0/5] x86/xen: Drop absolute references from startup code Ard Biesheuvel
2024-09-26 10:41 ` Ard Biesheuvel [this message]
2024-09-26 10:55 ` [PATCH 1/5] x86/pvh: Call C code via the kernel virtual mapping Ard Biesheuvel
2024-09-26 20:29 ` Jason Andryuk
2024-09-26 10:41 ` [PATCH 2/5] x86/pvh: Use correct size value in GDT descriptor Ard Biesheuvel
2024-09-26 14:29 ` Andrew Cooper
2024-09-26 20:32 ` Jason Andryuk
2024-09-26 10:41 ` [PATCH 3/5] x86/pvh: Omit needless clearing of phys_base Ard Biesheuvel
2024-09-26 20:35 ` Jason Andryuk
2024-09-26 10:41 ` [PATCH 4/5] x86/xen: Avoid relocatable quantities in Xen ELF notes Ard Biesheuvel
2024-09-27 1:46 ` Jason Andryuk
2024-09-27 5:49 ` Ard Biesheuvel
2024-09-27 7:21 ` Ard Biesheuvel
2024-09-26 10:41 ` [PATCH 5/5] x86/pvh: Avoid absolute symbol references in .head.text Ard Biesheuvel
2024-09-27 22:12 ` Jason Andryuk
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240926104113.80146-8-ardb+git@google.com \
--to=ardb+git@google.com \
--cc=ardb@kernel.org \
--cc=boris.ostrovsky@oracle.com \
--cc=jason.andryuk@amd.com \
--cc=jgross@suse.com \
--cc=linux-kernel@vger.kernel.org \
--cc=x86@kernel.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox