SCTLR2_EL1 register is optional starting from ARMv8.8/ARMv9.3,
and becomes mandatory from ARMv8.9/ARMv9.4
and serveral architectural feature are controled by bits in
these registers.
Before, launching new kernel via kexec, initialise SCTLR2_EL1 explicitly.
Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
---
arch/arm64/kernel/cpu-reset.S | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/arch/arm64/kernel/cpu-reset.S b/arch/arm64/kernel/cpu-reset.S
index c87445dde674..123564af345b 100644
--- a/arch/arm64/kernel/cpu-reset.S
+++ b/arch/arm64/kernel/cpu-reset.S
@@ -37,6 +37,12 @@ SYM_TYPED_FUNC_START(cpu_soft_restart)
* regime if HCR_EL2.E2H == 1
*/
msr sctlr_el1, x12
+
+alternative_if ARM64_HAS_SCTLR2
+ mov_q x12, INIT_SCTLR2_EL1
+ msr_s SYS_SCTLR2_EL1, x12
+alternative_else_nop_endif
+
isb
cbz x0, 1f // el2_switch?
--
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
Hi, On Wed, Aug 13, 2025 at 01:01:17PM +0100, Yeoreum Yun wrote: > SCTLR2_EL1 register is optional starting from ARMv8.8/ARMv9.3, > and becomes mandatory from ARMv8.9/ARMv9.4 > and serveral architectural feature are controled by bits in > these registers. > > Before, launching new kernel via kexec, initialise SCTLR2_EL1 explicitly. > > Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> > --- > arch/arm64/kernel/cpu-reset.S | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/arch/arm64/kernel/cpu-reset.S b/arch/arm64/kernel/cpu-reset.S > index c87445dde674..123564af345b 100644 > --- a/arch/arm64/kernel/cpu-reset.S > +++ b/arch/arm64/kernel/cpu-reset.S > @@ -37,6 +37,12 @@ SYM_TYPED_FUNC_START(cpu_soft_restart) > * regime if HCR_EL2.E2H == 1 > */ > msr sctlr_el1, x12 > + > +alternative_if ARM64_HAS_SCTLR2 > + mov_q x12, INIT_SCTLR2_EL1 > + msr_s SYS_SCTLR2_EL1, x12 > +alternative_else_nop_endif > + It would be better to do this based on the ID regs. Although the previous kernel _shouldn't_ have used SCTLR2 if the capability ARM64_HAS_SCTLR2 did not get enabled, it would be better to enforce a clean state here for the new kernel. If so, maybe one of the macros that you already defined can be used here? (But it's also fine to open-code it.) > isb > > cbz x0, 1f // el2_switch? [...] In the case where the el2_switch argument in non-zero, don't we also need to do something to reinitialise SCTLR2_EL2 after switching back to EL2, in the HVC_SOFT_RESTART handler? Maybe I missed something. Cheers ---Dave
Hi Dave, > Hi, > > On Wed, Aug 13, 2025 at 01:01:17PM +0100, Yeoreum Yun wrote: > > SCTLR2_EL1 register is optional starting from ARMv8.8/ARMv9.3, > > and becomes mandatory from ARMv8.9/ARMv9.4 > > and serveral architectural feature are controled by bits in > > these registers. > > > > Before, launching new kernel via kexec, initialise SCTLR2_EL1 explicitly. > > > > Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> > > --- > > arch/arm64/kernel/cpu-reset.S | 6 ++++++ > > 1 file changed, 6 insertions(+) > > > > diff --git a/arch/arm64/kernel/cpu-reset.S b/arch/arm64/kernel/cpu-reset.S > > index c87445dde674..123564af345b 100644 > > --- a/arch/arm64/kernel/cpu-reset.S > > +++ b/arch/arm64/kernel/cpu-reset.S > > @@ -37,6 +37,12 @@ SYM_TYPED_FUNC_START(cpu_soft_restart) > > * regime if HCR_EL2.E2H == 1 > > */ > > msr sctlr_el1, x12 > > + > > +alternative_if ARM64_HAS_SCTLR2 > > + mov_q x12, INIT_SCTLR2_EL1 > > + msr_s SYS_SCTLR2_EL1, x12 > > +alternative_else_nop_endif > > + > > It would be better to do this based on the ID regs. > > Although the previous kernel _shouldn't_ have used SCTLR2 if the > capability ARM64_HAS_SCTLR2 did not get enabled, it would be better to > enforce a clean state here for the new kernel. > > If so, maybe one of the macros that you already defined can be used > here? (But it's also fine to open-code it.) Ah got it. I'll change as your suggestion Thanks! [...] -- Sincerely, Yeoreum Yun
Hi Dave, > On Wed, Aug 13, 2025 at 01:01:17PM +0100, Yeoreum Yun wrote: > > SCTLR2_EL1 register is optional starting from ARMv8.8/ARMv9.3, > > and becomes mandatory from ARMv8.9/ARMv9.4 > > and serveral architectural feature are controled by bits in > > these registers. > > > > Before, launching new kernel via kexec, initialise SCTLR2_EL1 explicitly. > > > > Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> > > --- > > arch/arm64/kernel/cpu-reset.S | 6 ++++++ > > 1 file changed, 6 insertions(+) > > > > diff --git a/arch/arm64/kernel/cpu-reset.S b/arch/arm64/kernel/cpu-reset.S > > index c87445dde674..123564af345b 100644 > > --- a/arch/arm64/kernel/cpu-reset.S > > +++ b/arch/arm64/kernel/cpu-reset.S > > @@ -37,6 +37,12 @@ SYM_TYPED_FUNC_START(cpu_soft_restart) > > * regime if HCR_EL2.E2H == 1 > > */ > > msr sctlr_el1, x12 > > + > > +alternative_if ARM64_HAS_SCTLR2 > > + mov_q x12, INIT_SCTLR2_EL1 > > + msr_s SYS_SCTLR2_EL1, x12 > > +alternative_else_nop_endif > > + > > It would be better to do this based on the ID regs. > > Although the previous kernel _shouldn't_ have used SCTLR2 if the > capability ARM64_HAS_SCTLR2 did not get enabled, it would be better to > enforce a clean state here for the new kernel. > > If so, maybe one of the macros that you already defined can be used > here? (But it's also fine to open-code it.) But cpu_soft_restart() can be called before capability is enabled? I think this function is called after "capability" setup, Was it good to use alternative than check the ID register? > > > isb > > > > cbz x0, 1f // el2_switch? > > [...] > > In the case where the el2_switch argument in non-zero, don't we also > need to do something to reinitialise SCTLR2_EL2 after switching back > to EL2, in the HVC_SOFT_RESTART handler? > > Maybe I missed something. No. I'm missing to init in NVHE's HVC_SOFT_RESTART handler to clear SCTLR2_EL2. Thanks! > > Cheers > ---Dave -- Sincerely, Yeoreum Yun
Hi, On Wed, Aug 20, 2025 at 06:32:34PM +0100, Yeoreum Yun wrote: > Hi Dave, > > > On Wed, Aug 13, 2025 at 01:01:17PM +0100, Yeoreum Yun wrote: > > > SCTLR2_EL1 register is optional starting from ARMv8.8/ARMv9.3, > > > and becomes mandatory from ARMv8.9/ARMv9.4 > > > and serveral architectural feature are controled by bits in > > > these registers. > > > > > > Before, launching new kernel via kexec, initialise SCTLR2_EL1 explicitly. > > > > > > Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> > > > --- > > > arch/arm64/kernel/cpu-reset.S | 6 ++++++ > > > 1 file changed, 6 insertions(+) > > > > > > diff --git a/arch/arm64/kernel/cpu-reset.S b/arch/arm64/kernel/cpu-reset.S > > > index c87445dde674..123564af345b 100644 > > > --- a/arch/arm64/kernel/cpu-reset.S > > > +++ b/arch/arm64/kernel/cpu-reset.S > > > @@ -37,6 +37,12 @@ SYM_TYPED_FUNC_START(cpu_soft_restart) > > > * regime if HCR_EL2.E2H == 1 > > > */ > > > msr sctlr_el1, x12 > > > + > > > +alternative_if ARM64_HAS_SCTLR2 > > > + mov_q x12, INIT_SCTLR2_EL1 > > > + msr_s SYS_SCTLR2_EL1, x12 > > > +alternative_else_nop_endif > > > + > > > > It would be better to do this based on the ID regs. > > > > Although the previous kernel _shouldn't_ have used SCTLR2 if the > > capability ARM64_HAS_SCTLR2 did not get enabled, it would be better to > > enforce a clean state here for the new kernel. > > > > If so, maybe one of the macros that you already defined can be used > > here? (But it's also fine to open-code it.) > > But cpu_soft_restart() can be called before capability is enabled? > I think this function is called after "capability" setup, > Was it good to use alternative than check the ID register? What I meant is that we should reset SCTLR2_EL1 here even if the ARM64_HAS_SCTLR2 capability is not set. The cpu_soft_restart() code has responsibilities similar to those of a bootloader. We want to put the CPU into a known state, irrespective of how the current kernel has been using the CPU. For one thing, we come through this path when booting a crash kernel if the current kernel panicked. So we should avoid making too many assumptions about anything being in a sensible state here. (Your rewrite of this in v4 looks fine.) > > > isb > > > > > > cbz x0, 1f // el2_switch? > > > > [...] > > > > In the case where the el2_switch argument in non-zero, don't we also > > need to do something to reinitialise SCTLR2_EL2 after switching back > > to EL2, in the HVC_SOFT_RESTART handler? > > > > Maybe I missed something. > > No. I'm missing to init in NVHE's HVC_SOFT_RESTART handler to clear SCTLR2_EL2. > > Thanks! I'll take a look at this in v4. Cheers ---Dave
© 2016 - 2025 Red Hat, Inc.