Commit 2cb15faa authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Peter Zijlstra

x86/cpu: Re-enable stackprotector

Commit 5416c266 ("x86: make sure load_percpu_segment has no
stackprotector") disabled the stackprotector for cpu/common.c because of
load_percpu_segment(). Back then the boot stack canary was initialized very
early in start_kernel(). Switching the per CPU area by loading the GDT
caused the stackprotector to fail with paravirt enabled kernels as the
GSBASE was not updated yet. In hindsight a wrong change because it would
have been sufficient to ensure that the canary is the same in both per CPU
areas.

Commit d5553523 ("random: move rand_initialize() earlier") moved the
stack canary initialization to a later point in the init sequence. As a
consequence the per CPU stack canary is 0 when switching the per CPU areas,
so there is no requirement anymore to exclude this file.

Add a comment to load_percpu_segment().
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220915111143.303010511@infradead.org
parent 1f19e2d5
...@@ -17,9 +17,6 @@ KMSAN_SANITIZE_common.o := n ...@@ -17,9 +17,6 @@ KMSAN_SANITIZE_common.o := n
# As above, instrumenting secondary CPU boot code causes boot hangs. # As above, instrumenting secondary CPU boot code causes boot hangs.
KCSAN_SANITIZE_common.o := n KCSAN_SANITIZE_common.o := n
# Make sure load_percpu_segment has no stackprotector
CFLAGS_common.o := -fno-stack-protector
obj-y := cacheinfo.o scattered.o topology.o obj-y := cacheinfo.o scattered.o topology.o
obj-y += common.o obj-y += common.o
obj-y += rdrand.o obj-y += rdrand.o
......
...@@ -752,6 +752,9 @@ void __init switch_gdt_and_percpu_base(int cpu) ...@@ -752,6 +752,9 @@ void __init switch_gdt_and_percpu_base(int cpu)
* early mapping is still valid. That means the GSBASE update will * early mapping is still valid. That means the GSBASE update will
* lose any prior per CPU data which was not copied over in * lose any prior per CPU data which was not copied over in
* setup_per_cpu_areas(). * setup_per_cpu_areas().
*
* This works even with stackprotector enabled because the
* per CPU stack canary is 0 in both per CPU areas.
*/ */
wrmsrl(MSR_GS_BASE, cpu_kernelmode_gs_base(cpu)); wrmsrl(MSR_GS_BASE, cpu_kernelmode_gs_base(cpu));
#else #else
......
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