There is a control HCRX_EL2.GCSEn which must be set to allow GCS
features to take effect at lower ELs and also fine grained traps for GCS
usage at EL0 and EL1.  Configure all these to allow GCS usage by EL0 and
EL1.

Reviewed-by: Thiago Jung Bauermann <[email protected]>
Signed-off-by: Mark Brown <[email protected]>
---
 arch/arm64/include/asm/el2_setup.h | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/arch/arm64/include/asm/el2_setup.h 
b/arch/arm64/include/asm/el2_setup.h
index fd87c4b8f984..36aa40c19e85 100644
--- a/arch/arm64/include/asm/el2_setup.h
+++ b/arch/arm64/include/asm/el2_setup.h
@@ -27,6 +27,14 @@
        ubfx    x0, x0, #ID_AA64MMFR1_EL1_HCX_SHIFT, #4
        cbz     x0, .Lskip_hcrx_\@
        mov_q   x0, HCRX_HOST_FLAGS
+
+        /* Enable GCS if supported */
+       mrs_s   x1, SYS_ID_AA64PFR1_EL1
+       ubfx    x1, x1, #ID_AA64PFR1_EL1_GCS_SHIFT, #4
+       cbz     x1, .Lset_hcrx_\@
+       orr     x0, x0, #HCRX_EL2_GCSEn
+
+.Lset_hcrx_\@:
        msr_s   SYS_HCRX_EL2, x0
 .Lskip_hcrx_\@:
 .endm
@@ -191,6 +199,15 @@
        orr     x0, x0, #HFGxTR_EL2_nPIR_EL1
        orr     x0, x0, #HFGxTR_EL2_nPIRE0_EL1
 
+       /* GCS depends on PIE so we don't check it if PIE is absent */
+       mrs_s   x1, SYS_ID_AA64PFR1_EL1
+       ubfx    x1, x1, #ID_AA64PFR1_EL1_GCS_SHIFT, #4
+       cbz     x1, .Lset_fgt_\@
+
+       /* Disable traps of access to GCS registers at EL0 and EL1 */
+       orr     x0, x0, #HFGxTR_EL2_nGCS_EL1_MASK
+       orr     x0, x0, #HFGxTR_EL2_nGCS_EL0_MASK
+
 .Lset_fgt_\@:
        msr_s   SYS_HFGRTR_EL2, x0
        msr_s   SYS_HFGWTR_EL2, x0

-- 
2.39.2


Reply via email to