arm64: Defer enabling pointer authentication on boot core
authorSrinivas Ramana <sramana@codeaurora.org>
Mon, 8 Feb 2021 09:57:30 +0000 (09:57 +0000)
committerWill Deacon <will@kernel.org>
Tue, 9 Feb 2021 13:50:57 +0000 (13:50 +0000)
Defer enabling pointer authentication on boot core until
after its required to be enabled by cpufeature framework.
This will help in controlling the feature dynamically
with a boot parameter.

Signed-off-by: Ajay Patil <pajay@qti.qualcomm.com>
Signed-off-by: Prasad Sodagudi <psodagud@codeaurora.org>
Signed-off-by: Srinivas Ramana <sramana@codeaurora.org>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/1610152163-16554-2-git-send-email-sramana@codeaurora.org
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: David Brazdil <dbrazdil@google.com>
Link: https://lore.kernel.org/r/20210208095732.3267263-22-maz@kernel.org
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/include/asm/pointer_auth.h
arch/arm64/include/asm/stackprotector.h
arch/arm64/kernel/head.S

index c6b4f0603024332948677b9ec9606d201ac32b28..b112a11e93024f4cff245b294fdf48637cd01f6d 100644 (file)
@@ -76,6 +76,15 @@ static inline unsigned long ptrauth_strip_insn_pac(unsigned long ptr)
        return ptrauth_clear_pac(ptr);
 }
 
+static __always_inline void ptrauth_enable(void)
+{
+       if (!system_supports_address_auth())
+               return;
+       sysreg_clear_set(sctlr_el1, 0, (SCTLR_ELx_ENIA | SCTLR_ELx_ENIB |
+                                       SCTLR_ELx_ENDA | SCTLR_ELx_ENDB));
+       isb();
+}
+
 #define ptrauth_thread_init_user(tsk)                                  \
        ptrauth_keys_init_user(&(tsk)->thread.keys_user)
 #define ptrauth_thread_init_kernel(tsk)                                        \
@@ -84,6 +93,7 @@ static inline unsigned long ptrauth_strip_insn_pac(unsigned long ptr)
        ptrauth_keys_switch_kernel(&(tsk)->thread.keys_kernel)
 
 #else /* CONFIG_ARM64_PTR_AUTH */
+#define ptrauth_enable()
 #define ptrauth_prctl_reset_keys(tsk, arg)     (-EINVAL)
 #define ptrauth_strip_insn_pac(lr)     (lr)
 #define ptrauth_thread_init_user(tsk)
index 7263e0bac680789cfa244802a2c72fd24c0a3fa3..33f1bb4531509ceb6665d98488892f6da30ddac6 100644 (file)
@@ -41,6 +41,7 @@ static __always_inline void boot_init_stack_canary(void)
 #endif
        ptrauth_thread_init_kernel(current);
        ptrauth_thread_switch_kernel(current);
+       ptrauth_enable();
 }
 
 #endif /* _ASM_STACKPROTECTOR_H */
index e7f12bf497308a3d5874b4d462e74b2a097c9802..1e30b5550d2a76696a00dfeddedaeb4b32769f6a 100644 (file)
@@ -404,10 +404,6 @@ SYM_FUNC_START_LOCAL(__primary_switched)
        adr_l   x5, init_task
        msr     sp_el0, x5                      // Save thread_info
 
-#ifdef CONFIG_ARM64_PTR_AUTH
-       __ptrauth_keys_init_cpu x5, x6, x7, x8
-#endif
-
        adr_l   x8, vectors                     // load VBAR_EL1 with virtual
        msr     vbar_el1, x8                    // vector table address
        isb