diff options
Diffstat (limited to 'arch/arm64/include/asm/pointer_auth.h')
| -rw-r--r-- | arch/arm64/include/asm/pointer_auth.h | 50 | 
1 files changed, 22 insertions, 28 deletions
diff --git a/arch/arm64/include/asm/pointer_auth.h b/arch/arm64/include/asm/pointer_auth.h index 7a24bad1a58b..70c47156e54b 100644 --- a/arch/arm64/include/asm/pointer_auth.h +++ b/arch/arm64/include/asm/pointer_auth.h @@ -22,7 +22,7 @@ struct ptrauth_key {   * We give each process its own keys, which are shared by all threads. The keys   * are inherited upon fork(), and reinitialised upon exec*().   */ -struct ptrauth_keys { +struct ptrauth_keys_user {  	struct ptrauth_key apia;  	struct ptrauth_key apib;  	struct ptrauth_key apda; @@ -30,7 +30,11 @@ struct ptrauth_keys {  	struct ptrauth_key apga;  }; -static inline void ptrauth_keys_init(struct ptrauth_keys *keys) +struct ptrauth_keys_kernel { +	struct ptrauth_key apia; +}; + +static inline void ptrauth_keys_init_user(struct ptrauth_keys_user *keys)  {  	if (system_supports_address_auth()) {  		get_random_bytes(&keys->apia, sizeof(keys->apia)); @@ -50,48 +54,38 @@ do {								\  	write_sysreg_s(__pki_v.hi, SYS_ ## k ## KEYHI_EL1);	\  } while (0) -static inline void ptrauth_keys_switch(struct ptrauth_keys *keys) +static __always_inline void ptrauth_keys_init_kernel(struct ptrauth_keys_kernel *keys)  { -	if (system_supports_address_auth()) { -		__ptrauth_key_install(APIA, keys->apia); -		__ptrauth_key_install(APIB, keys->apib); -		__ptrauth_key_install(APDA, keys->apda); -		__ptrauth_key_install(APDB, keys->apdb); -	} +	if (system_supports_address_auth()) +		get_random_bytes(&keys->apia, sizeof(keys->apia)); +} -	if (system_supports_generic_auth()) -		__ptrauth_key_install(APGA, keys->apga); +static __always_inline void ptrauth_keys_switch_kernel(struct ptrauth_keys_kernel *keys) +{ +	if (system_supports_address_auth()) +		__ptrauth_key_install(APIA, keys->apia);  }  extern int ptrauth_prctl_reset_keys(struct task_struct *tsk, unsigned long arg); -/* - * The EL0 pointer bits used by a pointer authentication code. - * This is dependent on TBI0 being enabled, or bits 63:56 would also apply. - */ -#define ptrauth_user_pac_mask()	GENMASK(54, vabits_actual) - -/* Only valid for EL0 TTBR0 instruction pointers */  static inline unsigned long ptrauth_strip_insn_pac(unsigned long ptr)  { -	return ptr & ~ptrauth_user_pac_mask(); +	return ptrauth_clear_pac(ptr);  }  #define ptrauth_thread_init_user(tsk)					\ -do {									\ -	struct task_struct *__ptiu_tsk = (tsk);				\ -	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.keys_user) +	ptrauth_keys_init_user(&(tsk)->thread.keys_user) +#define ptrauth_thread_init_kernel(tsk)					\ +	ptrauth_keys_init_kernel(&(tsk)->thread.keys_kernel) +#define ptrauth_thread_switch_kernel(tsk)				\ +	ptrauth_keys_switch_kernel(&(tsk)->thread.keys_kernel)  #else /* CONFIG_ARM64_PTR_AUTH */  #define ptrauth_prctl_reset_keys(tsk, arg)	(-EINVAL)  #define ptrauth_strip_insn_pac(lr)	(lr)  #define ptrauth_thread_init_user(tsk) -#define ptrauth_thread_switch(tsk) +#define ptrauth_thread_init_kernel(tsk) +#define ptrauth_thread_switch_kernel(tsk)  #endif /* CONFIG_ARM64_PTR_AUTH */  #endif /* __ASM_POINTER_AUTH_H */  |