The __CFI_ADDRESSABLE macro is used for init_module and cleanup_module to ensure we have the address of the CFI jump table, and with CONFIG_X86_KERNEL_IBT to ensure LTO won't optimize away the symbols. As __CFI_ADDRESSABLE is no longer necessary with -fsanitize=kcfi, add a more flexible version of the __ADDRESSABLE macro and always ensure these symbols won't be dropped.
Unified · Split
| @@ -13,26 +13,6 @@ typedef void (*cfi_check_fn)(uint64_t id, void *ptr, void *diag); · 12 unmodified lines | ||
| 13 | 13 | /* Compiler-generated function in each module, and the kernel */ |
| 14 | 14 | extern void __cfi_check(uint64_t id, void *ptr, void *diag); |
| 15 | 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 | −#else /* !CONFIG_CFI_CLANG */ | |
| 24 | − | |
| 25 | −#ifdef CONFIG_X86_KERNEL_IBT | |
| 26 | − | |
| 27 | −#define __CFI_ADDRESSABLE(fn, __attr) \ | |
| 28 | − const void *__cfi_jt_ ## fn __visible __attr = (void *)&fn | |
| 29 | − | |
| 30 | −#endif /* CONFIG_X86_KERNEL_IBT */ | |
| 31 | − | |
| 32 | 16 | #endif /* CONFIG_CFI_CLANG */ |
| 33 | 17 | |
| 34 | −#ifndef __CFI_ADDRESSABLE | |
| 35 | −#define __CFI_ADDRESSABLE(fn, __attr) | |
| 36 | −#endif | |
| 37 | − | |
| 38 | 18 | #endif /* _LINUX_CFI_H */ |
| @@ -221,9 +221,11 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, · 220 unmodified lines | ||
| 221 | 221 | * otherwise, or eliminated entirely due to lack of references that are |
| 222 | 222 | * visible to the compiler. |
| 223 | 223 | */ |
| 224 | −#define __ADDRESSABLE(sym) \ | |
| 225 | − static void * __section(".discard.addressable") __used \ | |
| 224 | +#define ___ADDRESSABLE(sym, __attrs) \ | |
| 225 | + static void * __used __attrs \ | |
| 226 | 226 | __UNIQUE_ID(__PASTE(__addressable_,sym)) = (void *)&sym; |
| 227 | +#define __ADDRESSABLE(sym) \ | |
| 228 | + ___ADDRESSABLE(sym, __section(".discard.addressable")) | |
| 227 | 229 | |
| 228 | 230 | /** |
| 229 | 231 | * offset_to_ptr - convert a relative memory offset to an absolute pointer |
| @@ -132,7 +132,7 @@ extern void cleanup_module(void); · 131 unmodified lines | ||
| 132 | 132 | { return initfn; } \ |
| 133 | 133 | int init_module(void) __copy(initfn) \ |
| 134 | 134 | __attribute__((alias(#initfn))); \ |
| 135 | − __CFI_ADDRESSABLE(init_module, __initdata); | |
| 135 | + ___ADDRESSABLE(init_module, __initdata); | |
| 136 | 136 | |
| 137 | 137 | /* This is only required if you want to be unloadable. */ |
| 138 | 138 | #define module_exit(exitfn) \ |
| @@ -140,7 +140,7 @@ extern void cleanup_module(void); · 1 unmodified line | ||
| 140 | 140 | { return exitfn; } \ |
| 141 | 141 | void cleanup_module(void) __copy(exitfn) \ |
| 142 | 142 | __attribute__((alias(#exitfn))); \ |
| 143 | − __CFI_ADDRESSABLE(cleanup_module, __exitdata); | |
| 143 | + ___ADDRESSABLE(cleanup_module, __exitdata); | |
| 144 | 144 | |
| 145 | 145 | #endif |
| 146 | 146 | |