lkml.org 
[lkml]   [2015]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/asm] x86/asm/entry: Unify and fix initial thread_struct: :sp0 values
    Commit-ID:  6ecb31635fd0d342b04b9a8e58f2e11382b99bee
    Gitweb: http://git.kernel.org/tip/6ecb31635fd0d342b04b9a8e58f2e11382b99bee
    Author: Andy Lutomirski <luto@amacapital.net>
    AuthorDate: Tue, 10 Mar 2015 11:05:59 -0700
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitDate: Mon, 16 Mar 2015 11:05:36 +0100

    x86/asm/entry: Unify and fix initial thread_struct::sp0 values

    x86_32 and x86_64 need slightly different thread_struct::sp0 values, and
    x86_32's was incorrect for init.

    This never mattered -- the init thread never runs user code, so we never
    used thread_struct::sp0 for anything.

    Fix it and mostly unify them.

    Signed-off-by: Andy Lutomirski <luto@amacapital.net>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/1b810c1d2e797e27bb4a7708c426101161edd1f6.1426009661.git.luto@amacapital.net
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    ---
    arch/x86/include/asm/processor.h | 7 +++++--
    arch/x86/kernel/process.c | 2 +-
    2 files changed, 6 insertions(+), 3 deletions(-)

    diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
    index 554da61..aed6d4f 100644
    --- a/arch/x86/include/asm/processor.h
    +++ b/arch/x86/include/asm/processor.h
    @@ -810,6 +810,9 @@ static inline void spin_lock_prefetch(const void *x)
    prefetchw(x);
    }

    +#define TOP_OF_INIT_STACK ((unsigned long)&init_stack + sizeof(init_stack) - \
    + TOP_OF_KERNEL_STACK_PADDING)
    +
    #ifdef CONFIG_X86_32
    /*
    * User space process size: 3GB (default).
    @@ -820,7 +823,7 @@ static inline void spin_lock_prefetch(const void *x)
    #define STACK_TOP_MAX STACK_TOP

    #define INIT_THREAD { \
    - .sp0 = sizeof(init_stack) + (long)&init_stack, \
    + .sp0 = TOP_OF_INIT_STACK, \
    .vm86_info = NULL, \
    .sysenter_cs = __KERNEL_CS, \
    .io_bitmap_ptr = NULL, \
    @@ -882,7 +885,7 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk);
    #define STACK_TOP_MAX TASK_SIZE_MAX

    #define INIT_THREAD { \
    - .sp0 = (unsigned long)&init_stack + sizeof(init_stack) \
    + .sp0 = TOP_OF_INIT_STACK \
    }

    /*
    diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
    index f4c0af7..12b1cf6 100644
    --- a/arch/x86/kernel/process.c
    +++ b/arch/x86/kernel/process.c
    @@ -39,7 +39,7 @@
    */
    __visible DEFINE_PER_CPU_SHARED_ALIGNED(struct tss_struct, cpu_tss) = {
    .x86_tss = {
    - .sp0 = (unsigned long)&init_stack + sizeof(init_stack),
    + .sp0 = TOP_OF_INIT_STACK,
    #ifdef CONFIG_X86_32
    .ss0 = __KERNEL_DS,
    .ss1 = __KERNEL_CS,

    \
     
     \ /
      Last update: 2015-03-16 13:21    [W:4.751 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site