arm64: Add dump_backtrace() in show_regs
authorKefeng Wang <wangkefeng.wang@huawei.com>
Tue, 9 May 2017 01:53:37 +0000 (09:53 +0800)
committerWill Deacon <will.deacon@arm.com>
Tue, 30 May 2017 10:07:42 +0000 (11:07 +0100)
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>
arch/arm64/include/asm/stacktrace.h
arch/arm64/kernel/process.c
arch/arm64/kernel/traps.c

index 801a16dbbdf622d5239cf61be4f67eccab5c1e09..5b6eafccc5d8f76d95d0208ee058bc1ad38d19d9 100644 (file)
@@ -30,5 +30,6 @@ struct stackframe {
 extern int unwind_frame(struct task_struct *tsk, struct stackframe *frame);
 extern void walk_stackframe(struct task_struct *tsk, struct stackframe *frame,
                            int (*fn)(struct stackframe *, void *), void *data);
+extern void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk);
 
 #endif /* __ASM_STACKTRACE_H */
index ae2a835898d71abd1f09ca243d3afe7bac54590f..af1ea258c2126ce8361af5fd93d1f07d9d34e6de 100644 (file)
@@ -210,6 +210,7 @@ void __show_regs(struct pt_regs *regs)
 void show_regs(struct pt_regs * regs)
 {
        __show_regs(regs);
+       dump_backtrace(regs, NULL);
 }
 
 static void tls_thread_flush(void)
index 0805b44f986a5707d2129e74fd4490f1b3650223..3ebfb1d00b53ea801baa2fe4f82748eb8e0b8ded 100644 (file)
@@ -140,7 +140,7 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
        }
 }
 
-static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
+void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
 {
        struct stackframe frame;
        unsigned long irq_stack_ptr;
@@ -728,8 +728,6 @@ static int bug_handler(struct pt_regs *regs, unsigned int esr)
                break;
 
        case BUG_TRAP_TYPE_WARN:
-               /* Ideally, report_bug() should backtrace for us... but no. */
-               dump_backtrace(regs, NULL);
                break;
 
        default: