xref: /linux/arch/arm64/include/asm/static_call.h (revision 441c63ff42c4e666304cdd32d23b5fc6bc1ea3cc)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ASM_STATIC_CALL_H
3 #define _ASM_STATIC_CALL_H
4 
5 #define __ARCH_DEFINE_STATIC_CALL_TRAMP(name, target)		    \
6 	asm("	.pushsection .static_call.text, \"ax\"		\n" \
7 	    "	.align	4					\n" \
8 	    "	.globl	" name "				\n" \
9 	    name ":						\n" \
10 	    "	hint	34	/* BTI C */			\n" \
11 	    "	adrp	x16, 1f					\n" \
12 	    "	ldr	x16, [x16, :lo12:1f]			\n" \
13 	    "	br	x16					\n" \
14 	    "	.type	" name ", %function			\n" \
15 	    "	.size	" name ", . - " name "			\n" \
16 	    "	.popsection					\n" \
17 	    "	.pushsection .rodata, \"a\"			\n" \
18 	    "	.align	3					\n" \
19 	    "1:	.quad	" target "				\n" \
20 	    "	.popsection					\n")
21 
22 #define ARCH_DEFINE_STATIC_CALL_TRAMP(name, func)			\
23 	__ARCH_DEFINE_STATIC_CALL_TRAMP(STATIC_CALL_TRAMP_STR(name), #func)
24 
25 #define ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name)			\
26 	ARCH_DEFINE_STATIC_CALL_TRAMP(name, __static_call_return0)
27 
28 #define ARCH_DEFINE_STATIC_CALL_RET0_TRAMP(name)			\
29 	ARCH_DEFINE_STATIC_CALL_TRAMP(name, __static_call_return0)
30 
31 #endif /* _ASM_STATIC_CALL_H */
32