| From 13648b0118a24f4fc76c34e6c7b6ccf447e46a2a Mon Sep 17 00:00:00 2001 |
| From: Vineet Gupta <vgupta@synopsys.com> |
| Date: Fri, 27 Feb 2015 10:39:17 +0530 |
| Subject: ARC: Fix KSTK_ESP() |
| |
| 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 |