1be129842SKristina Martsenko /* SPDX-License-Identifier: GPL-2.0 */
2be129842SKristina Martsenko #ifndef __ASM_ASM_POINTER_AUTH_H
3be129842SKristina Martsenko #define __ASM_ASM_POINTER_AUTH_H
4be129842SKristina Martsenko 
5be129842SKristina Martsenko #include <asm/alternative.h>
6be129842SKristina Martsenko #include <asm/asm-offsets.h>
7be129842SKristina Martsenko #include <asm/cpufeature.h>
8be129842SKristina Martsenko #include <asm/sysreg.h>
9be129842SKristina Martsenko 
10d053e71aSDaniel Kiss #ifdef CONFIG_ARM64_PTR_AUTH_KERNEL
11be129842SKristina Martsenko 
12d0055da5SMark Rutland 	.macro __ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3
1333e45234SKristina Martsenko 	mov	\tmp1, #THREAD_KEYS_KERNEL
1433e45234SKristina Martsenko 	add	\tmp1, \tsk, \tmp1
1533e45234SKristina Martsenko 	ldp	\tmp2, \tmp3, [\tmp1, #PTRAUTH_KERNEL_KEY_APIA]
1633e45234SKristina Martsenko 	msr_s	SYS_APIAKEYLO_EL1, \tmp2
1733e45234SKristina Martsenko 	msr_s	SYS_APIAKEYHI_EL1, \tmp3
18d0055da5SMark Rutland 	.endm
19d0055da5SMark Rutland 
20d0055da5SMark Rutland 	.macro ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3
21d0055da5SMark Rutland alternative_if ARM64_HAS_ADDRESS_AUTH
22d0055da5SMark Rutland 	__ptrauth_keys_install_kernel_nosync \tsk, \tmp1, \tmp2, \tmp3
23d0055da5SMark Rutland alternative_else_nop_endif
24d0055da5SMark Rutland 	.endm
25d0055da5SMark Rutland 
26d0055da5SMark Rutland 	.macro ptrauth_keys_install_kernel tsk, tmp1, tmp2, tmp3
27d0055da5SMark Rutland alternative_if ARM64_HAS_ADDRESS_AUTH
28d0055da5SMark Rutland 	__ptrauth_keys_install_kernel_nosync \tsk, \tmp1, \tmp2, \tmp3
2933e45234SKristina Martsenko 	isb
3033e45234SKristina Martsenko alternative_else_nop_endif
3133e45234SKristina Martsenko 	.endm
3233e45234SKristina Martsenko 
33d053e71aSDaniel Kiss #else /* CONFIG_ARM64_PTR_AUTH_KERNEL */
34d053e71aSDaniel Kiss 
35d053e71aSDaniel Kiss 	.macro __ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3
36d053e71aSDaniel Kiss 	.endm
37d053e71aSDaniel Kiss 
38d053e71aSDaniel Kiss 	.macro ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3
39d053e71aSDaniel Kiss 	.endm
40d053e71aSDaniel Kiss 
41d053e71aSDaniel Kiss 	.macro ptrauth_keys_install_kernel tsk, tmp1, tmp2, tmp3
42d053e71aSDaniel Kiss 	.endm
43d053e71aSDaniel Kiss 
44d053e71aSDaniel Kiss #endif /* CONFIG_ARM64_PTR_AUTH_KERNEL */
45d053e71aSDaniel Kiss 
46d053e71aSDaniel Kiss #ifdef CONFIG_ARM64_PTR_AUTH
47d053e71aSDaniel Kiss /*
48d053e71aSDaniel Kiss  * thread.keys_user.ap* as offset exceeds the #imm offset range
49d053e71aSDaniel Kiss  * so use the base value of ldp as thread.keys_user and offset as
50d053e71aSDaniel Kiss  * thread.keys_user.ap*.
51d053e71aSDaniel Kiss  */
52d053e71aSDaniel Kiss 	.macro __ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3
53d053e71aSDaniel Kiss 	mov	\tmp1, #THREAD_KEYS_USER
54d053e71aSDaniel Kiss 	add	\tmp1, \tsk, \tmp1
55d053e71aSDaniel Kiss 	ldp	\tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APIA]
56d053e71aSDaniel Kiss 	msr_s	SYS_APIAKEYLO_EL1, \tmp2
57d053e71aSDaniel Kiss 	msr_s	SYS_APIAKEYHI_EL1, \tmp3
58d053e71aSDaniel Kiss 	.endm
59d053e71aSDaniel Kiss 
6062a679cbSMark Rutland 	.macro __ptrauth_keys_init_cpu tsk, tmp1, tmp2, tmp3
6162a679cbSMark Rutland 	mrs	\tmp1, id_aa64isar1_el1
62aa50479bSMark Brown 	ubfx	\tmp1, \tmp1, #ID_AA64ISAR1_EL1_APA_SHIFT, #8
63def8c222SVladimir Murzin 	mrs_s	\tmp2, SYS_ID_AA64ISAR2_EL1
64*b2d71f27SMark Brown 	ubfx	\tmp2, \tmp2, #ID_AA64ISAR2_EL1_APA3_SHIFT, #4
65def8c222SVladimir Murzin 	orr	\tmp1, \tmp1, \tmp2
6662a679cbSMark Rutland 	cbz	\tmp1, .Lno_addr_auth\@
6762a679cbSMark Rutland 	mov_q	\tmp1, (SCTLR_ELx_ENIA | SCTLR_ELx_ENIB | \
6862a679cbSMark Rutland 			SCTLR_ELx_ENDA | SCTLR_ELx_ENDB)
6962a679cbSMark Rutland 	mrs	\tmp2, sctlr_el1
7062a679cbSMark Rutland 	orr	\tmp2, \tmp2, \tmp1
7162a679cbSMark Rutland 	msr	sctlr_el1, \tmp2
7262a679cbSMark Rutland 	__ptrauth_keys_install_kernel_nosync \tsk, \tmp1, \tmp2, \tmp3
7362a679cbSMark Rutland 	isb
7462a679cbSMark Rutland .Lno_addr_auth\@:
7562a679cbSMark Rutland 	.endm
7662a679cbSMark Rutland 
7762a679cbSMark Rutland 	.macro ptrauth_keys_init_cpu tsk, tmp1, tmp2, tmp3
7862a679cbSMark Rutland alternative_if_not ARM64_HAS_ADDRESS_AUTH
7962a679cbSMark Rutland 	b	.Lno_addr_auth\@
8062a679cbSMark Rutland alternative_else_nop_endif
8162a679cbSMark Rutland 	__ptrauth_keys_init_cpu \tsk, \tmp1, \tmp2, \tmp3
8262a679cbSMark Rutland .Lno_addr_auth\@:
8362a679cbSMark Rutland 	.endm
8462a679cbSMark Rutland 
85d053e71aSDaniel Kiss #else /* !CONFIG_ARM64_PTR_AUTH */
86be129842SKristina Martsenko 
87be129842SKristina Martsenko 	.macro ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3
88be129842SKristina Martsenko 	.endm
89be129842SKristina Martsenko 
90be129842SKristina Martsenko #endif /* CONFIG_ARM64_PTR_AUTH */
91be129842SKristina Martsenko 
92be129842SKristina Martsenko #endif /* __ASM_ASM_POINTER_AUTH_H */
93