[PATCH v4 4/5] arm64: initialise SCTLR2_EL1 at cpu_soft_restart()
Dave Martin
Dave.Martin at arm.com
Mon Sep 1 08:13:25 PDT 2025
Hi,
On Thu, Aug 21, 2025 at 06:24:07PM +0100, Yeoreum Yun wrote:
> Explicitly initialize the SCTLR2_ELx register before launching
> a new kernel via kexec() to avoid leaving SCTLR2_ELx with an
> arbitrary value when the new kernel runs.
>
> Signed-off-by: Yeoreum Yun <yeoreum.yun at arm.com>
> ---
> arch/arm64/kernel/cpu-reset.S | 4 ++++
> arch/arm64/kvm/hyp/nvhe/hyp-init.S | 3 +++
> 2 files changed, 7 insertions(+)
>
> diff --git a/arch/arm64/kernel/cpu-reset.S b/arch/arm64/kernel/cpu-reset.S
> index c87445dde674..c8888891dc8d 100644
> --- a/arch/arm64/kernel/cpu-reset.S
> +++ b/arch/arm64/kernel/cpu-reset.S
> @@ -37,6 +37,10 @@ SYM_TYPED_FUNC_START(cpu_soft_restart)
> * regime if HCR_EL2.E2H == 1
> */
> msr sctlr_el1, x12
> +
> + mov_q x12, INIT_SCTLR2_EL1
> + set_sctlr2_elx 1, x12, x8
> +
Nit: does it matter whether we reset SCTLR2 before SCTLR?
I can't find a convincing architectural reason why they need to be
reset in a particular order, but it looks a bit strange that the
cpu_soft_restart and __kvm_handle_stub_hvc versions of this reset the
registers in the opposite order...
> isb
>
> cbz x0, 1f // el2_switch?
> diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-init.S b/arch/arm64/kvm/hyp/nvhe/hyp-init.S
> index aada42522e7b..cc569656fe35 100644
> --- a/arch/arm64/kvm/hyp/nvhe/hyp-init.S
> +++ b/arch/arm64/kvm/hyp/nvhe/hyp-init.S
> @@ -255,6 +255,9 @@ SYM_CODE_START(__kvm_handle_stub_hvc)
> mov x0, xzr
> reset:
> /* Reset kvm back to the hyp stub. */
> + mov_q x5, INIT_SCTLR2_EL2
> + set_sctlr2_elx 2, x5, x4
> +
> mov_q x5, INIT_SCTLR_EL2_MMU_OFF
> pre_disable_mmu_workaround
> msr sctlr_el2, x5
Otherwise, I guess this is fine.
Cheers
---Dave
More information about the linux-arm-kernel
mailing list