arm64: ptr auth: Move per-thread keys from thread_info to thread_struct
authorWill Deacon <will.deacon@arm.com>
Thu, 13 Dec 2018 13:14:06 +0000 (13:14 +0000)
committerWill Deacon <will.deacon@arm.com>
Thu, 13 Dec 2018 16:42:47 +0000 (16:42 +0000)
We don't need to get at the per-thread keys from assembly at all, so
they can live alongside the rest of the per-thread register state in
thread_struct instead of thread_info.

This will also allow straighforward whitelisting of the keys for
hardened usercopy should we expose them via a ptrace request later on.

Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/include/asm/pointer_auth.h
arch/arm64/include/asm/processor.h
arch/arm64/include/asm/thread_info.h
arch/arm64/kernel/pointer_auth.c

index 80eb03afd6771c6a863711df5f8de3dbd6c98378..15d49515efdd767a37b5e2b768e6f91d3ae9c1b3 100644 (file)
@@ -80,12 +80,12 @@ static inline unsigned long ptrauth_strip_insn_pac(unsigned long ptr)
 #define ptrauth_thread_init_user(tsk)                                  \
 do {                                                                   \
        struct task_struct *__ptiu_tsk = (tsk);                         \
-       ptrauth_keys_init(&__ptiu_tsk->thread_info.keys_user);          \
-       ptrauth_keys_switch(&__ptiu_tsk->thread_info.keys_user);        \
+       ptrauth_keys_init(&__ptiu_tsk->thread.keys_user);               \
+       ptrauth_keys_switch(&__ptiu_tsk->thread.keys_user);             \
 } while (0)
 
 #define ptrauth_thread_switch(tsk)     \
-       ptrauth_keys_switch(&(tsk)->thread_info.keys_user)
+       ptrauth_keys_switch(&(tsk)->thread.keys_user)
 
 #else /* CONFIG_ARM64_PTR_AUTH */
 #define ptrauth_prctl_reset_keys(tsk, arg)     (-EINVAL)
index 142c708cb429eed6c9f2ba7d6d7e83a0289595d2..f1a7ab18faf359f4a2b3b36805eb7852519cd3c0 100644 (file)
@@ -147,6 +147,9 @@ struct thread_struct {
        unsigned long           fault_address;  /* fault info */
        unsigned long           fault_code;     /* ESR_EL1 value */
        struct debug_info       debug;          /* debugging */
+#ifdef CONFIG_ARM64_PTR_AUTH
+       struct ptrauth_keys     keys_user;
+#endif
 };
 
 static inline void arch_thread_struct_whitelist(unsigned long *offset,
index f8f66ad9dd8fde6fad2b2987263812ea3e7ec9e5..bbca68b54732d155efd25ffcefbcf8aa89783155 100644 (file)
@@ -28,7 +28,6 @@
 struct task_struct;
 
 #include <asm/memory.h>
-#include <asm/pointer_auth.h>
 #include <asm/stack_pointer.h>
 #include <asm/types.h>
 
@@ -55,9 +54,6 @@ struct thread_info {
 #endif
                } preempt;
        };
-#ifdef CONFIG_ARM64_PTR_AUTH
-       struct ptrauth_keys     keys_user;
-#endif
 };
 
 #define thread_saved_pc(tsk)   \
index b9f6f5f3409a5d8bc21f945288306ccdc74084c2..c507b584259d099fb15e712bd7f7e617eb693324 100644 (file)
@@ -9,7 +9,7 @@
 
 int ptrauth_prctl_reset_keys(struct task_struct *tsk, unsigned long arg)
 {
-       struct ptrauth_keys *keys = &tsk->thread_info.keys_user;
+       struct ptrauth_keys *keys = &tsk->thread.keys_user;
        unsigned long addr_key_mask = PR_PAC_APIAKEY | PR_PAC_APIBKEY |
                                      PR_PAC_APDAKEY | PR_PAC_APDBKEY;
        unsigned long key_mask = addr_key_mask | PR_PAC_APGAKEY;