When the kernel runs at EL1, and yet is booted at EL2,
HCRX_EL2.SCTLR2En must be set to avoid trapping SCTLR2_EL1 accesses
from EL1 to EL2.
Ensure this bit is set at the point of initialising EL2.
Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
Reviewed-by: Marc Zyngier <maz@kernel.org>
---
arch/arm64/include/asm/el2_setup.h | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/include/asm/el2_setup.h b/arch/arm64/include/asm/el2_setup.h
index 46033027510c..d755b4d46d77 100644
--- a/arch/arm64/include/asm/el2_setup.h
+++ b/arch/arm64/include/asm/el2_setup.h
@@ -57,9 +57,15 @@
/* Enable GCS if supported */
mrs_s x1, SYS_ID_AA64PFR1_EL1
ubfx x1, x1, #ID_AA64PFR1_EL1_GCS_SHIFT, #4
- cbz x1, .Lset_hcrx_\@
+ cbz x1, .Lskip_hcrx_GCSEn_\@
orr x0, x0, #HCRX_EL2_GCSEn
+.Lskip_hcrx_GCSEn_\@:
+ mrs_s x1, SYS_ID_AA64MMFR3_EL1
+ ubfx x1, x1, #ID_AA64MMFR3_EL1_SCTLRX_SHIFT, #4
+ cbz x1, .Lset_hcrx_\@
+ orr x0, x0, HCRX_EL2_SCTLR2En
+
.Lset_hcrx_\@:
msr_s SYS_HCRX_EL2, x0
.Lskip_hcrx_\@:
--
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
Hi, On Wed, Aug 13, 2025 at 01:01:14PM +0100, Yeoreum Yun wrote: > When the kernel runs at EL1, and yet is booted at EL2, > HCRX_EL2.SCTLR2En must be set to avoid trapping SCTLR2_EL1 accesses > from EL1 to EL2. > > Ensure this bit is set at the point of initialising EL2. > > Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> > Reviewed-by: Marc Zyngier <maz@kernel.org> > --- > arch/arm64/include/asm/el2_setup.h | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/arch/arm64/include/asm/el2_setup.h b/arch/arm64/include/asm/el2_setup.h > index 46033027510c..d755b4d46d77 100644 > --- a/arch/arm64/include/asm/el2_setup.h > +++ b/arch/arm64/include/asm/el2_setup.h > @@ -57,9 +57,15 @@ > /* Enable GCS if supported */ > mrs_s x1, SYS_ID_AA64PFR1_EL1 > ubfx x1, x1, #ID_AA64PFR1_EL1_GCS_SHIFT, #4 > - cbz x1, .Lset_hcrx_\@ > + cbz x1, .Lskip_hcrx_GCSEn_\@ > orr x0, x0, #HCRX_EL2_GCSEn > > +.Lskip_hcrx_GCSEn_\@: > + mrs_s x1, SYS_ID_AA64MMFR3_EL1 > + ubfx x1, x1, #ID_AA64MMFR3_EL1_SCTLRX_SHIFT, #4 > + cbz x1, .Lset_hcrx_\@ > + orr x0, x0, HCRX_EL2_SCTLR2En Nit: prefix immediate operands with # please -- see usage elsewhere in this file. (This comes from the legacy AArch32 syntax and has never been required by AArch64 assemblers, but it has become a tradition in the Linux arch code...) The only execptions to this rule are macros (mov_q, mrs_s etc. -- frequently they have an underscore in the name; "real" instructions never do.) > + > .Lset_hcrx_\@: Maybe rename this label to .Lskip_hcrx_SCTLR2En_\@, so that people don't have to keep renaming an existing label whenever they add another block here. > msr_s SYS_HCRX_EL2, x0 > .Lskip_hcrx_\@: [...] Cheers ---Dave
Hi Dave, > > When the kernel runs at EL1, and yet is booted at EL2, > > HCRX_EL2.SCTLR2En must be set to avoid trapping SCTLR2_EL1 accesses > > from EL1 to EL2. > > > > Ensure this bit is set at the point of initialising EL2. > > > > Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> > > Reviewed-by: Marc Zyngier <maz@kernel.org> > > --- > > arch/arm64/include/asm/el2_setup.h | 8 +++++++- > > 1 file changed, 7 insertions(+), 1 deletion(-) > > > > diff --git a/arch/arm64/include/asm/el2_setup.h b/arch/arm64/include/asm/el2_setup.h > > index 46033027510c..d755b4d46d77 100644 > > --- a/arch/arm64/include/asm/el2_setup.h > > +++ b/arch/arm64/include/asm/el2_setup.h > > @@ -57,9 +57,15 @@ > > /* Enable GCS if supported */ > > mrs_s x1, SYS_ID_AA64PFR1_EL1 > > ubfx x1, x1, #ID_AA64PFR1_EL1_GCS_SHIFT, #4 > > - cbz x1, .Lset_hcrx_\@ > > + cbz x1, .Lskip_hcrx_GCSEn_\@ > > orr x0, x0, #HCRX_EL2_GCSEn > > > > +.Lskip_hcrx_GCSEn_\@: > > + mrs_s x1, SYS_ID_AA64MMFR3_EL1 > > + ubfx x1, x1, #ID_AA64MMFR3_EL1_SCTLRX_SHIFT, #4 > > + cbz x1, .Lset_hcrx_\@ > > + orr x0, x0, HCRX_EL2_SCTLR2En > > Nit: prefix immediate operands with # please -- see usage elsewhere in > this file. > > (This comes from the legacy AArch32 syntax and has never been required > by AArch64 assemblers, but it has become a tradition in the Linux arch > code...) > > The only execptions to this rule are macros (mov_q, mrs_s etc. -- > frequently they have an underscore in the name; "real" instructions > never do.) Grr.. My fat finger.. Sorry to bother you. I'll fix it and thanks for the great comment :) > > > + > > .Lset_hcrx_\@: > > Maybe rename this label to .Lskip_hcrx_SCTLR2En_\@, so that people > don't have to keep renaming an existing label whenever they add > another block here. Okay. I'll change it. Thanks! -- Sincerely, Yeoreum Yun
© 2016 - 2025 Red Hat, Inc.