lkml.org 
[lkml]   [2017]   [Nov]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 18/43] x86/entry/64: Move the IST stacks into cpu_entry_area
    Date
    From: Andy Lutomirski <luto@kernel.org>

    The IST stacks are needed when an IST exception occurs and are
    accessed before any kernel code at all runs. Move them into
    cpu_entry_area.

    Signed-off-by: Andy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Borislav Petkov <bpetkov@suse.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/0ffddccdc0ce1953f950a553142662cf68258fb7.1511497875.git.luto@kernel.org
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    ---
    arch/x86/include/asm/fixmap.h | 10 ++++++++++
    arch/x86/kernel/cpu/common.c | 40 +++++++++++++++++++++++++---------------
    2 files changed, 35 insertions(+), 15 deletions(-)

    diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h
    index 7eb1b5490395..15cf010225c9 100644
    --- a/arch/x86/include/asm/fixmap.h
    +++ b/arch/x86/include/asm/fixmap.h
    @@ -60,6 +60,16 @@ struct cpu_entry_area {
    struct tss_struct tss;

    char entry_trampoline[PAGE_SIZE];
    +
    +#ifdef CONFIG_X86_64
    + /*
    + * Exception stacks used for IST entries.
    + *
    + * In the future, this should have a separate slot for each stack
    + * with guard pages between them.
    + */
    + char exception_stacks[(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ + DEBUG_STKSZ];
    +#endif
    };

    #define CPU_ENTRY_AREA_PAGES (sizeof(struct cpu_entry_area) / PAGE_SIZE)
    diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
    index 5a05db084659..6b949e6ea0f9 100644
    --- a/arch/x86/kernel/cpu/common.c
    +++ b/arch/x86/kernel/cpu/common.c
    @@ -503,6 +503,22 @@ static void set_percpu_fixmap_pages(int fixmap_index, void *ptr, int pages, pgpr
    DEFINE_PER_CPU(struct cpu_entry_area *, cpu_entry_area);
    #endif

    +#ifdef CONFIG_X86_64
    +/*
    + * Special IST stacks which the CPU switches to when it calls
    + * an IST-marked descriptor entry. Up to 7 stacks (hardware
    + * limit), all of them are 4K, except the debug stack which
    + * is 8K.
    + */
    +static const unsigned int exception_stack_sizes[N_EXCEPTION_STACKS] = {
    + [0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STKSZ,
    + [DEBUG_STACK - 1] = DEBUG_STKSZ
    +};
    +
    +static DEFINE_PER_CPU_PAGE_ALIGNED(char, exception_stacks
    + [(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ + DEBUG_STKSZ]);
    +#endif
    +
    /* Setup the fixmap mappings only once per-processor */
    static inline void setup_cpu_entry_area(int cpu)
    {
    @@ -557,6 +573,14 @@ static inline void setup_cpu_entry_area(int cpu)
    #endif

    #ifdef CONFIG_X86_64
    + BUILD_BUG_ON(sizeof(exception_stacks) % PAGE_SIZE != 0);
    + BUILD_BUG_ON(sizeof(exception_stacks) !=
    + sizeof(((struct cpu_entry_area *)0)->exception_stacks));
    + set_percpu_fixmap_pages(get_cpu_entry_area_index(cpu, exception_stacks),
    + &per_cpu(exception_stacks, cpu),
    + sizeof(exception_stacks) / PAGE_SIZE,
    + PAGE_KERNEL);
    +
    __set_fixmap(get_cpu_entry_area_index(cpu, entry_trampoline),
    __pa_symbol(_entry_trampoline), PAGE_KERNEL_RX);
    #endif
    @@ -1407,20 +1431,6 @@ DEFINE_PER_CPU(unsigned int, irq_count) __visible = -1;
    DEFINE_PER_CPU(int, __preempt_count) = INIT_PREEMPT_COUNT;
    EXPORT_PER_CPU_SYMBOL(__preempt_count);

    -/*
    - * Special IST stacks which the CPU switches to when it calls
    - * an IST-marked descriptor entry. Up to 7 stacks (hardware
    - * limit), all of them are 4K, except the debug stack which
    - * is 8K.
    - */
    -static const unsigned int exception_stack_sizes[N_EXCEPTION_STACKS] = {
    - [0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STKSZ,
    - [DEBUG_STACK - 1] = DEBUG_STKSZ
    -};
    -
    -static DEFINE_PER_CPU_PAGE_ALIGNED(char, exception_stacks
    - [(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ + DEBUG_STKSZ]);
    -
    /* May not be marked __init: used by software suspend */
    void syscall_init(void)
    {
    @@ -1626,7 +1636,7 @@ void cpu_init(void)
    * set up and load the per-CPU TSS
    */
    if (!oist->ist[0]) {
    - char *estacks = per_cpu(exception_stacks, cpu);
    + char *estacks = get_cpu_entry_area(cpu)->exception_stacks;

    for (v = 0; v < N_EXCEPTION_STACKS; v++) {
    estacks += exception_stack_sizes[v];
    --
    2.14.1
    \
     
     \ /
      Last update: 2017-11-24 10:26    [W:8.609 / U:0.156 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site