lkml.org 
[lkml]   [2015]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.19 103/177] ARC: Fix KSTK_ESP()
    Date
    3.19-stable review patch.  If anyone has any objections, please let me know.

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

    From: Vineet Gupta <vgupta@synopsys.com>

    commit 13648b0118a24f4fc76c34e6c7b6ccf447e46a2a upstream.

    /proc/<pid>/maps currently don't annotate stack vma with "[stack]"
    This is because KSTK_ESP ie expected to return usermode SP of tsk while
    currently it returns the kernel mode SP of a sleeping tsk.

    While the fix is trivial, we also need to adjust the ARC kernel stack
    unwinder to not use KSTK_SP and friends any more.

    Reported-and-suggested-by: Alexey Brodkin <abrodkin@synopsys.com>
    Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/arc/include/asm/processor.h | 9 +++++----
    arch/arc/kernel/stacktrace.c | 6 +++---
    2 files changed, 8 insertions(+), 7 deletions(-)

    --- a/arch/arc/include/asm/processor.h
    +++ b/arch/arc/include/asm/processor.h
    @@ -75,18 +75,19 @@ unsigned long thread_saved_pc(struct tas
    #define release_segments(mm) do { } while (0)

    #define KSTK_EIP(tsk) (task_pt_regs(tsk)->ret)
    +#define KSTK_ESP(tsk) (task_pt_regs(tsk)->sp)

    /*
    * Where abouts of Task's sp, fp, blink when it was last seen in kernel mode.
    * Look in process.c for details of kernel stack layout
    */
    -#define KSTK_ESP(tsk) (tsk->thread.ksp)
    +#define TSK_K_ESP(tsk) (tsk->thread.ksp)

    -#define KSTK_REG(tsk, off) (*((unsigned int *)(KSTK_ESP(tsk) + \
    +#define TSK_K_REG(tsk, off) (*((unsigned int *)(TSK_K_ESP(tsk) + \
    sizeof(struct callee_regs) + off)))

    -#define KSTK_BLINK(tsk) KSTK_REG(tsk, 4)
    -#define KSTK_FP(tsk) KSTK_REG(tsk, 0)
    +#define TSK_K_BLINK(tsk) TSK_K_REG(tsk, 4)
    +#define TSK_K_FP(tsk) TSK_K_REG(tsk, 0)

    extern void start_thread(struct pt_regs * regs, unsigned long pc,
    unsigned long usp);
    --- a/arch/arc/kernel/stacktrace.c
    +++ b/arch/arc/kernel/stacktrace.c
    @@ -64,9 +64,9 @@ static void seed_unwind_frame_info(struc

    frame_info->task = tsk;

    - frame_info->regs.r27 = KSTK_FP(tsk);
    - frame_info->regs.r28 = KSTK_ESP(tsk);
    - frame_info->regs.r31 = KSTK_BLINK(tsk);
    + frame_info->regs.r27 = TSK_K_FP(tsk);
    + frame_info->regs.r28 = TSK_K_ESP(tsk);
    + frame_info->regs.r31 = TSK_K_BLINK(tsk);
    frame_info->regs.r63 = (unsigned int)__switch_to;

    /* In the prologue of __switch_to, first FP is saved on stack



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