summaryrefslogtreecommitdiffstats
path: root/init
diff options
context:
space:
mode:
authorndesaulniers@google.com <ndesaulniers@google.com>2023-04-18 00:00:06 +0200
committerJosh Poimboeuf <jpoimboe@kernel.org>2023-05-16 15:28:24 +0200
commitdc1d05536f44cee16e46e86316e6718b2c0d8872 (patch)
treec63e9b66f55385705504149293da0407fc15303b /init
parentstart_kernel: Add __no_stack_protector function attribute (diff)
downloadlinux-dc1d05536f44cee16e46e86316e6718b2c0d8872.tar.xz
linux-dc1d05536f44cee16e46e86316e6718b2c0d8872.zip
start_kernel: Omit prevent_tail_call_optimization() for newer toolchains
prevent_tail_call_optimization() was added in commit a9a3ed1eff36 ("x86: Fix early boot crash on gcc-10, third try") to work around stack canaries getting inserted into functions that would initialize the stack canary in the first place. Now that we have no_stack_protector function attribute (gcc-11+, clang-7+) and use it on start_kernel(), remove the call to prevent_tail_call_optimization() such that we may one day remove it outright. Reviewed-by: Nathan Chancellor <nathan@kernel.org> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> Link: https://lore.kernel.org/r/20230412-no_stackp-v2-2-116f9fe4bbe7@google.com Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Diffstat (limited to 'init')
-rw-r--r--init/main.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/init/main.c b/init/main.c
index c445c1fb19b9..c0b6499c31db 100644
--- a/init/main.c
+++ b/init/main.c
@@ -1088,7 +1088,13 @@ void start_kernel(void)
/* Do the rest non-__init'ed, we're now alive */
arch_call_rest_init();
+ /*
+ * Avoid stack canaries in callers of boot_init_stack_canary for gcc-10
+ * and older.
+ */
+#if !__has_attribute(__no_stack_protector__)
prevent_tail_call_optimization();
+#endif
}
/* Call all constructor functions linked into the kernel. */