lkml.org 
[lkml]   [2022]   [Sep]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2 04/59] x86/cpu: Re-enable stackprotector
    From: Thomas Gleixner <tglx@linutronix.de>

    Commit 5416c2663517 ("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 d55535232c3d ("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: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    arch/x86/kernel/cpu/Makefile | 3 ---
    arch/x86/kernel/cpu/common.c | 3 +++
    2 files changed, 3 insertions(+), 3 deletions(-)

    --- a/arch/x86/kernel/cpu/Makefile
    +++ b/arch/x86/kernel/cpu/Makefile
    @@ -16,9 +16,6 @@ KCOV_INSTRUMENT_perf_event.o := n
    # As above, instrumenting secondary CPU boot code causes boot hangs.
    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 += common.o
    obj-y += rdrand.o
    --- a/arch/x86/kernel/cpu/common.c
    +++ b/arch/x86/kernel/cpu/common.c
    @@ -752,6 +752,9 @@ void __init switch_gdt_and_percpu_base(i
    * early mapping is still valid. That means the GSBASE update will
    * lose any prior per CPU data which was not copied over in
    * 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));
    #else

    \
     
     \ /
      Last update: 2022-09-02 16:29    [W:3.677 / U:1.260 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site