On Fri, 2025-03-14 at 10:52 -0700, Josh Poimboeuf wrote: > > IIRC, the reasons were the patched alternative, and also you wanted to > disassemble (but note that's still possible with gdb). It's meaningful output from 'objdump -S' that I miss. But OK. > Here was a patch to make it work: > > https://lore.kernel.org/20241218212326.44qff3i5n6cxuu5d@jpoimboe I've reworked that and the CR4 filtering, and now it doesn't like me using SYM_TYPED_FUNC_START() to add the CFI information for the relocate_kernel() function. LD vmlinux.o vmlinux.o: warning: objtool: bad call to elf_init_reloc_text_sym() for data symbol .data..relocate_kernel ... SORTTAB vmlinux incomplete ORC unwind tables in file: vmlinux Failed to sort kernel tables This happens when I build with (clang and) CONFIG_CFI_CLANG, with and updated version of your patch above, and this on top of it. This is at https://git.infradead.org/users/dwmw2/linux.git/shortlog/refs/heads/kexec-debug From 0f08a44613764e9b38a1c3332812685b61c99c2e Mon Sep 17 00:00:00 2001 From: David Woodhouse <dwmw@xxxxxxxxxxxx> Date: Mon, 16 Dec 2024 10:26:24 +0000 Subject: [PATCH] x86/kexec: Add CFI type information to relocate_kernel() A previous commit added __nocfi to machine_kexec() because it makes an indirect call to relocate_kernel() which lacked CFI type information, and caused the system to crash. Use SYM_TYPED_FUNC_START() to ensure that the type information is present, and remove the __nocfi tag. Signed-off-by: David Woodhouse <dwmw@xxxxxxxxxxxx> --- arch/x86/kernel/machine_kexec_64.c | 2 +- arch/x86/kernel/relocate_kernel_64.S | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c index 016862d2b544..e1f5fc858aee 100644 --- a/arch/x86/kernel/machine_kexec_64.c +++ b/arch/x86/kernel/machine_kexec_64.c @@ -396,7 +396,7 @@ void machine_kexec_cleanup(struct kimage *image) * Do not allocate memory (or fail in any way) in machine_kexec(). * We are past the point of no return, committed to rebooting now. */ -void __nocfi machine_kexec(struct kimage *image) +void machine_kexec(struct kimage *image) { unsigned long reloc_start = (unsigned long)__relocate_kernel_start; relocate_kernel_fn *relocate_kernel_ptr; diff --git a/arch/x86/kernel/relocate_kernel_64.S b/arch/x86/kernel/relocate_kernel_64.S index 814af7fa6318..c859fbe507e8 100644 --- a/arch/x86/kernel/relocate_kernel_64.S +++ b/arch/x86/kernel/relocate_kernel_64.S @@ -5,6 +5,7 @@ */ #include <linux/linkage.h> +#include <linux/cfi_types.h> #include <linux/stringify.h> #include <asm/alternative.h> #include <asm/page_types.h> @@ -68,7 +69,7 @@ SYM_DATA_END(kexec_debug_idt) * opinions about it. */ .code64 -SYM_CODE_START_NOALIGN(relocate_kernel) +SYM_TYPED_FUNC_START(relocate_kernel) /* * %rdi indirection_page * %rsi pa_control_page -- 2.48.1
<<attachment: smime.p7s>>