riscv: Add dump stack in show_regs
Like commit 1149aad10b ("arm64: Add dump_backtrace() in show_regs"),
dump the stack in riscv show_regs as common code expects.
Reviewed-by: Atish Patra <atish.patra@wdc.com>
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
This commit is contained in:
committed by
Palmer Dabbelt
parent
fea2fed201
commit
091b945085
@@ -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 {
|
|||||||
|
|
||||||
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 @@
|
|||||||
#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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user