Commit 091b9450 authored by Kefeng Wang's avatar Kefeng Wang Committed by Palmer Dabbelt

riscv: Add dump stack in show_regs

Like commit 1149aad1 ("arm64: Add dump_backtrace() in show_regs"),
dump the stack in riscv show_regs as common code expects.
Reviewed-by: default avatarAtish Patra <atish.patra@wdc.com>
Signed-off-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: default avatarPalmer Dabbelt <palmerdabbelt@google.com>
parent fea2fed2
...@@ -85,6 +85,7 @@ do { \ ...@@ -85,6 +85,7 @@ do { \
struct pt_regs; struct pt_regs;
struct task_struct; struct task_struct;
void __show_regs(struct pt_regs *regs);
void die(struct pt_regs *regs, const char *str); void die(struct pt_regs *regs, const char *str);
void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr); void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr);
......
...@@ -13,5 +13,7 @@ struct stackframe { ...@@ -13,5 +13,7 @@ struct stackframe {
extern void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs, extern void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
bool (*fn)(void *, unsigned long), void *arg); bool (*fn)(void *, unsigned long), void *arg);
extern void dump_backtrace(struct pt_regs *regs, struct task_struct *task,
const char *loglvl);
#endif /* _ASM_RISCV_STACKTRACE_H */ #endif /* _ASM_RISCV_STACKTRACE_H */
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <asm/unistd.h> #include <asm/unistd.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/csr.h> #include <asm/csr.h>
#include <asm/stacktrace.h>
#include <asm/string.h> #include <asm/string.h>
#include <asm/switch_to.h> #include <asm/switch_to.h>
#include <asm/thread_info.h> #include <asm/thread_info.h>
...@@ -39,7 +40,7 @@ void arch_cpu_idle(void) ...@@ -39,7 +40,7 @@ void arch_cpu_idle(void)
raw_local_irq_enable(); raw_local_irq_enable();
} }
void show_regs(struct pt_regs *regs) void __show_regs(struct pt_regs *regs)
{ {
show_regs_print_info(KERN_DEFAULT); show_regs_print_info(KERN_DEFAULT);
...@@ -69,6 +70,12 @@ void show_regs(struct pt_regs *regs) ...@@ -69,6 +70,12 @@ void show_regs(struct pt_regs *regs)
pr_cont("status: " REG_FMT " badaddr: " REG_FMT " cause: " REG_FMT "\n", pr_cont("status: " REG_FMT " badaddr: " REG_FMT " cause: " REG_FMT "\n",
regs->status, regs->badaddr, regs->cause); regs->status, regs->badaddr, regs->cause);
} }
void show_regs(struct pt_regs *regs)
{
__show_regs(regs);
if (!user_mode(regs))
dump_backtrace(regs, NULL, KERN_DEFAULT);
}
void start_thread(struct pt_regs *regs, unsigned long pc, void start_thread(struct pt_regs *regs, unsigned long pc,
unsigned long sp) unsigned long sp)
......
...@@ -101,10 +101,16 @@ static bool print_trace_address(void *arg, unsigned long pc) ...@@ -101,10 +101,16 @@ static bool print_trace_address(void *arg, unsigned long pc)
return true; return true;
} }
void dump_backtrace(struct pt_regs *regs, struct task_struct *task,
const char *loglvl)
{
pr_cont("%sCall Trace:\n", loglvl);
walk_stackframe(task, regs, print_trace_address, (void *)loglvl);
}
void show_stack(struct task_struct *task, unsigned long *sp, const char *loglvl) void show_stack(struct task_struct *task, unsigned long *sp, const char *loglvl)
{ {
pr_cont("Call Trace:\n"); dump_backtrace(NULL, task, loglvl);
walk_stackframe(task, NULL, print_trace_address, (void *)loglvl);
} }
static bool save_wchan(void *arg, unsigned long pc) static bool save_wchan(void *arg, unsigned long pc)
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <asm/bug.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/csr.h> #include <asm/csr.h>
...@@ -67,7 +68,7 @@ void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr) ...@@ -67,7 +68,7 @@ void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr)
tsk->comm, task_pid_nr(tsk), signo, code, addr); tsk->comm, task_pid_nr(tsk), signo, code, addr);
print_vma_addr(KERN_CONT " in ", instruction_pointer(regs)); print_vma_addr(KERN_CONT " in ", instruction_pointer(regs));
pr_cont("\n"); pr_cont("\n");
show_regs(regs); __show_regs(regs);
} }
force_sig_fault(signo, code, (void __user *)addr); force_sig_fault(signo, code, (void __user *)addr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment