1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __ASM_COMPILER_H
3 #define __ASM_COMPILER_H
4 
5 #ifdef ARM64_ASM_ARCH
6 #define ARM64_ASM_PREAMBLE ".arch " ARM64_ASM_ARCH "\n"
7 #else
8 #define ARM64_ASM_PREAMBLE
9 #endif
10 
11 #define xpaclri(ptr)							\
12 ({									\
13 	register unsigned long __xpaclri_ptr asm("x30") = (ptr);	\
14 									\
15 	asm(								\
16 	ARM64_ASM_PREAMBLE						\
17 	"	hint	#7\n"						\
18 	: "+r" (__xpaclri_ptr));					\
19 									\
20 	__xpaclri_ptr;							\
21 })
22 
23 #ifdef CONFIG_ARM64_PTR_AUTH_KERNEL
24 #define ptrauth_strip_kernel_insn_pac(ptr)	xpaclri(ptr)
25 #else
26 #define ptrauth_strip_kernel_insn_pac(ptr)	(ptr)
27 #endif
28 
29 #ifdef CONFIG_ARM64_PTR_AUTH
30 #define ptrauth_strip_user_insn_pac(ptr)	xpaclri(ptr)
31 #else
32 #define ptrauth_strip_user_insn_pac(ptr)	(ptr)
33 #endif
34 
35 #if !defined(CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC)
36 #define __builtin_return_address(val)					\
37 	(void *)(ptrauth_strip_kernel_insn_pac((unsigned long)__builtin_return_address(val)))
38 #endif
39 
40 #endif /* __ASM_COMPILER_H */
41