TF-A: Add support for ARMv8.3-PAuth in BL1 SMC calls and BL2U
authorAlexei Fedorov <Alexei.Fedorov@arm.com>
Tue, 1 Oct 2019 12:58:23 +0000 (13:58 +0100)
committerAlexei Fedorov <Alexei.Fedorov@arm.com>
Thu, 3 Oct 2019 13:43:55 +0000 (14:43 +0100)
This patch adds support for ARMv8.3-PAuth in BL1 SMC calls and
BL2U image for firmware updates by programming APIAKey_EL1 registers
and enabling Pointer Authentication in EL3 and EL1 respectively.

Change-Id: I875d952aba8242caf74fb5f4f2d2af6f0c768c08
Signed-off-by: Alexei Fedorov <Alexei.Fedorov@arm.com>
bl1/aarch64/bl1_exceptions.S
bl1/bl1_main.c
bl2u/aarch64/bl2u_entrypoint.S
lib/extensions/pauth/pauth_helpers.S

index 3e72e39f23033318dd384c22aa92d880bde8ccd3..9bba6eef3f0a8734df3d3fe23d9c8a6b07f15251 100644 (file)
@@ -226,6 +226,15 @@ smc_handler:
         */
        bl      save_gp_pmcr_pauth_regs
 
+#if ENABLE_PAUTH
+       /* -----------------------------------------------------
+        * Load and program stored APIAKey firmware key.
+        * Re-enable pointer authentication in EL3, as it was
+        * disabled before jumping to the next boot image.
+        * -----------------------------------------------------
+        */
+       bl      pauth_load_bl1_apiakey_enable
+#endif
        /* -----------------------------------------------------
         * Populate the parameters for the SMC handler. We
         * already have x0-x4 in place. x5 will point to a
index 2bb85114fd8b36e504c9245140361697d6926485..cd6fe7d5e82556069b30da6460b1a3923e36dbd9 100644 (file)
@@ -31,6 +31,10 @@ DEFINE_SVC_UUID2(bl1_svc_uid,
 
 static void bl1_load_bl2(void);
 
+#if ENABLE_PAUTH
+uint64_t bl1_apiakey[2];
+#endif
+
 /*******************************************************************************
  * Helper utility to calculate the BL2 memory layout taking into consideration
  * the BL1 RW data assuming that it is at the top of the memory layout.
@@ -131,6 +135,12 @@ void bl1_main(void)
        /* Perform platform setup in BL1. */
        bl1_platform_setup();
 
+#if ENABLE_PAUTH
+       /* Store APIAKey_EL1 key */
+       bl1_apiakey[0] = read_apiakeylo_el1();
+       bl1_apiakey[1] = read_apiakeyhi_el1();
+#endif /* ENABLE_PAUTH */
+
        /* Get the image id of next image to load and run. */
        image_id = bl1_plat_get_next_image_id();
 
index 452869ea9a960c2a3c246fcd1aed4e59272539a4..3e37b44f7d43868163e97c1535f5c38c0c1386c7 100644 (file)
@@ -102,6 +102,15 @@ func bl2u_entrypoint
        bl      bl2u_early_platform_setup
        bl      bl2u_plat_arch_setup
 
+#if ENABLE_PAUTH
+       /* ---------------------------------------------
+        * Program APIAKey_EL1
+        * and enable pointer authentication.
+        * ---------------------------------------------
+        */
+       bl      pauth_init_enable_el1
+#endif
+
        /* ---------------------------------------------
         * Jump to bl2u_main function.
         * ---------------------------------------------
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