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