Message ID | 20211126180411.187597-1-mick@ics.forth.gr (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/3] riscv: Don't use va_pa_offset on kdump | expand |
Hello Palmer, Any updates on those 3 patches ? Regards, Nick Στις 2021-11-26 20:04, Nick Kossifidis έγραψε: > On kdump instead of using an intermediate step to relocate the kernel, > that lives in a "control buffer" outside the current kernel's mapping, > we jump to the crash kernel directly by calling > riscv_kexec_norelocate(). > The current implementation uses va_pa_offset while switching to > physical > addressing, however since we moved the kernel outside the linear > mapping > this won't work anymore since riscv_kexec_norelocate() is part of the > kernel mapping and we should use kernel_map.va_kernel_pa_offset, and > also > take XIP kernel into account. > > We don't really need to use va_pa_offset on riscv_kexec_norelocate, we > can just set STVEC to the physical address of the new kernel instead > and > let the hart jump to the new kernel on the next instruction after > setting > SATP to zero. This fixes kdump and is also simpler/cleaner. > > I tested this on the latest qemu and HiFive Unmatched and works as > expected. > > v2: I removed the direct jump after setting satp as suggested. > > Fixes: 2bfc6cd81bd1 ("riscv: Move kernel mapping outside of linear > mapping") > > Signed-off-by: Nick Kossifidis <mick@ics.forth.gr> > Reviewed-by: Alexandre Ghiti <alex@ghiti.fr> > Cc: <stable@vger.kernel.org> # 5.13 > Cc: <stable@vger.kernel.org> # 5.14
On Fri, 07 Jan 2022 10:03:59 PST (-0800), mick@ics.forth.gr wrote: > Hello Palmer, > > Any updates on those 3 patches ? Sorry, I hadn't realized these were fixes so they got stuck in the queue0. I do now remember you saying you had some fixes at the RISC-V conference, but I guess that got lost as well. Including something like "fix" or "-fixes" in a subject line always helps, but if I miss stuff IRC's always a good bet as that'll at least make sure I see it when I'm in front of the computer -- there's a lot of people who want things at these conferences. It's too late for fixes, but it looks like things have been broken for a while so these will have to all get backported to stable regardless. This is on for-next. Thanks! > > Regards, > Nick > > Στις 2021-11-26 20:04, Nick Kossifidis έγραψε: >> On kdump instead of using an intermediate step to relocate the kernel, >> that lives in a "control buffer" outside the current kernel's mapping, >> we jump to the crash kernel directly by calling >> riscv_kexec_norelocate(). >> The current implementation uses va_pa_offset while switching to >> physical >> addressing, however since we moved the kernel outside the linear >> mapping >> this won't work anymore since riscv_kexec_norelocate() is part of the >> kernel mapping and we should use kernel_map.va_kernel_pa_offset, and >> also >> take XIP kernel into account. >> >> We don't really need to use va_pa_offset on riscv_kexec_norelocate, we >> can just set STVEC to the physical address of the new kernel instead >> and >> let the hart jump to the new kernel on the next instruction after >> setting >> SATP to zero. This fixes kdump and is also simpler/cleaner. >> >> I tested this on the latest qemu and HiFive Unmatched and works as >> expected. >> >> v2: I removed the direct jump after setting satp as suggested. >> >> Fixes: 2bfc6cd81bd1 ("riscv: Move kernel mapping outside of linear >> mapping") >> >> Signed-off-by: Nick Kossifidis <mick@ics.forth.gr> >> Reviewed-by: Alexandre Ghiti <alex@ghiti.fr> >> Cc: <stable@vger.kernel.org> # 5.13 >> Cc: <stable@vger.kernel.org> # 5.14
diff --git a/arch/riscv/kernel/kexec_relocate.S b/arch/riscv/kernel/kexec_relocate.S index a80b52a74..059c5e216 100644 --- a/arch/riscv/kernel/kexec_relocate.S +++ b/arch/riscv/kernel/kexec_relocate.S @@ -159,25 +159,15 @@ SYM_CODE_START(riscv_kexec_norelocate) * s0: (const) Phys address to jump to * s1: (const) Phys address of the FDT image * s2: (const) The hartid of the current hart - * s3: (const) kernel_map.va_pa_offset, used when switching MMU off */ mv s0, a1 mv s1, a2 mv s2, a3 - mv s3, a4 /* Disable / cleanup interrupts */ csrw CSR_SIE, zero csrw CSR_SIP, zero - /* Switch to physical addressing */ - la s4, 1f - sub s4, s4, s3 - csrw CSR_STVEC, s4 - csrw CSR_SATP, zero - -.align 2 -1: /* Pass the arguments to the next kernel / Cleanup*/ mv a0, s2 mv a1, s1 @@ -214,7 +204,15 @@ SYM_CODE_START(riscv_kexec_norelocate) csrw CSR_SCAUSE, zero csrw CSR_SSCRATCH, zero - jalr zero, a2, 0 + /* + * Switch to physical addressing + * This will also trigger a jump to CSR_STVEC + * which in this case is the address of the new + * kernel. + */ + csrw CSR_STVEC, a2 + csrw CSR_SATP, zero + SYM_CODE_END(riscv_kexec_norelocate) .section ".rodata"