xref: /openbmc/linux/arch/x86/include/asm/linkage.h (revision 10f4c9b9)
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 
1125e73b7eSPeter Zijlstra #ifdef CONFIG_64BIT
1225e73b7eSPeter Zijlstra /*
1325e73b7eSPeter Zijlstra  * The generic version tends to create spurious ENDBR instructions under
1425e73b7eSPeter Zijlstra  * certain conditions.
1525e73b7eSPeter Zijlstra  */
1625e73b7eSPeter Zijlstra #define _THIS_IP_ ({ unsigned long __here; asm ("lea 0(%%rip), %0" : "=r" (__here)); __here; })
1725e73b7eSPeter Zijlstra #endif
1825e73b7eSPeter 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 
108*10f4c9b9SVincent Whitchurch /* UML needs to be able to override memcpy() and friends for KASAN. */
109*10f4c9b9SVincent Whitchurch #ifdef CONFIG_UML
110*10f4c9b9SVincent Whitchurch # define SYM_FUNC_ALIAS_MEMFUNC	SYM_FUNC_ALIAS_WEAK
111*10f4c9b9SVincent Whitchurch #else
112*10f4c9b9SVincent Whitchurch # define SYM_FUNC_ALIAS_MEMFUNC	SYM_FUNC_ALIAS
113*10f4c9b9SVincent Whitchurch #endif
114*10f4c9b9SVincent Whitchurch 
115ccace936SSami Tolvanen /* SYM_TYPED_FUNC_START -- use for indirectly called globals, w/ CFI type */
116ccace936SSami Tolvanen #define SYM_TYPED_FUNC_START(name)				\
1174a2c3448SJosh Poimboeuf 	SYM_TYPED_START(name, SYM_L_GLOBAL, SYM_F_ALIGN)	\
118ccace936SSami Tolvanen 	ENDBR
119ccace936SSami Tolvanen 
120c4691712SPeter Zijlstra /* SYM_FUNC_START -- use for global functions */
121c4691712SPeter Zijlstra #define SYM_FUNC_START(name)				\
1228eb5d34eSThomas Gleixner 	SYM_START(name, SYM_L_GLOBAL, SYM_F_ALIGN)	\
123c4691712SPeter Zijlstra 	ENDBR
124c4691712SPeter Zijlstra 
125c4691712SPeter Zijlstra /* 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)			\
1328eb5d34eSThomas Gleixner 	SYM_START(name, SYM_L_LOCAL, SYM_F_ALIGN)	\
133c4691712SPeter Zijlstra 	ENDBR
134c4691712SPeter Zijlstra 
135c4691712SPeter Zijlstra /* 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)			\
1428eb5d34eSThomas Gleixner 	SYM_START(name, SYM_L_WEAK, SYM_F_ALIGN)	\
143c4691712SPeter Zijlstra 	ENDBR
144c4691712SPeter Zijlstra 
145c4691712SPeter Zijlstra /* SYM_FUNC_START_WEAK_NOALIGN -- use for weak functions, w/o alignment */
146c4691712SPeter Zijlstra #define SYM_FUNC_START_WEAK_NOALIGN(name)		\
147c4691712SPeter Zijlstra 	SYM_START(name, SYM_L_WEAK, SYM_A_NONE)		\
148c4691712SPeter Zijlstra 	ENDBR
149c4691712SPeter Zijlstra 
1501965aae3SH. Peter Anvin #endif /* _ASM_X86_LINKAGE_H */
151bb898558SAl Viro 
152