diff options
author | Kefeng Wang <wangkefeng.wang@huawei.com> | 2017-05-08 21:53:37 -0400 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2017-05-30 06:07:42 -0400 |
commit | 1149aad10b1e2f2cf1ea023889ac8604ae869c5a (patch) | |
tree | 3cca27fa938ff0108046f2adb4b8f2a24cdd7177 | |
parent | c07ab957d9af8092fc3caf3db5a0fb49098fdc65 (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.h | 1 | ||||
-rw-r--r-- | arch/arm64/kernel/process.c | 1 | ||||
-rw-r--r-- | arch/arm64/kernel/traps.c | 4 |
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 { | |||
30 | extern int unwind_frame(struct task_struct *tsk, struct stackframe *frame); | 30 | extern int unwind_frame(struct task_struct *tsk, struct stackframe *frame); |
31 | extern void walk_stackframe(struct task_struct *tsk, struct stackframe *frame, | 31 | extern 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); |
33 | extern 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) | |||
210 | void show_regs(struct pt_regs * regs) | 210 | void 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 | ||
215 | static void tls_thread_flush(void) | 216 | static 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 | ||
143 | static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk) | 143 | void 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: |