ARC: Fix KSTK_ESP()

/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.

Cc: <stable@vger.kernel.org>
Reported-and-suggested-by: Alexey Brodkin <abrodkin@synopsys.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
This commit is contained in:
Vineet Gupta 2015-02-27 10:39:17 +05:30
parent ceed97ab4f
commit 13648b0118
2 changed files with 8 additions and 7 deletions

View File

@ -72,18 +72,19 @@ unsigned long thread_saved_pc(struct task_struct *t);
#define release_segments(mm) do { } while (0) #define release_segments(mm) do { } while (0)
#define KSTK_EIP(tsk) (task_pt_regs(tsk)->ret) #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. * 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 * 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))) sizeof(struct callee_regs) + off)))
#define KSTK_BLINK(tsk) KSTK_REG(tsk, 4) #define TSK_K_BLINK(tsk) TSK_K_REG(tsk, 4)
#define KSTK_FP(tsk) KSTK_REG(tsk, 0) #define TSK_K_FP(tsk) TSK_K_REG(tsk, 0)
extern void start_thread(struct pt_regs * regs, unsigned long pc, extern void start_thread(struct pt_regs * regs, unsigned long pc,
unsigned long usp); unsigned long usp);

View File

@ -73,9 +73,9 @@ static void seed_unwind_frame_info(struct task_struct *tsk,
frame_info->task = tsk; frame_info->task = tsk;
frame_info->regs.r27 = KSTK_FP(tsk); frame_info->regs.r27 = TSK_K_FP(tsk);
frame_info->regs.r28 = KSTK_ESP(tsk); frame_info->regs.r28 = TSK_K_ESP(tsk);
frame_info->regs.r31 = KSTK_BLINK(tsk); frame_info->regs.r31 = TSK_K_BLINK(tsk);
frame_info->regs.r63 = (unsigned int)__switch_to; frame_info->regs.r63 = (unsigned int)__switch_to;
/* In the prologue of __switch_to, first FP is saved on stack /* In the prologue of __switch_to, first FP is saved on stack