• Palmer Dabbelt's avatar
    Merge patch series "riscv: kexec: cleanup and fixups" · 71e11d06
    Palmer Dabbelt authored
    Song Shuai <songshuaishuai@tinylab.org> says:
    
    This series contains a cleanup for riscv_kexec_relocate() and two fixups
    for KEXEC_FILE and had passed the basic kexec test in my 64bit Qemu-virt.
    
    You can use this kexec-tools[3] to test the kexec-file-syscall and these patches.
    
    riscv: kexec: Cleanup riscv_kexec_relocate (patch1)
    ==================================================
    
    For readability and simplicity, cleanup the riscv_kexec_relocate code:
    
     - Re-sort the first 4 `mv` instructions against `riscv_kexec_method()`
     - Eliminate registers for debugging (s9,s10,s11) and storing const-value (s5,s6)
     - Replace `jalr` with `jr` for no-link jump
    
    riscv: kexec: Align the kexeced kernel entry (patch2)
    ==================================================
    
    The current riscv boot protocol requires 2MB alignment for RV64
    and 4MB alignment for RV32.
    
    In KEXEC_FILE path, the elf_find_pbase() function should align
    the kexeced kernel entry according to the requirement, otherwise
    the kexeced kernel would silently BUG at the setup_vm().
    
    riscv: kexec: Remove -fPIE for PURGATORY_CFLAGS (patch3)
    ==================================================
    
    With CONFIG_RELOCATABLE enabled, KBUILD_CFLAGS had a -fPIE option
    and then the purgatory/string.o was built to reference _ctype symbol
    via R_RISCV_GOT_HI20 relocations which can't be handled by purgatory.
    
    As a consequence, the kernel failed kexec_load_file() with:
    
    [  880.386562] kexec_image: The entry point of kernel at 0x80200000
    [  880.388650] kexec_image: Unknown rela relocation: 20
    [  880.389173] kexec_image: Error loading purgatory ret=-8
    
    So remove the -fPIE option for PURGATORY_CFLAGS to generate
    R_RISCV_PCREL_HI20 relocations type making puragtory work as it was.
    
     arch/riscv/kernel/elf_kexec.c      |  8 ++++-
     arch/riscv/kernel/kexec_relocate.S | 52 +++++++++++++-----------------
     arch/riscv/purgatory/Makefile      |  4 +++
     3 files changed, 34 insertions(+), 30 deletions(-)
    
    * b4-shazam-merge:
      riscv: kexec: Remove -fPIE for PURGATORY_CFLAGS
      riscv: kexec: Align the kexeced kernel entry
      riscv: kexec: Cleanup riscv_kexec_relocate
    
    Link: https://lore.kernel.org/r/20230907103304.590739-1-songshuaishuai@tinylab.orgSigned-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
    71e11d06
Makefile 3.42 KB