Skip to content

Commit 0b81582

Browse files
keesPeter Zijlstra
authored andcommitted
x86/cfi: Remove __noinitretpoline and __noretpoline
Commit 66f7930 ("x86/retpoline: Avoid retpolines for built-in __init functions") disabled retpolines in __init sections (__noinitretpoline) as a precaution against potential issues with retpolines in early boot, but it has not been a problem in practice (i.e. see Clang below). Commit 8735871 ("x86/retpoline: Support retpoline builds with Clang") narrowed this to only GCC, as Clang doesn't have per-function control over retpoline emission. As such, Clang has been booting with retpolines in __init since retpoline support was introduced. Clang KCFI has been instrumenting __init since CFI was introduced. With the introduction of KCFI for GCC, KCFI instrumentation with retpolines disabled means that objtool does not construct .retpoline_sites section entries for the non-retpoline KCFI calls. At boot, the KCFI rehashing code, via __apply_fineibt(), misses all __init KCFI calls (since they are not retpolines), resulting in immediate hash mismatches: all preambles are rehashed (via .cfi_sites) and none of the __init call sites are rehashed. Remove __noinitretpoline since it provides no meaningful utility and creates problems with CFI. Additionally remove __noretpoline since it is now unused. Alternatively, cfi_rand_callers() could walk the .kcfi_traps section which is exactly the list of KCFI instrumentation sites. But it seems better to have as few differences in common instruction sequences between compilers as possible, so better to remove the special handling of retpolines in __init for GCC. Signed-off-by: Kees Cook <kees@kernel.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/r/20250904034656.3670313-6-kees@kernel.org
1 parent 026211c commit 0b81582

File tree

2 files changed

+0
-12
lines changed

2 files changed

+0
-12
lines changed

include/linux/compiler-gcc.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@
3535
(typeof(ptr)) (__ptr + (off)); \
3636
})
3737

38-
#ifdef CONFIG_MITIGATION_RETPOLINE
39-
#define __noretpoline __attribute__((__indirect_branch__("keep")))
40-
#endif
41-
4238
#if defined(LATENT_ENTROPY_PLUGIN) && !defined(__CHECKER__)
4339
#define __latent_entropy __attribute__((latent_entropy))
4440
#endif

include/linux/init.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,6 @@
77
#include <linux/stringify.h>
88
#include <linux/types.h>
99

10-
/* Built-in __init functions needn't be compiled with retpoline */
11-
#if defined(__noretpoline) && !defined(MODULE)
12-
#define __noinitretpoline __noretpoline
13-
#else
14-
#define __noinitretpoline
15-
#endif
16-
1710
/* These macros are used to mark some functions or
1811
* initialized data (doesn't apply to uninitialized data)
1912
* as `initialization' functions. The kernel can take this
@@ -50,7 +43,6 @@
5043
/* These are for everybody (although not all archs will actually
5144
discard it in modules) */
5245
#define __init __section(".init.text") __cold __latent_entropy \
53-
__noinitretpoline \
5446
__no_kstack_erase
5547
#define __initdata __section(".init.data")
5648
#define __initconst __section(".init.rodata")

0 commit comments

Comments
 (0)