diff options
author | Mark Rutland <mark.rutland@arm.com> | 2018-12-07 13:39:26 -0500 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2018-12-13 11:42:46 -0500 |
commit | ec6e822d1a22d0eef1d1fa260dff751dba9a4258 (patch) | |
tree | 709322a7fd3dcaa397913e2fbd46f912d19ec9df /arch/arm64/include/asm/pointer_auth.h | |
parent | 7503197562567b57ec14feb3a9d5400ebc56812f (diff) |
arm64: expose user PAC bit positions via ptrace
When pointer authentication is in use, data/instruction pointers have a
number of PAC bits inserted into them. The number and position of these
bits depends on the configured TCR_ELx.TxSZ and whether tagging is
enabled. ARMv8.3 allows tagging to differ for instruction and data
pointers.
For userspace debuggers to unwind the stack and/or to follow pointer
chains, they need to be able to remove the PAC bits before attempting to
use a pointer.
This patch adds a new structure with masks describing the location of
the PAC bits in userspace instruction and data pointers (i.e. those
addressable via TTBR0), which userspace can query via PTRACE_GETREGSET.
By clearing these bits from pointers (and replacing them with the value
of bit 55), userspace can acquire the PAC-less versions.
This new regset is exposed when the kernel is built with (user) pointer
authentication support, and the address authentication feature is
enabled. Otherwise, the regset is hidden.
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Kristina Martsenko <kristina.martsenko@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
[will: Fix to use vabits_user instead of VA_BITS and rename macro]
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm64/include/asm/pointer_auth.h')
-rw-r--r-- | arch/arm64/include/asm/pointer_auth.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/arm64/include/asm/pointer_auth.h b/arch/arm64/include/asm/pointer_auth.h index 91c4185dda5b..2a22c03c1540 100644 --- a/arch/arm64/include/asm/pointer_auth.h +++ b/arch/arm64/include/asm/pointer_auth.h | |||
@@ -2,9 +2,11 @@ | |||
2 | #ifndef __ASM_POINTER_AUTH_H | 2 | #ifndef __ASM_POINTER_AUTH_H |
3 | #define __ASM_POINTER_AUTH_H | 3 | #define __ASM_POINTER_AUTH_H |
4 | 4 | ||
5 | #include <linux/bitops.h> | ||
5 | #include <linux/random.h> | 6 | #include <linux/random.h> |
6 | 7 | ||
7 | #include <asm/cpufeature.h> | 8 | #include <asm/cpufeature.h> |
9 | #include <asm/memory.h> | ||
8 | #include <asm/sysreg.h> | 10 | #include <asm/sysreg.h> |
9 | 11 | ||
10 | #ifdef CONFIG_ARM64_PTR_AUTH | 12 | #ifdef CONFIG_ARM64_PTR_AUTH |
@@ -61,6 +63,12 @@ static inline void ptrauth_keys_switch(struct ptrauth_keys *keys) | |||
61 | __ptrauth_key_install(APGA, keys->apga); | 63 | __ptrauth_key_install(APGA, keys->apga); |
62 | } | 64 | } |
63 | 65 | ||
66 | /* | ||
67 | * The EL0 pointer bits used by a pointer authentication code. | ||
68 | * This is dependent on TBI0 being enabled, or bits 63:56 would also apply. | ||
69 | */ | ||
70 | #define ptrauth_user_pac_mask() GENMASK(54, vabits_user) | ||
71 | |||
64 | #define ptrauth_thread_init_user(tsk) \ | 72 | #define ptrauth_thread_init_user(tsk) \ |
65 | do { \ | 73 | do { \ |
66 | struct task_struct *__ptiu_tsk = (tsk); \ | 74 | struct task_struct *__ptiu_tsk = (tsk); \ |