Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ASM_ASM_POINTER_AUTH_H
3#define __ASM_ASM_POINTER_AUTH_H
4
5#include <asm/alternative.h>
6#include <asm/asm-offsets.h>
7#include <asm/cpufeature.h>
8#include <asm/sysreg.h>
9
10#ifdef CONFIG_ARM64_PTR_AUTH
11/*
12 * thread.keys_user.ap* as offset exceeds the #imm offset range
13 * so use the base value of ldp as thread.keys_user and offset as
14 * thread.keys_user.ap*.
15 */
16 .macro ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3
17 mov \tmp1, #THREAD_KEYS_USER
18 add \tmp1, \tsk, \tmp1
19alternative_if_not ARM64_HAS_ADDRESS_AUTH
20 b .Laddr_auth_skip_\@
21alternative_else_nop_endif
22 ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APIA]
23 msr_s SYS_APIAKEYLO_EL1, \tmp2
24 msr_s SYS_APIAKEYHI_EL1, \tmp3
25 ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APIB]
26 msr_s SYS_APIBKEYLO_EL1, \tmp2
27 msr_s SYS_APIBKEYHI_EL1, \tmp3
28 ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APDA]
29 msr_s SYS_APDAKEYLO_EL1, \tmp2
30 msr_s SYS_APDAKEYHI_EL1, \tmp3
31 ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APDB]
32 msr_s SYS_APDBKEYLO_EL1, \tmp2
33 msr_s SYS_APDBKEYHI_EL1, \tmp3
34.Laddr_auth_skip_\@:
35alternative_if ARM64_HAS_GENERIC_AUTH
36 ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APGA]
37 msr_s SYS_APGAKEYLO_EL1, \tmp2
38 msr_s SYS_APGAKEYHI_EL1, \tmp3
39alternative_else_nop_endif
40 .endm
41
42 .macro ptrauth_keys_install_kernel tsk, sync, tmp1, tmp2, tmp3
43alternative_if ARM64_HAS_ADDRESS_AUTH
44 mov \tmp1, #THREAD_KEYS_KERNEL
45 add \tmp1, \tsk, \tmp1
46 ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_KERNEL_KEY_APIA]
47 msr_s SYS_APIAKEYLO_EL1, \tmp2
48 msr_s SYS_APIAKEYHI_EL1, \tmp3
49 .if \sync == 1
50 isb
51 .endif
52alternative_else_nop_endif
53 .endm
54
55#else /* CONFIG_ARM64_PTR_AUTH */
56
57 .macro ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3
58 .endm
59
60 .macro ptrauth_keys_install_kernel tsk, sync, tmp1, tmp2, tmp3
61 .endm
62
63#endif /* CONFIG_ARM64_PTR_AUTH */
64
65#endif /* __ASM_ASM_POINTER_AUTH_H */