Messages in this thread | | | Date | Thu, 25 Apr 2024 14:04:17 +0200 | Subject | [PATCH v2 0/4] x86: Rid .head.text of all abs references | From | Ard Biesheuvel <> |
| |
From: Ard Biesheuvel <ardb@kernel.org>
Questions below!
This series removes the last remaining absolute symbol references from head.text. Doing so is necessary because code in this section may be called from a 1:1 mapping of memory, which deviates from the mapping this code was linked and/or relocated to run at. This is not something that the toolchains support: even PIC/PIE code is still assumed to execute from the same mapping that it was relocated to run from by the startup code or dynamic loader. This means we are basically on our own here, and need to add measures to ensure the code works as expected in this manner.
Given that the startup code needs to create the kernel virtual mapping in the page tables, early references to some kernel virtual addresses are valid even if they cannot be dereferenced yet. To avoid having to make this distinction at build time, patches #3 and #4 replace such valid references with RIP-relative references with an offset applied.
Patches #1 and #2 remove some absolute references from .head.text that don't need to be there in the first place.
Questions: - How can we police this at build time? Could we teach objtool to check for absolute ELF relocations in .head.text, or does this belong in modpost perhaps?
- Checking for absolute symbol references is not a complete solution, as .head.text code could call into other code as well. Do we need rigid checks for that too? Or could we have a soft rule that says you should only call __head code from __head code?
Changes since v1/RFC: - rename va_offset to p2v_offset - take PA of _text in C code directly
Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Kees Cook <keescook@chromium.org> Cc: Brian Gerst <brgerst@gmail.com>
Ard Biesheuvel (4): x86/sev: Avoid WARN()s in early boot code x86/xen/pvh: Move startup code into .ref.text x86/boot/64: Determine VA/PA offset before entering C code x86/boot/64: Avoid intentional absolute symbol references in .head.text
arch/x86/include/asm/setup.h | 2 +- arch/x86/kernel/head64.c | 38 ++++++++++++-------- arch/x86/kernel/head_64.S | 9 ++++- arch/x86/kernel/sev.c | 15 +++----- arch/x86/platform/pvh/head.S | 2 +- 5 files changed, 38 insertions(+), 28 deletions(-)
-- 2.44.0.769.g3c40516874-goog
| |