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