Message ID | 20250326051445.55131-2-ziyao@disroot.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | riscv/kexec_file: Handle R_RISCV_64 in purgatory relocator | expand |
Context | Check | Description |
---|---|---|
bjorn/pre-ci_am | success | Success |
bjorn/build-rv32-defconfig | success | build-rv32-defconfig |
bjorn/build-rv64-clang-allmodconfig | success | build-rv64-clang-allmodconfig |
bjorn/build-rv64-gcc-allmodconfig | success | build-rv64-gcc-allmodconfig |
bjorn/build-rv64-nommu-k210-defconfig | success | build-rv64-nommu-k210-defconfig |
bjorn/build-rv64-nommu-k210-virt | success | build-rv64-nommu-k210-virt |
bjorn/checkpatch | success | checkpatch |
bjorn/dtb-warn-rv64 | success | dtb-warn-rv64 |
bjorn/header-inline | success | header-inline |
bjorn/kdoc | success | kdoc |
bjorn/module-param | success | module-param |
bjorn/verify-fixes | success | verify-fixes |
bjorn/verify-signedoff | success | verify-signedoff |
Yao Zi <ziyao@disroot.org> writes: > Commit 58ff537109ac ("riscv: Omit optimized string routines when > using KASAN") introduced calls to EXPORT_SYMBOL() in assembly string > routines, which result in R_RISCV_64 relocations against > .export_symbol section. As these rountines are reused by RISC-V > purgatory and our relocator doesn't recognize these relocations, this > fails kexec-file-load with dmesg like > > [ 11.344251] kexec_image: Unknown rela relocation: 2 > [ 11.345972] kexec_image: Error loading purgatory ret=-8 > > Let's support R_RISCV_64 relocation to fix kexec on 64-bit RISC-V. > 32-bit variant isn't covered since KEXEC_FILE and KEXEC_PURGATORY isn't > available. Hi! This patch does fix the vmlinux loading for kexec-file -- very nice! However, I haven't been able to get kexec to successfully boot a kernel from qemu, i.e.: kexec -s -l /path/to/vmlinux # fixed w/ your patch kexec -e # hangs after "Bye..." Same when I try vanilla kexec (kexec -c -l /path/to/vmlinux). kexec with an Image works for me in qemu. Before I start to bisect too much; What config/qemu did you use to test this? Thanks, Björn
Björn Töpel <bjorn@kernel.org> writes: > Yao Zi <ziyao@disroot.org> writes: > >> Commit 58ff537109ac ("riscv: Omit optimized string routines when >> using KASAN") introduced calls to EXPORT_SYMBOL() in assembly string >> routines, which result in R_RISCV_64 relocations against >> .export_symbol section. As these rountines are reused by RISC-V >> purgatory and our relocator doesn't recognize these relocations, this >> fails kexec-file-load with dmesg like >> >> [ 11.344251] kexec_image: Unknown rela relocation: 2 >> [ 11.345972] kexec_image: Error loading purgatory ret=-8 >> >> Let's support R_RISCV_64 relocation to fix kexec on 64-bit RISC-V. >> 32-bit variant isn't covered since KEXEC_FILE and KEXEC_PURGATORY isn't >> available. > > Hi! > > This patch does fix the vmlinux loading for kexec-file -- very nice! > However, I haven't been able to get kexec to successfully boot a kernel > from qemu, i.e.: > > kexec -s -l /path/to/vmlinux # fixed w/ your patch > kexec -e # hangs after "Bye..." > > Same when I try vanilla kexec (kexec -c -l /path/to/vmlinux). kexec with > an Image works for me in qemu. > > Before I start to bisect too much; What config/qemu did you use to test > this? Nevermind! Got it to work; Sorry for the noise. Tested-by: Björn Töpel <bjorn@rivosinc.com> Reviewed-by: Björn Töpel <bjorn@rivosinc.com>
diff --git a/arch/riscv/kernel/elf_kexec.c b/arch/riscv/kernel/elf_kexec.c index 3c37661801f9..e783a72d051f 100644 --- a/arch/riscv/kernel/elf_kexec.c +++ b/arch/riscv/kernel/elf_kexec.c @@ -468,6 +468,9 @@ int arch_kexec_apply_relocations_add(struct purgatory_info *pi, case R_RISCV_ALIGN: case R_RISCV_RELAX: break; + case R_RISCV_64: + *(u64 *)loc = val; + break; default: pr_err("Unknown rela relocation: %d\n", r_type); return -ENOEXEC;
Commit 58ff537109ac ("riscv: Omit optimized string routines when using KASAN") introduced calls to EXPORT_SYMBOL() in assembly string routines, which result in R_RISCV_64 relocations against .export_symbol section. As these rountines are reused by RISC-V purgatory and our relocator doesn't recognize these relocations, this fails kexec-file-load with dmesg like [ 11.344251] kexec_image: Unknown rela relocation: 2 [ 11.345972] kexec_image: Error loading purgatory ret=-8 Let's support R_RISCV_64 relocation to fix kexec on 64-bit RISC-V. 32-bit variant isn't covered since KEXEC_FILE and KEXEC_PURGATORY isn't available. Fixes: 58ff537109ac ("riscv: Omit optimized string routines when using KASAN") Signed-off-by: Yao Zi <ziyao@disroot.org> --- I noticed RISC-V support hasn't been merged into kexec-tools, so this patch is tested with this dowmstream branch[1]. Thanks for your time and review. [1]: https://github.com/ziyao233/kexec-tools/tree/rv-Image arch/riscv/kernel/elf_kexec.c | 3 +++ 1 file changed, 3 insertions(+)