TF-A: Add support for ARMv8.3-PAuth in BL1 SMC calls and BL2U
[project/bcm63xx/atf.git] / lib / extensions / pauth / pauth_helpers.S
index c6808de5b716f50fd471c02ad51bba2e85f3a049..d483c7df787c2cda28004c69d064497253ace930 100644 (file)
@@ -13,6 +13,7 @@
        .global pauth_init_enable_el3
        .global pauth_disable_el3
        .globl  pauth_load_bl31_apiakey
+       .globl  pauth_load_bl1_apiakey_enable
 
 /* -------------------------------------------------------------
  * Program APIAKey_EL1 and enable pointer authentication in EL1
@@ -97,9 +98,9 @@ func pauth_disable_el3
 endfunc pauth_disable_el3
 
 /* -------------------------------------------------------------
- * The following function strictly follows the AArch64 PCS
+ * The following functions strictly follow the AArch64 PCS
  * to use x9-x17 (temporary caller-saved registers) to load
- * the APIAKey_EL1 used by the firmware.
+ * the APIAKey_EL1 and enable pointer authentication.
  * -------------------------------------------------------------
  */
 func pauth_load_bl31_apiakey
@@ -115,3 +116,26 @@ func pauth_load_bl31_apiakey
        isb
        ret
 endfunc pauth_load_bl31_apiakey
+
+func pauth_load_bl1_apiakey_enable
+       /* Load instruction key A used by the Trusted Firmware */
+       adrp    x9, bl1_apiakey
+       add     x9, x9, :lo12:bl1_apiakey
+       ldp     x10, x11, [x9]
+
+       /* Program instruction key A */
+       msr     APIAKeyLo_EL1, x10
+       msr     APIAKeyHi_EL1, x11
+
+       /* Enable pointer authentication */
+       mrs     x9, sctlr_el3
+       orr     x9, x9, #SCTLR_EnIA_BIT
+
+#if ENABLE_BTI
+        /* Enable PAC branch type compatibility */
+       bic     x9, x9, #SCTLR_BT_BIT
+#endif
+       msr     sctlr_el3, x9
+       isb
+       ret
+endfunc pauth_load_bl1_apiakey_enable