1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21965aae3SH. Peter Anvin #ifndef _ASM_X86_LINKAGE_H 31965aae3SH. Peter Anvin #define _ASM_X86_LINKAGE_H 4bb898558SAl Viro 5bb7f5f6cSCyrill Gorcunov #include <linux/stringify.h> 6c4691712SPeter Zijlstra #include <asm/ibt.h> 7bb7f5f6cSCyrill Gorcunov 8bb898558SAl Viro #undef notrace 9bb898558SAl Viro #define notrace __attribute__((no_instrument_function)) 10bb898558SAl Viro 11*25e73b7eSPeter Zijlstra #ifdef CONFIG_64BIT 12*25e73b7eSPeter Zijlstra /* 13*25e73b7eSPeter Zijlstra * The generic version tends to create spurious ENDBR instructions under 14*25e73b7eSPeter Zijlstra * certain conditions. 15*25e73b7eSPeter Zijlstra */ 16*25e73b7eSPeter Zijlstra #define _THIS_IP_ ({ unsigned long __here; asm ("lea 0(%%rip), %0" : "=r" (__here)); __here; }) 17*25e73b7eSPeter Zijlstra #endif 18*25e73b7eSPeter Zijlstra 19bb898558SAl Viro #ifdef CONFIG_X86_32 20bb898558SAl Viro #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0))) 217ab15247SCyrill Gorcunov #endif /* CONFIG_X86_32 */ 227ab15247SCyrill Gorcunov 23d49a0626SPeter Zijlstra #define __ALIGN .balign CONFIG_FUNCTION_ALIGNMENT, 0x90; 24bb7f5f6cSCyrill Gorcunov #define __ALIGN_STR __stringify(__ALIGN) 25bb898558SAl Viro 26931ab636SPeter Zijlstra #if defined(CONFIG_CALL_PADDING) && !defined(__DISABLE_EXPORTS) && !defined(BUILD_VDSO) 27bea75b33SThomas Gleixner #define FUNCTION_PADDING .skip CONFIG_FUNCTION_ALIGNMENT, 0x90; 28bea75b33SThomas Gleixner #else 29bea75b33SThomas Gleixner #define FUNCTION_PADDING 30bea75b33SThomas Gleixner #endif 31bea75b33SThomas Gleixner 327324f74dSJinghao Jia #if (CONFIG_FUNCTION_ALIGNMENT > 8) && !defined(__DISABLE_EXPORTS) && !defined(BUILD_VDSO) 33bea75b33SThomas Gleixner # define __FUNC_ALIGN __ALIGN; FUNCTION_PADDING 34bea75b33SThomas Gleixner #else 358eb5d34eSThomas Gleixner # define __FUNC_ALIGN __ALIGN 36bea75b33SThomas Gleixner #endif 37bea75b33SThomas Gleixner 38bea75b33SThomas Gleixner #define ASM_FUNC_ALIGN __stringify(__FUNC_ALIGN) 398eb5d34eSThomas Gleixner #define SYM_F_ALIGN __FUNC_ALIGN 408eb5d34eSThomas Gleixner 418eb5d34eSThomas Gleixner #ifdef __ASSEMBLY__ 428eb5d34eSThomas Gleixner 43f43b9876SPeter Zijlstra #if defined(CONFIG_RETHUNK) && !defined(__DISABLE_EXPORTS) && !defined(BUILD_VDSO) 44aa3d4803SPeter Zijlstra #define RET jmp __x86_return_thunk 45aa3d4803SPeter Zijlstra #else /* CONFIG_RETPOLINE */ 46e463a09aSPeter Zijlstra #ifdef CONFIG_SLS 47e463a09aSPeter Zijlstra #define RET ret; int3 48e463a09aSPeter Zijlstra #else 49e463a09aSPeter Zijlstra #define RET ret 50e463a09aSPeter Zijlstra #endif 51aa3d4803SPeter Zijlstra #endif /* CONFIG_RETPOLINE */ 52e463a09aSPeter Zijlstra 53b17c2baaSPeter Zijlstra #else /* __ASSEMBLY__ */ 54b17c2baaSPeter Zijlstra 55f43b9876SPeter Zijlstra #if defined(CONFIG_RETHUNK) && !defined(__DISABLE_EXPORTS) && !defined(BUILD_VDSO) 56aa3d4803SPeter Zijlstra #define ASM_RET "jmp __x86_return_thunk\n\t" 57aa3d4803SPeter Zijlstra #else /* CONFIG_RETPOLINE */ 58e463a09aSPeter Zijlstra #ifdef CONFIG_SLS 59e463a09aSPeter Zijlstra #define ASM_RET "ret; int3\n\t" 60e463a09aSPeter Zijlstra #else 61b17c2baaSPeter Zijlstra #define ASM_RET "ret\n\t" 62e463a09aSPeter Zijlstra #endif 63aa3d4803SPeter Zijlstra #endif /* CONFIG_RETPOLINE */ 64b17c2baaSPeter Zijlstra 657ab15247SCyrill Gorcunov #endif /* __ASSEMBLY__ */ 667ab15247SCyrill Gorcunov 67bea75b33SThomas Gleixner /* 68931ab636SPeter Zijlstra * Depending on -fpatchable-function-entry=N,N usage (CONFIG_CALL_PADDING) the 69bea75b33SThomas Gleixner * CFI symbol layout changes. 70bea75b33SThomas Gleixner * 71bea75b33SThomas Gleixner * Without CALL_THUNKS: 72bea75b33SThomas Gleixner * 73bea75b33SThomas Gleixner * .align FUNCTION_ALIGNMENT 74bea75b33SThomas Gleixner * __cfi_##name: 75bea75b33SThomas Gleixner * .skip FUNCTION_PADDING, 0x90 76bea75b33SThomas Gleixner * .byte 0xb8 77bea75b33SThomas Gleixner * .long __kcfi_typeid_##name 78bea75b33SThomas Gleixner * name: 79bea75b33SThomas Gleixner * 80bea75b33SThomas Gleixner * With CALL_THUNKS: 81bea75b33SThomas Gleixner * 82bea75b33SThomas Gleixner * .align FUNCTION_ALIGNMENT 83bea75b33SThomas Gleixner * __cfi_##name: 84bea75b33SThomas Gleixner * .byte 0xb8 85bea75b33SThomas Gleixner * .long __kcfi_typeid_##name 86bea75b33SThomas Gleixner * .skip FUNCTION_PADDING, 0x90 87bea75b33SThomas Gleixner * name: 88bea75b33SThomas Gleixner * 89bea75b33SThomas Gleixner * In both cases the whole thing is FUNCTION_ALIGNMENT aligned and sized. 90bea75b33SThomas Gleixner */ 91bea75b33SThomas Gleixner 92931ab636SPeter Zijlstra #ifdef CONFIG_CALL_PADDING 93bea75b33SThomas Gleixner #define CFI_PRE_PADDING 94bea75b33SThomas Gleixner #define CFI_POST_PADDING .skip CONFIG_FUNCTION_PADDING_BYTES, 0x90; 95bea75b33SThomas Gleixner #else 96bea75b33SThomas Gleixner #define CFI_PRE_PADDING .skip CONFIG_FUNCTION_PADDING_BYTES, 0x90; 97bea75b33SThomas Gleixner #define CFI_POST_PADDING 98bea75b33SThomas Gleixner #endif 99bea75b33SThomas Gleixner 100ccace936SSami Tolvanen #define __CFI_TYPE(name) \ 101ccace936SSami Tolvanen SYM_START(__cfi_##name, SYM_L_LOCAL, SYM_A_NONE) \ 102bea75b33SThomas Gleixner CFI_PRE_PADDING \ 103ccace936SSami Tolvanen .byte 0xb8 ASM_NL \ 104ccace936SSami Tolvanen .long __kcfi_typeid_##name ASM_NL \ 105bea75b33SThomas Gleixner CFI_POST_PADDING \ 106ccace936SSami Tolvanen SYM_FUNC_END(__cfi_##name) 107ccace936SSami Tolvanen 108ccace936SSami Tolvanen /* UML needs to be able to override memcpy() and friends for KASAN. */ 109ccace936SSami Tolvanen #ifdef CONFIG_UML 1104a2c3448SJosh Poimboeuf # define SYM_FUNC_ALIAS_MEMFUNC SYM_FUNC_ALIAS_WEAK 111ccace936SSami Tolvanen #else 112ccace936SSami Tolvanen # define SYM_FUNC_ALIAS_MEMFUNC SYM_FUNC_ALIAS 113c4691712SPeter Zijlstra #endif 114c4691712SPeter Zijlstra 1158eb5d34eSThomas Gleixner /* SYM_TYPED_FUNC_START -- use for indirectly called globals, w/ CFI type */ 116c4691712SPeter Zijlstra #define SYM_TYPED_FUNC_START(name) \ 117c4691712SPeter Zijlstra SYM_TYPED_START(name, SYM_L_GLOBAL, SYM_F_ALIGN) \ 118c4691712SPeter Zijlstra ENDBR 119c4691712SPeter Zijlstra 120c4691712SPeter Zijlstra /* SYM_FUNC_START -- use for global functions */ 121c4691712SPeter Zijlstra #define SYM_FUNC_START(name) \ 122c4691712SPeter Zijlstra SYM_START(name, SYM_L_GLOBAL, SYM_F_ALIGN) \ 123c4691712SPeter Zijlstra ENDBR 124c4691712SPeter Zijlstra 1258eb5d34eSThomas Gleixner /* SYM_FUNC_START_NOALIGN -- use for global functions, w/o alignment */ 126c4691712SPeter Zijlstra #define SYM_FUNC_START_NOALIGN(name) \ 127c4691712SPeter Zijlstra SYM_START(name, SYM_L_GLOBAL, SYM_A_NONE) \ 128c4691712SPeter Zijlstra ENDBR 129c4691712SPeter Zijlstra 130c4691712SPeter Zijlstra /* SYM_FUNC_START_LOCAL -- use for local functions */ 131c4691712SPeter Zijlstra #define SYM_FUNC_START_LOCAL(name) \ 132c4691712SPeter Zijlstra SYM_START(name, SYM_L_LOCAL, SYM_F_ALIGN) \ 133c4691712SPeter Zijlstra ENDBR 134c4691712SPeter Zijlstra 1358eb5d34eSThomas Gleixner /* SYM_FUNC_START_LOCAL_NOALIGN -- use for local functions, w/o alignment */ 136c4691712SPeter Zijlstra #define SYM_FUNC_START_LOCAL_NOALIGN(name) \ 137c4691712SPeter Zijlstra SYM_START(name, SYM_L_LOCAL, SYM_A_NONE) \ 138c4691712SPeter Zijlstra ENDBR 139c4691712SPeter Zijlstra 140c4691712SPeter Zijlstra /* SYM_FUNC_START_WEAK -- use for weak functions */ 141c4691712SPeter Zijlstra #define SYM_FUNC_START_WEAK(name) \ 142c4691712SPeter Zijlstra SYM_START(name, SYM_L_WEAK, SYM_F_ALIGN) \ 1431965aae3SH. Peter Anvin ENDBR 144bb898558SAl Viro 145 /* SYM_FUNC_START_WEAK_NOALIGN -- use for weak functions, w/o alignment */ 146 #define SYM_FUNC_START_WEAK_NOALIGN(name) \ 147 SYM_START(name, SYM_L_WEAK, SYM_A_NONE) \ 148 ENDBR 149 150 #endif /* _ASM_X86_LINKAGE_H */ 151 152