Re: [PATCH] riscv: Don't use va_pa_offset on kdump

Alexandre Ghiti
2021-10-06T11:13:56Z

On Sat, Oct 2, 2021 at 2:23 PM Nick Kossifidis <mick@ics.forth.gr> wrote:
>
> 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.
>
> Signed-off-by: Nick Kossifidis <mick@ics.forth.gr>
> ---
> arch/riscv/kernel/kexec_relocate.S | 15 +++++----------
> 1 file changed, 5 insertions(+), 10 deletions(-)
>
> diff --git a/arch/riscv/kernel/kexec_relocate.S b/arch/riscv/kernel/kexec_relocate.S
> index a80b52a74..e2f34196e 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,6 +204,11 @@ SYM_CODE_START(riscv_kexec_norelocate)
> csrw CSR_SCAUSE, zero
> csrw CSR_SSCRATCH, zero
>
> + /* Switch to physical addressing */
> + csrw CSR_STVEC, a2
> + csrw CSR_SATP, zero
> +
> + /* This will trigger a jump to CSR_STVEC anyway */
> jalr zero, a2, 0

The last jump to a2 can be removed since the fault will be triggered
before even reaching this instruction.

> SYM_CODE_END(riscv_kexec_norelocate)
>
> --
> 2.32.0
>
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv

This patch fixes a regression introduced when moving the kernel to the
end of the address space, so we should add:
Fixes: 2bfc6cd81bd1 ("riscv: Move kernel mapping outside of linear mapping")

And it should be backported to 5.13 and 5.14. It seems that the
following tags should be enough:

Cc: <stable@vger.kernel.org> # 5.13
Cc: <stable@vger.kernel.org> # 5.14

And finally, you can add:

Reviewed-by: Alexandre Ghiti <alex@ghiti.fr>

Thanks,

Alex