lkml.org 
[lkml]   [2018]   [Mar]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 21/76] x86: Clean up current_stack_pointer
    3.16.56-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Andy Lutomirski <luto@amacapital.net>

    commit 83653c16da91112236292871b820cb8b367220e3 upstream.

    There's no good reason for it to be a macro, and x86_64 will want to
    use it, so it should be in a header.

    Acked-by: Borislav Petkov <bp@suse.de>
    Signed-off-by: Andy Lutomirski <luto@amacapital.net>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    arch/x86/include/asm/thread_info.h | 11 +++++++++++
    arch/x86/kernel/irq_32.c | 13 +++----------
    2 files changed, 14 insertions(+), 10 deletions(-)

    --- a/arch/x86/include/asm/thread_info.h
    +++ b/arch/x86/include/asm/thread_info.h
    @@ -170,6 +170,17 @@ static inline struct thread_info *curren
    return ti;
    }

    +static inline unsigned long current_stack_pointer(void)
    +{
    + unsigned long sp;
    +#ifdef CONFIG_X86_64
    + asm("mov %%rsp,%0" : "=g" (sp));
    +#else
    + asm("mov %%esp,%0" : "=g" (sp));
    +#endif
    + return sp;
    +}
    +
    #else /* !__ASSEMBLY__ */

    /* how to get the thread information struct from ASM */
    --- a/arch/x86/kernel/irq_32.c
    +++ b/arch/x86/kernel/irq_32.c
    @@ -69,16 +69,9 @@ static void call_on_stack(void *func, vo
    : "memory", "cc", "edx", "ecx", "eax");
    }

    -/* how to get the current stack pointer from C */
    -#define current_stack_pointer ({ \
    - unsigned long sp; \
    - asm("mov %%esp,%0" : "=g" (sp)); \
    - sp; \
    -})
    -
    static inline void *current_stack(void)
    {
    - return (void *)(current_stack_pointer & ~(THREAD_SIZE - 1));
    + return (void *)(current_stack_pointer() & ~(THREAD_SIZE - 1));
    }

    static inline int
    @@ -103,7 +96,7 @@ execute_on_irq_stack(int overflow, struc

    /* Save the next esp at the bottom of the stack */
    prev_esp = (u32 *)irqstk;
    - *prev_esp = current_stack_pointer;
    + *prev_esp = current_stack_pointer();

    if (unlikely(overflow))
    call_on_stack(print_stack_overflow, isp);
    @@ -156,7 +149,7 @@ void do_softirq_own_stack(void)

    /* Push the previous esp onto the stack */
    prev_esp = (u32 *)irqstk;
    - *prev_esp = current_stack_pointer;
    + *prev_esp = current_stack_pointer();

    call_on_stack(__do_softirq, isp);
    }
    \
     
     \ /
      Last update: 2018-03-12 04:35    [W:4.026 / U:1.732 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site