xref: /openbmc/linux/include/linux/cfi_types.h (revision e84e008e)
1*e84e008eSSami Tolvanen /* SPDX-License-Identifier: GPL-2.0 */
2*e84e008eSSami Tolvanen /*
3*e84e008eSSami Tolvanen  * Clang Control Flow Integrity (CFI) type definitions.
4*e84e008eSSami Tolvanen  */
5*e84e008eSSami Tolvanen #ifndef _LINUX_CFI_TYPES_H
6*e84e008eSSami Tolvanen #define _LINUX_CFI_TYPES_H
7*e84e008eSSami Tolvanen 
8*e84e008eSSami Tolvanen #ifdef __ASSEMBLY__
9*e84e008eSSami Tolvanen #include <linux/linkage.h>
10*e84e008eSSami Tolvanen 
11*e84e008eSSami Tolvanen #ifdef CONFIG_CFI_CLANG
12*e84e008eSSami Tolvanen /*
13*e84e008eSSami Tolvanen  * Use the __kcfi_typeid_<function> type identifier symbol to
14*e84e008eSSami Tolvanen  * annotate indirectly called assembly functions. The compiler emits
15*e84e008eSSami Tolvanen  * these symbols for all address-taken function declarations in C
16*e84e008eSSami Tolvanen  * code.
17*e84e008eSSami Tolvanen  */
18*e84e008eSSami Tolvanen #ifndef __CFI_TYPE
19*e84e008eSSami Tolvanen #define __CFI_TYPE(name)				\
20*e84e008eSSami Tolvanen 	.4byte __kcfi_typeid_##name
21*e84e008eSSami Tolvanen #endif
22*e84e008eSSami Tolvanen 
23*e84e008eSSami Tolvanen #define SYM_TYPED_ENTRY(name, linkage, align...)	\
24*e84e008eSSami Tolvanen 	linkage(name) ASM_NL				\
25*e84e008eSSami Tolvanen 	align ASM_NL					\
26*e84e008eSSami Tolvanen 	__CFI_TYPE(name) ASM_NL				\
27*e84e008eSSami Tolvanen 	name:
28*e84e008eSSami Tolvanen 
29*e84e008eSSami Tolvanen #define SYM_TYPED_START(name, linkage, align...)	\
30*e84e008eSSami Tolvanen 	SYM_TYPED_ENTRY(name, linkage, align)
31*e84e008eSSami Tolvanen 
32*e84e008eSSami Tolvanen #else /* CONFIG_CFI_CLANG */
33*e84e008eSSami Tolvanen 
34*e84e008eSSami Tolvanen #define SYM_TYPED_START(name, linkage, align...)	\
35*e84e008eSSami Tolvanen 	SYM_START(name, linkage, align)
36*e84e008eSSami Tolvanen 
37*e84e008eSSami Tolvanen #endif /* CONFIG_CFI_CLANG */
38*e84e008eSSami Tolvanen 
39*e84e008eSSami Tolvanen #ifndef SYM_TYPED_FUNC_START
40*e84e008eSSami Tolvanen #define SYM_TYPED_FUNC_START(name) 			\
41*e84e008eSSami Tolvanen 	SYM_TYPED_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)
42*e84e008eSSami Tolvanen #endif
43*e84e008eSSami Tolvanen 
44*e84e008eSSami Tolvanen #endif /* __ASSEMBLY__ */
45*e84e008eSSami Tolvanen #endif /* _LINUX_CFI_TYPES_H */
46