2019-04-16 15:19:35 +00:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
arm64: add basic pointer authentication support
This patch adds basic support for pointer authentication, allowing
userspace to make use of APIAKey, APIBKey, APDAKey, APDBKey, and
APGAKey. The kernel maintains key values for each process (shared by all
threads within), which are initialised to random values at exec() time.
The ID_AA64ISAR1_EL1.{APA,API,GPA,GPI} fields are exposed to userspace,
to describe that pointer authentication instructions are available and
that the kernel is managing the keys. Two new hwcaps are added for the
same reason: PACA (for address authentication) and PACG (for generic
authentication).
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>
Tested-by: Adam Wallis <awallis@codeaurora.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
[will: Fix sizeof() usage and unroll address key initialisation]
Signed-off-by: Will Deacon <will.deacon@arm.com>
2018-12-07 18:39:25 +00:00
|
|
|
#ifndef __ASM_POINTER_AUTH_H
|
|
|
|
#define __ASM_POINTER_AUTH_H
|
|
|
|
|
2018-12-07 18:39:26 +00:00
|
|
|
#include <linux/bitops.h>
|
2021-03-19 03:10:53 +00:00
|
|
|
#include <linux/prctl.h>
|
arm64: add basic pointer authentication support
This patch adds basic support for pointer authentication, allowing
userspace to make use of APIAKey, APIBKey, APDAKey, APDBKey, and
APGAKey. The kernel maintains key values for each process (shared by all
threads within), which are initialised to random values at exec() time.
The ID_AA64ISAR1_EL1.{APA,API,GPA,GPI} fields are exposed to userspace,
to describe that pointer authentication instructions are available and
that the kernel is managing the keys. Two new hwcaps are added for the
same reason: PACA (for address authentication) and PACG (for generic
authentication).
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>
Tested-by: Adam Wallis <awallis@codeaurora.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
[will: Fix sizeof() usage and unroll address key initialisation]
Signed-off-by: Will Deacon <will.deacon@arm.com>
2018-12-07 18:39:25 +00:00
|
|
|
#include <linux/random.h>
|
|
|
|
|
|
|
|
#include <asm/cpufeature.h>
|
2018-12-07 18:39:26 +00:00
|
|
|
#include <asm/memory.h>
|
arm64: add basic pointer authentication support
This patch adds basic support for pointer authentication, allowing
userspace to make use of APIAKey, APIBKey, APDAKey, APDBKey, and
APGAKey. The kernel maintains key values for each process (shared by all
threads within), which are initialised to random values at exec() time.
The ID_AA64ISAR1_EL1.{APA,API,GPA,GPI} fields are exposed to userspace,
to describe that pointer authentication instructions are available and
that the kernel is managing the keys. Two new hwcaps are added for the
same reason: PACA (for address authentication) and PACG (for generic
authentication).
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>
Tested-by: Adam Wallis <awallis@codeaurora.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
[will: Fix sizeof() usage and unroll address key initialisation]
Signed-off-by: Will Deacon <will.deacon@arm.com>
2018-12-07 18:39:25 +00:00
|
|
|
#include <asm/sysreg.h>
|
|
|
|
|
|
|
|
#ifdef CONFIG_ARM64_PTR_AUTH
|
|
|
|
/*
|
|
|
|
* Each key is a 128-bit quantity which is split across a pair of 64-bit
|
|
|
|
* registers (Lo and Hi).
|
|
|
|
*/
|
|
|
|
struct ptrauth_key {
|
|
|
|
unsigned long lo, hi;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* We give each process its own keys, which are shared by all threads. The keys
|
|
|
|
* are inherited upon fork(), and reinitialised upon exec*().
|
|
|
|
*/
|
2020-03-13 09:04:50 +00:00
|
|
|
struct ptrauth_keys_user {
|
arm64: add basic pointer authentication support
This patch adds basic support for pointer authentication, allowing
userspace to make use of APIAKey, APIBKey, APDAKey, APDBKey, and
APGAKey. The kernel maintains key values for each process (shared by all
threads within), which are initialised to random values at exec() time.
The ID_AA64ISAR1_EL1.{APA,API,GPA,GPI} fields are exposed to userspace,
to describe that pointer authentication instructions are available and
that the kernel is managing the keys. Two new hwcaps are added for the
same reason: PACA (for address authentication) and PACG (for generic
authentication).
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>
Tested-by: Adam Wallis <awallis@codeaurora.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
[will: Fix sizeof() usage and unroll address key initialisation]
Signed-off-by: Will Deacon <will.deacon@arm.com>
2018-12-07 18:39:25 +00:00
|
|
|
struct ptrauth_key apia;
|
|
|
|
struct ptrauth_key apib;
|
|
|
|
struct ptrauth_key apda;
|
|
|
|
struct ptrauth_key apdb;
|
|
|
|
struct ptrauth_key apga;
|
|
|
|
};
|
|
|
|
|
2020-03-13 09:04:56 +00:00
|
|
|
struct ptrauth_keys_kernel {
|
|
|
|
struct ptrauth_key apia;
|
|
|
|
};
|
|
|
|
|
2021-03-19 03:10:54 +00:00
|
|
|
#define __ptrauth_key_install_nosync(k, v) \
|
|
|
|
do { \
|
|
|
|
struct ptrauth_key __pki_v = (v); \
|
|
|
|
write_sysreg_s(__pki_v.lo, SYS_ ## k ## KEYLO_EL1); \
|
|
|
|
write_sysreg_s(__pki_v.hi, SYS_ ## k ## KEYHI_EL1); \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
static inline void ptrauth_keys_install_user(struct ptrauth_keys_user *keys)
|
|
|
|
{
|
|
|
|
if (system_supports_address_auth()) {
|
|
|
|
__ptrauth_key_install_nosync(APIB, keys->apib);
|
|
|
|
__ptrauth_key_install_nosync(APDA, keys->apda);
|
|
|
|
__ptrauth_key_install_nosync(APDB, keys->apdb);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (system_supports_generic_auth())
|
|
|
|
__ptrauth_key_install_nosync(APGA, keys->apga);
|
|
|
|
}
|
|
|
|
|
2020-03-13 09:04:50 +00:00
|
|
|
static inline void ptrauth_keys_init_user(struct ptrauth_keys_user *keys)
|
arm64: add basic pointer authentication support
This patch adds basic support for pointer authentication, allowing
userspace to make use of APIAKey, APIBKey, APDAKey, APDBKey, and
APGAKey. The kernel maintains key values for each process (shared by all
threads within), which are initialised to random values at exec() time.
The ID_AA64ISAR1_EL1.{APA,API,GPA,GPI} fields are exposed to userspace,
to describe that pointer authentication instructions are available and
that the kernel is managing the keys. Two new hwcaps are added for the
same reason: PACA (for address authentication) and PACG (for generic
authentication).
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>
Tested-by: Adam Wallis <awallis@codeaurora.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
[will: Fix sizeof() usage and unroll address key initialisation]
Signed-off-by: Will Deacon <will.deacon@arm.com>
2018-12-07 18:39:25 +00:00
|
|
|
{
|
|
|
|
if (system_supports_address_auth()) {
|
|
|
|
get_random_bytes(&keys->apia, sizeof(keys->apia));
|
|
|
|
get_random_bytes(&keys->apib, sizeof(keys->apib));
|
|
|
|
get_random_bytes(&keys->apda, sizeof(keys->apda));
|
|
|
|
get_random_bytes(&keys->apdb, sizeof(keys->apdb));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (system_supports_generic_auth())
|
|
|
|
get_random_bytes(&keys->apga, sizeof(keys->apga));
|
|
|
|
|
2021-03-19 03:10:54 +00:00
|
|
|
ptrauth_keys_install_user(keys);
|
|
|
|
}
|
arm64: add basic pointer authentication support
This patch adds basic support for pointer authentication, allowing
userspace to make use of APIAKey, APIBKey, APDAKey, APDBKey, and
APGAKey. The kernel maintains key values for each process (shared by all
threads within), which are initialised to random values at exec() time.
The ID_AA64ISAR1_EL1.{APA,API,GPA,GPI} fields are exposed to userspace,
to describe that pointer authentication instructions are available and
that the kernel is managing the keys. Two new hwcaps are added for the
same reason: PACA (for address authentication) and PACG (for generic
authentication).
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>
Tested-by: Adam Wallis <awallis@codeaurora.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
[will: Fix sizeof() usage and unroll address key initialisation]
Signed-off-by: Will Deacon <will.deacon@arm.com>
2018-12-07 18:39:25 +00:00
|
|
|
|
2020-03-13 09:04:57 +00:00
|
|
|
static __always_inline void ptrauth_keys_init_kernel(struct ptrauth_keys_kernel *keys)
|
2020-03-13 09:04:56 +00:00
|
|
|
{
|
|
|
|
if (system_supports_address_auth())
|
|
|
|
get_random_bytes(&keys->apia, sizeof(keys->apia));
|
|
|
|
}
|
|
|
|
|
2020-03-13 09:04:57 +00:00
|
|
|
static __always_inline void ptrauth_keys_switch_kernel(struct ptrauth_keys_kernel *keys)
|
|
|
|
{
|
2020-04-21 12:10:14 +00:00
|
|
|
if (!system_supports_address_auth())
|
|
|
|
return;
|
|
|
|
|
|
|
|
__ptrauth_key_install_nosync(APIA, keys->apia);
|
|
|
|
isb();
|
2020-03-13 09:04:57 +00:00
|
|
|
}
|
|
|
|
|
2018-12-07 18:39:28 +00:00
|
|
|
extern int ptrauth_prctl_reset_keys(struct task_struct *tsk, unsigned long arg);
|
|
|
|
|
2021-03-19 03:10:53 +00:00
|
|
|
extern int ptrauth_set_enabled_keys(struct task_struct *tsk, unsigned long keys,
|
|
|
|
unsigned long enabled);
|
|
|
|
extern int ptrauth_get_enabled_keys(struct task_struct *tsk);
|
|
|
|
|
2018-12-07 18:39:27 +00:00
|
|
|
static inline unsigned long ptrauth_strip_insn_pac(unsigned long ptr)
|
|
|
|
{
|
2020-03-13 09:04:58 +00:00
|
|
|
return ptrauth_clear_pac(ptr);
|
2018-12-07 18:39:27 +00:00
|
|
|
}
|
|
|
|
|
2021-02-08 09:57:30 +00:00
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
2021-03-19 03:10:54 +00:00
|
|
|
#define ptrauth_suspend_exit() \
|
|
|
|
ptrauth_keys_install_user(¤t->thread.keys_user)
|
|
|
|
|
2021-03-19 03:10:53 +00:00
|
|
|
#define ptrauth_thread_init_user() \
|
|
|
|
do { \
|
|
|
|
ptrauth_keys_init_user(¤t->thread.keys_user); \
|
|
|
|
\
|
|
|
|
/* enable all keys */ \
|
|
|
|
if (system_supports_address_auth()) \
|
|
|
|
set_task_sctlr_el1(current->thread.sctlr_user | \
|
|
|
|
SCTLR_ELx_ENIA | SCTLR_ELx_ENIB | \
|
|
|
|
SCTLR_ELx_ENDA | SCTLR_ELx_ENDB); \
|
|
|
|
} while (0)
|
|
|
|
|
2021-03-19 03:10:54 +00:00
|
|
|
#define ptrauth_thread_switch_user(tsk) \
|
|
|
|
ptrauth_keys_install_user(&(tsk)->thread.keys_user)
|
|
|
|
|
2020-03-13 09:04:56 +00:00
|
|
|
#define ptrauth_thread_init_kernel(tsk) \
|
|
|
|
ptrauth_keys_init_kernel(&(tsk)->thread.keys_kernel)
|
2020-03-13 09:04:57 +00:00
|
|
|
#define ptrauth_thread_switch_kernel(tsk) \
|
|
|
|
ptrauth_keys_switch_kernel(&(tsk)->thread.keys_kernel)
|
arm64: add basic pointer authentication support
This patch adds basic support for pointer authentication, allowing
userspace to make use of APIAKey, APIBKey, APDAKey, APDBKey, and
APGAKey. The kernel maintains key values for each process (shared by all
threads within), which are initialised to random values at exec() time.
The ID_AA64ISAR1_EL1.{APA,API,GPA,GPI} fields are exposed to userspace,
to describe that pointer authentication instructions are available and
that the kernel is managing the keys. Two new hwcaps are added for the
same reason: PACA (for address authentication) and PACG (for generic
authentication).
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>
Tested-by: Adam Wallis <awallis@codeaurora.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
[will: Fix sizeof() usage and unroll address key initialisation]
Signed-off-by: Will Deacon <will.deacon@arm.com>
2018-12-07 18:39:25 +00:00
|
|
|
|
|
|
|
#else /* CONFIG_ARM64_PTR_AUTH */
|
2021-02-08 09:57:30 +00:00
|
|
|
#define ptrauth_enable()
|
2018-12-07 18:39:28 +00:00
|
|
|
#define ptrauth_prctl_reset_keys(tsk, arg) (-EINVAL)
|
2021-03-19 03:10:53 +00:00
|
|
|
#define ptrauth_set_enabled_keys(tsk, keys, enabled) (-EINVAL)
|
|
|
|
#define ptrauth_get_enabled_keys(tsk) (-EINVAL)
|
2018-12-07 18:39:27 +00:00
|
|
|
#define ptrauth_strip_insn_pac(lr) (lr)
|
2021-03-19 03:10:54 +00:00
|
|
|
#define ptrauth_suspend_exit()
|
2021-03-19 03:10:53 +00:00
|
|
|
#define ptrauth_thread_init_user()
|
2020-03-13 09:04:56 +00:00
|
|
|
#define ptrauth_thread_init_kernel(tsk)
|
2021-03-19 03:10:54 +00:00
|
|
|
#define ptrauth_thread_switch_user(tsk)
|
2020-03-13 09:04:57 +00:00
|
|
|
#define ptrauth_thread_switch_kernel(tsk)
|
arm64: add basic pointer authentication support
This patch adds basic support for pointer authentication, allowing
userspace to make use of APIAKey, APIBKey, APDAKey, APDBKey, and
APGAKey. The kernel maintains key values for each process (shared by all
threads within), which are initialised to random values at exec() time.
The ID_AA64ISAR1_EL1.{APA,API,GPA,GPI} fields are exposed to userspace,
to describe that pointer authentication instructions are available and
that the kernel is managing the keys. Two new hwcaps are added for the
same reason: PACA (for address authentication) and PACG (for generic
authentication).
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>
Tested-by: Adam Wallis <awallis@codeaurora.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
[will: Fix sizeof() usage and unroll address key initialisation]
Signed-off-by: Will Deacon <will.deacon@arm.com>
2018-12-07 18:39:25 +00:00
|
|
|
#endif /* CONFIG_ARM64_PTR_AUTH */
|
|
|
|
|
2021-03-19 03:10:53 +00:00
|
|
|
#define PR_PAC_ENABLED_KEYS_MASK \
|
|
|
|
(PR_PAC_APIAKEY | PR_PAC_APIBKEY | PR_PAC_APDAKEY | PR_PAC_APDBKEY)
|
|
|
|
|
arm64: add basic pointer authentication support
This patch adds basic support for pointer authentication, allowing
userspace to make use of APIAKey, APIBKey, APDAKey, APDBKey, and
APGAKey. The kernel maintains key values for each process (shared by all
threads within), which are initialised to random values at exec() time.
The ID_AA64ISAR1_EL1.{APA,API,GPA,GPI} fields are exposed to userspace,
to describe that pointer authentication instructions are available and
that the kernel is managing the keys. Two new hwcaps are added for the
same reason: PACA (for address authentication) and PACG (for generic
authentication).
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>
Tested-by: Adam Wallis <awallis@codeaurora.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
[will: Fix sizeof() usage and unroll address key initialisation]
Signed-off-by: Will Deacon <will.deacon@arm.com>
2018-12-07 18:39:25 +00:00
|
|
|
#endif /* __ASM_POINTER_AUTH_H */
|