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@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
+
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
--
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
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@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
Hi Dave, > > 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@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... TBH, I couldn't find the reason why SCTLR2_ELx should be initilized before SCTLR_EL1. I don't think current bits on SCTLR2_ELx doesn't have any effects from SCTLR_EL1 (MMU bit and etc) and vice versa. But as other code, as you mention, it would be better to reorder this initialization. Thanks! [...] -- Sincerely, Yeoreum Yun
© 2016 - 2025 Red Hat, Inc.