aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKefeng Wang <wangkefeng.wang@huawei.com>2017-05-08 21:53:37 -0400
committerWill Deacon <will.deacon@arm.com>2017-05-30 06:07:42 -0400
commit1149aad10b1e2f2cf1ea023889ac8604ae869c5a (patch)
tree3cca27fa938ff0108046f2adb4b8f2a24cdd7177
parentc07ab957d9af8092fc3caf3db5a0fb49098fdc65 (diff)
arm64: Add dump_backtrace() in show_regs
Generic code expects show_regs() to dump the stack, but arm64's show_regs() does not. This makes it hard to debug softlockups and other issues that result in show_regs() being called. This patch updates arm64's show_regs() to dump the stack, as common code expects. Acked-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> [will: folded in bug_handler fix from mrutland] Signed-off-by: Will Deacon <will.deacon@arm.com>
-rw-r--r--arch/arm64/include/asm/stacktrace.h1
-rw-r--r--arch/arm64/kernel/process.c1
-rw-r--r--arch/arm64/kernel/traps.c4
3 files changed, 3 insertions, 3 deletions
diff --git a/arch/arm64/include/asm/stacktrace.h b/arch/arm64/include/asm/stacktrace.h
index 801a16dbbdf6..5b6eafccc5d8 100644
--- a/arch/arm64/include/asm/stacktrace.h
+++ b/arch/arm64/include/asm/stacktrace.h
@@ -30,5 +30,6 @@ struct stackframe {
30extern int unwind_frame(struct task_struct *tsk, struct stackframe *frame); 30extern int unwind_frame(struct task_struct *tsk, struct stackframe *frame);
31extern void walk_stackframe(struct task_struct *tsk, struct stackframe *frame, 31extern void walk_stackframe(struct task_struct *tsk, struct stackframe *frame,
32 int (*fn)(struct stackframe *, void *), void *data); 32 int (*fn)(struct stackframe *, void *), void *data);
33extern void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk);
33 34
34#endif /* __ASM_STACKTRACE_H */ 35#endif /* __ASM_STACKTRACE_H */
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index ae2a835898d7..af1ea258c212 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -210,6 +210,7 @@ void __show_regs(struct pt_regs *regs)
210void show_regs(struct pt_regs * regs) 210void show_regs(struct pt_regs * regs)
211{ 211{
212 __show_regs(regs); 212 __show_regs(regs);
213 dump_backtrace(regs, NULL);
213} 214}
214 215
215static void tls_thread_flush(void) 216static void tls_thread_flush(void)
diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
index 0805b44f986a..3ebfb1d00b53 100644
--- a/arch/arm64/kernel/traps.c
+++ b/arch/arm64/kernel/traps.c
@@ -140,7 +140,7 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
140 } 140 }
141} 141}
142 142
143static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk) 143void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
144{ 144{
145 struct stackframe frame; 145 struct stackframe frame;
146 unsigned long irq_stack_ptr; 146 unsigned long irq_stack_ptr;
@@ -728,8 +728,6 @@ static int bug_handler(struct pt_regs *regs, unsigned int esr)
728 break; 728 break;
729 729
730 case BUG_TRAP_TYPE_WARN: 730 case BUG_TRAP_TYPE_WARN:
731 /* Ideally, report_bug() should backtrace for us... but no. */
732 dump_backtrace(regs, NULL);
733 break; 731 break;
734 732
735 default: 733 default: