0001
0002 #ifndef _ASM_STATIC_CALL_H
0003 #define _ASM_STATIC_CALL_H
0004
0005 #include <asm/text-patching.h>
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 #define __ARCH_DEFINE_STATIC_CALL_TRAMP(name, insns) \
0035 asm(".pushsection .static_call.text, \"ax\" \n" \
0036 ".align 4 \n" \
0037 ".globl " STATIC_CALL_TRAMP_STR(name) " \n" \
0038 STATIC_CALL_TRAMP_STR(name) ": \n" \
0039 ANNOTATE_NOENDBR \
0040 insns " \n" \
0041 ".byte 0x0f, 0xb9, 0xcc \n" \
0042 ".type " STATIC_CALL_TRAMP_STR(name) ", @function \n" \
0043 ".size " STATIC_CALL_TRAMP_STR(name) ", . - " STATIC_CALL_TRAMP_STR(name) " \n" \
0044 ".popsection \n")
0045
0046 #define ARCH_DEFINE_STATIC_CALL_TRAMP(name, func) \
0047 __ARCH_DEFINE_STATIC_CALL_TRAMP(name, ".byte 0xe9; .long " #func " - (. + 4)")
0048
0049 #ifdef CONFIG_RETHUNK
0050 #define ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name) \
0051 __ARCH_DEFINE_STATIC_CALL_TRAMP(name, "jmp __x86_return_thunk")
0052 #else
0053 #define ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name) \
0054 __ARCH_DEFINE_STATIC_CALL_TRAMP(name, "ret; int3; nop; nop; nop")
0055 #endif
0056
0057 #define ARCH_DEFINE_STATIC_CALL_RET0_TRAMP(name) \
0058 ARCH_DEFINE_STATIC_CALL_TRAMP(name, __static_call_return0)
0059
0060 #define ARCH_ADD_TRAMP_KEY(name) \
0061 asm(".pushsection .static_call_tramp_key, \"a\" \n" \
0062 ".long " STATIC_CALL_TRAMP_STR(name) " - . \n" \
0063 ".long " STATIC_CALL_KEY_STR(name) " - . \n" \
0064 ".popsection \n")
0065
0066 extern bool __static_call_fixup(void *tramp, u8 op, void *dest);
0067
0068 #endif