diff options
author | Vineet Gupta <vgupta@synopsys.com> | 2015-02-27 00:09:17 -0500 |
---|---|---|
committer | Vineet Gupta <vgupta@synopsys.com> | 2015-02-27 00:18:23 -0500 |
commit | 13648b0118a24f4fc76c34e6c7b6ccf447e46a2a (patch) | |
tree | 1facc387bd1da19bb1ba8a343530135a1534dc57 /arch/arc | |
parent | ceed97ab4ff76cb5b1d616a810e941f8837dc440 (diff) |
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>
Diffstat (limited to 'arch/arc')
-rw-r--r-- | arch/arc/include/asm/processor.h | 9 | ||||
-rw-r--r-- | arch/arc/kernel/stacktrace.c | 6 |
2 files changed, 8 insertions, 7 deletions
diff --git a/arch/arc/include/asm/processor.h b/arch/arc/include/asm/processor.h index 4e547296831d..88398caa3989 100644 --- a/arch/arc/include/asm/processor.h +++ b/arch/arc/include/asm/processor.h | |||
@@ -72,18 +72,19 @@ unsigned long thread_saved_pc(struct task_struct *t); | |||
72 | #define release_segments(mm) do { } while (0) | 72 | #define release_segments(mm) do { } while (0) |
73 | 73 | ||
74 | #define KSTK_EIP(tsk) (task_pt_regs(tsk)->ret) | 74 | #define KSTK_EIP(tsk) (task_pt_regs(tsk)->ret) |
75 | #define KSTK_ESP(tsk) (task_pt_regs(tsk)->sp) | ||
75 | 76 | ||
76 | /* | 77 | /* |
77 | * Where abouts of Task's sp, fp, blink when it was last seen in kernel mode. | 78 | * Where abouts of Task's sp, fp, blink when it was last seen in kernel mode. |
78 | * Look in process.c for details of kernel stack layout | 79 | * Look in process.c for details of kernel stack layout |
79 | */ | 80 | */ |
80 | #define KSTK_ESP(tsk) (tsk->thread.ksp) | 81 | #define TSK_K_ESP(tsk) (tsk->thread.ksp) |
81 | 82 | ||
82 | #define KSTK_REG(tsk, off) (*((unsigned int *)(KSTK_ESP(tsk) + \ | 83 | #define TSK_K_REG(tsk, off) (*((unsigned int *)(TSK_K_ESP(tsk) + \ |
83 | sizeof(struct callee_regs) + off))) | 84 | sizeof(struct callee_regs) + off))) |
84 | 85 | ||
85 | #define KSTK_BLINK(tsk) KSTK_REG(tsk, 4) | 86 | #define TSK_K_BLINK(tsk) TSK_K_REG(tsk, 4) |
86 | #define KSTK_FP(tsk) KSTK_REG(tsk, 0) | 87 | #define TSK_K_FP(tsk) TSK_K_REG(tsk, 0) |
87 | 88 | ||
88 | extern void start_thread(struct pt_regs * regs, unsigned long pc, | 89 | extern void start_thread(struct pt_regs * regs, unsigned long pc, |
89 | unsigned long usp); | 90 | unsigned long usp); |
diff --git a/arch/arc/kernel/stacktrace.c b/arch/arc/kernel/stacktrace.c index 6492507a3d74..92320d6f737c 100644 --- a/arch/arc/kernel/stacktrace.c +++ b/arch/arc/kernel/stacktrace.c | |||
@@ -73,9 +73,9 @@ static void seed_unwind_frame_info(struct task_struct *tsk, | |||
73 | 73 | ||
74 | frame_info->task = tsk; | 74 | frame_info->task = tsk; |
75 | 75 | ||
76 | frame_info->regs.r27 = KSTK_FP(tsk); | 76 | frame_info->regs.r27 = TSK_K_FP(tsk); |
77 | frame_info->regs.r28 = KSTK_ESP(tsk); | 77 | frame_info->regs.r28 = TSK_K_ESP(tsk); |
78 | frame_info->regs.r31 = KSTK_BLINK(tsk); | 78 | frame_info->regs.r31 = TSK_K_BLINK(tsk); |
79 | frame_info->regs.r63 = (unsigned int)__switch_to; | 79 | frame_info->regs.r63 = (unsigned int)__switch_to; |
80 | 80 | ||
81 | /* In the prologue of __switch_to, first FP is saved on stack | 81 | /* In the prologue of __switch_to, first FP is saved on stack |