Commit | Line | Data |
---|---|---|
cf68fffb ST |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* | |
3 | * Clang Control Flow Integrity (CFI) support. | |
4 | * | |
5 | * Copyright (C) 2021 Google LLC | |
6 | */ | |
7 | #ifndef _LINUX_CFI_H | |
8 | #define _LINUX_CFI_H | |
9 | ||
10 | #ifdef CONFIG_CFI_CLANG | |
11 | typedef void (*cfi_check_fn)(uint64_t id, void *ptr, void *diag); | |
12 | ||
13 | /* Compiler-generated function in each module, and the kernel */ | |
14 | extern void __cfi_check(uint64_t id, void *ptr, void *diag); | |
15 | ||
16 | /* | |
17 | * Force the compiler to generate a CFI jump table entry for a function | |
18 | * and store the jump table address to __cfi_jt_<function>. | |
19 | */ | |
20 | #define __CFI_ADDRESSABLE(fn, __attr) \ | |
21 | const void *__cfi_jt_ ## fn __visible __attr = (void *)&fn | |
22 | ||
23 | #ifdef CONFIG_CFI_CLANG_SHADOW | |
24 | ||
25 | extern void cfi_module_add(struct module *mod, unsigned long base_addr); | |
26 | extern void cfi_module_remove(struct module *mod, unsigned long base_addr); | |
27 | ||
28 | #else | |
29 | ||
30 | static inline void cfi_module_add(struct module *mod, unsigned long base_addr) {} | |
31 | static inline void cfi_module_remove(struct module *mod, unsigned long base_addr) {} | |
32 | ||
33 | #endif /* CONFIG_CFI_CLANG_SHADOW */ | |
34 | ||
35 | #else /* !CONFIG_CFI_CLANG */ | |
36 | ||
cb9010f8 PZ |
37 | #ifdef CONFIG_X86_KERNEL_IBT |
38 | ||
39 | #define __CFI_ADDRESSABLE(fn, __attr) \ | |
40 | const void *__cfi_jt_ ## fn __visible __attr = (void *)&fn | |
41 | ||
42 | #endif /* CONFIG_X86_KERNEL_IBT */ | |
cf68fffb ST |
43 | |
44 | #endif /* CONFIG_CFI_CLANG */ | |
45 | ||
cb9010f8 PZ |
46 | #ifndef __CFI_ADDRESSABLE |
47 | #define __CFI_ADDRESSABLE(fn, __attr) | |
48 | #endif | |
49 | ||
cf68fffb | 50 | #endif /* _LINUX_CFI_H */ |