Commit 43567139 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'x86_urgent_for_v5.7-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 fix from Borislav Petkov:
 "A single fix for early boot crashes of kernels built with gcc10 and
  stack protector enabled"

* tag 'x86_urgent_for_v5.7-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86: Fix early boot crash on gcc-10, third try
parents 5a9ffb95 a9a3ed1e
...@@ -55,8 +55,13 @@ ...@@ -55,8 +55,13 @@
/* /*
* Initialize the stackprotector canary value. * Initialize the stackprotector canary value.
* *
* NOTE: this must only be called from functions that never return, * NOTE: this must only be called from functions that never return
* and it must always be inlined. * and it must always be inlined.
*
* In addition, it should be called from a compilation unit for which
* stack protector is disabled. Alternatively, the caller should not end
* with a function call which gets tail-call optimized as that would
* lead to checking a modified canary value.
*/ */
static __always_inline void boot_init_stack_canary(void) static __always_inline void boot_init_stack_canary(void)
{ {
......
...@@ -266,6 +266,14 @@ static void notrace start_secondary(void *unused) ...@@ -266,6 +266,14 @@ static void notrace start_secondary(void *unused)
wmb(); wmb();
cpu_startup_entry(CPUHP_AP_ONLINE_IDLE); cpu_startup_entry(CPUHP_AP_ONLINE_IDLE);
/*
* Prevent tail call to cpu_startup_entry() because the stack protector
* guard has been changed a couple of function calls up, in
* boot_init_stack_canary() and must not be checked before tail calling
* another function.
*/
prevent_tail_call_optimization();
} }
/** /**
......
...@@ -93,6 +93,7 @@ asmlinkage __visible void cpu_bringup_and_idle(void) ...@@ -93,6 +93,7 @@ asmlinkage __visible void cpu_bringup_and_idle(void)
cpu_bringup(); cpu_bringup();
boot_init_stack_canary(); boot_init_stack_canary();
cpu_startup_entry(CPUHP_AP_ONLINE_IDLE); cpu_startup_entry(CPUHP_AP_ONLINE_IDLE);
prevent_tail_call_optimization();
} }
void xen_smp_intr_free_pv(unsigned int cpu) void xen_smp_intr_free_pv(unsigned int cpu)
......
...@@ -356,4 +356,10 @@ static inline void *offset_to_ptr(const int *off) ...@@ -356,4 +356,10 @@ static inline void *offset_to_ptr(const int *off)
/* &a[0] degrades to a pointer: a different type from an array */ /* &a[0] degrades to a pointer: a different type from an array */
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) #define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
/*
* This is needed in functions which generate the stack canary, see
* arch/x86/kernel/smpboot.c::start_secondary() for an example.
*/
#define prevent_tail_call_optimization() mb()
#endif /* __LINUX_COMPILER_H */ #endif /* __LINUX_COMPILER_H */
...@@ -1038,6 +1038,8 @@ asmlinkage __visible void __init start_kernel(void) ...@@ -1038,6 +1038,8 @@ asmlinkage __visible void __init start_kernel(void)
/* Do the rest non-__init'ed, we're now alive */ /* Do the rest non-__init'ed, we're now alive */
arch_call_rest_init(); arch_call_rest_init();
prevent_tail_call_optimization();
} }
/* Call all constructor functions linked into the kernel. */ /* Call all constructor functions linked into the kernel. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment