Message ID | 20201124112054.106960-1-wangkefeng.wang@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/2] riscv: Add dump stack in show_regs | expand |
On Tue, Nov 24, 2020 at 3:17 AM Kefeng Wang <wangkefeng.wang@huawei.com> wrote: > > Like commit 1149aad10b1e ("arm64: Add dump_backtrace() in show_regs"), > dump the stack in riscv show_regs as common code expects. > > Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> > --- > NOTE: The patches based on > https://patchwork.kernel.org/project/linux-riscv/list/?series=383349 > > arch/riscv/include/asm/bug.h | 1 + > arch/riscv/include/asm/stacktrace.h | 2 ++ > arch/riscv/kernel/process.c | 9 ++++++++- > arch/riscv/kernel/stacktrace.c | 10 ++++++++-- > arch/riscv/kernel/traps.c | 3 ++- > 5 files changed, 21 insertions(+), 4 deletions(-) > > diff --git a/arch/riscv/include/asm/bug.h b/arch/riscv/include/asm/bug.h > index d6f1ec08d97b..d3804a2f9aad 100644 > --- a/arch/riscv/include/asm/bug.h > +++ b/arch/riscv/include/asm/bug.h > @@ -85,6 +85,7 @@ do { \ > struct pt_regs; > struct task_struct; > > +void __show_regs(struct pt_regs *regs); > void die(struct pt_regs *regs, const char *str); > void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr); > > diff --git a/arch/riscv/include/asm/stacktrace.h b/arch/riscv/include/asm/stacktrace.h > index 470a65c4ccdc..3450c1912afd 100644 > --- a/arch/riscv/include/asm/stacktrace.h > +++ b/arch/riscv/include/asm/stacktrace.h > @@ -13,5 +13,7 @@ struct stackframe { > > extern void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs, > 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 */ > diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c > index 19225ec65db6..e41b733abeaa 100644 > --- a/arch/riscv/kernel/process.c > +++ b/arch/riscv/kernel/process.c > @@ -18,6 +18,7 @@ > #include <asm/unistd.h> > #include <asm/processor.h> > #include <asm/csr.h> > +#include <asm/stacktrace.h> > #include <asm/string.h> > #include <asm/switch_to.h> > #include <asm/thread_info.h> > @@ -39,7 +40,7 @@ void arch_cpu_idle(void) > local_irq_enable(); > } > > -void show_regs(struct pt_regs *regs) > +void __show_regs(struct pt_regs *regs) > { > 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", > 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, > unsigned long sp) > diff --git a/arch/riscv/kernel/stacktrace.c b/arch/riscv/kernel/stacktrace.c > index 48b870a685b3..76dadf6d396b 100644 > --- a/arch/riscv/kernel/stacktrace.c > +++ b/arch/riscv/kernel/stacktrace.c > @@ -101,10 +101,16 @@ static bool print_trace_address(void *arg, unsigned long pc) > 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) > { > - pr_cont("Call Trace:\n"); > - walk_stackframe(task, NULL, print_trace_address, (void *)loglvl); > + dump_backtrace(NULL, task, loglvl); > } > > static bool save_wchan(void *arg, unsigned long pc) > diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c > index ad14f4466d92..570eb078b1e1 100644 > --- a/arch/riscv/kernel/traps.c > +++ b/arch/riscv/kernel/traps.c > @@ -16,6 +16,7 @@ > #include <linux/module.h> > #include <linux/irq.h> > > +#include <asm/bug.h> > #include <asm/processor.h> > #include <asm/ptrace.h> > #include <asm/csr.h> > @@ -66,7 +67,7 @@ void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr) > tsk->comm, task_pid_nr(tsk), signo, code, addr); > print_vma_addr(KERN_CONT " in ", instruction_pointer(regs)); > pr_cont("\n"); > - show_regs(regs); > + __show_regs(regs); > } > > force_sig_fault(signo, code, (void __user *)addr); > -- > 2.26.2 > > > _______________________________________________ > linux-riscv mailing list > linux-riscv@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-riscv LGTM. Reviewed-by: Atish Patra <atish.patra@wdc.com>
hi Palmer, kindly ping... On 2020/11/24 19:20, Kefeng Wang wrote: > Like commit 1149aad10b1e ("arm64: Add dump_backtrace() in show_regs"), > dump the stack in riscv show_regs as common code expects. > > Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> > --- > NOTE: The patches based on > https://patchwork.kernel.org/project/linux-riscv/list/?series=383349 > > arch/riscv/include/asm/bug.h | 1 + > arch/riscv/include/asm/stacktrace.h | 2 ++ > arch/riscv/kernel/process.c | 9 ++++++++- > arch/riscv/kernel/stacktrace.c | 10 ++++++++-- > arch/riscv/kernel/traps.c | 3 ++- > 5 files changed, 21 insertions(+), 4 deletions(-) > > diff --git a/arch/riscv/include/asm/bug.h b/arch/riscv/include/asm/bug.h > index d6f1ec08d97b..d3804a2f9aad 100644 > --- a/arch/riscv/include/asm/bug.h > +++ b/arch/riscv/include/asm/bug.h > @@ -85,6 +85,7 @@ do { \ > struct pt_regs; > struct task_struct; > > +void __show_regs(struct pt_regs *regs); > void die(struct pt_regs *regs, const char *str); > void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr); > > diff --git a/arch/riscv/include/asm/stacktrace.h b/arch/riscv/include/asm/stacktrace.h > index 470a65c4ccdc..3450c1912afd 100644 > --- a/arch/riscv/include/asm/stacktrace.h > +++ b/arch/riscv/include/asm/stacktrace.h > @@ -13,5 +13,7 @@ struct stackframe { > > extern void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs, > 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 */ > diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c > index 19225ec65db6..e41b733abeaa 100644 > --- a/arch/riscv/kernel/process.c > +++ b/arch/riscv/kernel/process.c > @@ -18,6 +18,7 @@ > #include <asm/unistd.h> > #include <asm/processor.h> > #include <asm/csr.h> > +#include <asm/stacktrace.h> > #include <asm/string.h> > #include <asm/switch_to.h> > #include <asm/thread_info.h> > @@ -39,7 +40,7 @@ void arch_cpu_idle(void) > local_irq_enable(); > } > > -void show_regs(struct pt_regs *regs) > +void __show_regs(struct pt_regs *regs) > { > 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", > 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, > unsigned long sp) > diff --git a/arch/riscv/kernel/stacktrace.c b/arch/riscv/kernel/stacktrace.c > index 48b870a685b3..76dadf6d396b 100644 > --- a/arch/riscv/kernel/stacktrace.c > +++ b/arch/riscv/kernel/stacktrace.c > @@ -101,10 +101,16 @@ static bool print_trace_address(void *arg, unsigned long pc) > 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) > { > - pr_cont("Call Trace:\n"); > - walk_stackframe(task, NULL, print_trace_address, (void *)loglvl); > + dump_backtrace(NULL, task, loglvl); > } > > static bool save_wchan(void *arg, unsigned long pc) > diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c > index ad14f4466d92..570eb078b1e1 100644 > --- a/arch/riscv/kernel/traps.c > +++ b/arch/riscv/kernel/traps.c > @@ -16,6 +16,7 @@ > #include <linux/module.h> > #include <linux/irq.h> > > +#include <asm/bug.h> > #include <asm/processor.h> > #include <asm/ptrace.h> > #include <asm/csr.h> > @@ -66,7 +67,7 @@ void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr) > tsk->comm, task_pid_nr(tsk), signo, code, addr); > print_vma_addr(KERN_CONT " in ", instruction_pointer(regs)); > pr_cont("\n"); > - show_regs(regs); > + __show_regs(regs); > } > > force_sig_fault(signo, code, (void __user *)addr);
On Mon, 14 Dec 2020 03:52:19 PST (-0800), wangkefeng.wang@huawei.com wrote: > hi Palmer, kindly ping... Sorry, it looks like I missed this because it's all threaded together. I'm not really sure what you're trying to do here: you've got three patch sets in one thread, one of which seems to be a v2 of only a single patch. Do you mind sending out a standalone version of this? > > On 2020/11/24 19:20, Kefeng Wang wrote: >> Like commit 1149aad10b1e ("arm64: Add dump_backtrace() in show_regs"), >> dump the stack in riscv show_regs as common code expects. >> >> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> >> --- >> NOTE: The patches based on >> https://patchwork.kernel.org/project/linux-riscv/list/?series=383349 >> >> arch/riscv/include/asm/bug.h | 1 + >> arch/riscv/include/asm/stacktrace.h | 2 ++ >> arch/riscv/kernel/process.c | 9 ++++++++- >> arch/riscv/kernel/stacktrace.c | 10 ++++++++-- >> arch/riscv/kernel/traps.c | 3 ++- >> 5 files changed, 21 insertions(+), 4 deletions(-) >> >> diff --git a/arch/riscv/include/asm/bug.h b/arch/riscv/include/asm/bug.h >> index d6f1ec08d97b..d3804a2f9aad 100644 >> --- a/arch/riscv/include/asm/bug.h >> +++ b/arch/riscv/include/asm/bug.h >> @@ -85,6 +85,7 @@ do { \ >> struct pt_regs; >> struct task_struct; >> >> +void __show_regs(struct pt_regs *regs); >> void die(struct pt_regs *regs, const char *str); >> void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr); >> >> diff --git a/arch/riscv/include/asm/stacktrace.h b/arch/riscv/include/asm/stacktrace.h >> index 470a65c4ccdc..3450c1912afd 100644 >> --- a/arch/riscv/include/asm/stacktrace.h >> +++ b/arch/riscv/include/asm/stacktrace.h >> @@ -13,5 +13,7 @@ struct stackframe { >> >> extern void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs, >> 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 */ >> diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c >> index 19225ec65db6..e41b733abeaa 100644 >> --- a/arch/riscv/kernel/process.c >> +++ b/arch/riscv/kernel/process.c >> @@ -18,6 +18,7 @@ >> #include <asm/unistd.h> >> #include <asm/processor.h> >> #include <asm/csr.h> >> +#include <asm/stacktrace.h> >> #include <asm/string.h> >> #include <asm/switch_to.h> >> #include <asm/thread_info.h> >> @@ -39,7 +40,7 @@ void arch_cpu_idle(void) >> local_irq_enable(); >> } >> >> -void show_regs(struct pt_regs *regs) >> +void __show_regs(struct pt_regs *regs) >> { >> 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", >> 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, >> unsigned long sp) >> diff --git a/arch/riscv/kernel/stacktrace.c b/arch/riscv/kernel/stacktrace.c >> index 48b870a685b3..76dadf6d396b 100644 >> --- a/arch/riscv/kernel/stacktrace.c >> +++ b/arch/riscv/kernel/stacktrace.c >> @@ -101,10 +101,16 @@ static bool print_trace_address(void *arg, unsigned long pc) >> 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) >> { >> - pr_cont("Call Trace:\n"); >> - walk_stackframe(task, NULL, print_trace_address, (void *)loglvl); >> + dump_backtrace(NULL, task, loglvl); >> } >> >> static bool save_wchan(void *arg, unsigned long pc) >> diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c >> index ad14f4466d92..570eb078b1e1 100644 >> --- a/arch/riscv/kernel/traps.c >> +++ b/arch/riscv/kernel/traps.c >> @@ -16,6 +16,7 @@ >> #include <linux/module.h> >> #include <linux/irq.h> >> >> +#include <asm/bug.h> >> #include <asm/processor.h> >> #include <asm/ptrace.h> >> #include <asm/csr.h> >> @@ -66,7 +67,7 @@ void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr) >> tsk->comm, task_pid_nr(tsk), signo, code, addr); >> print_vma_addr(KERN_CONT " in ", instruction_pointer(regs)); >> pr_cont("\n"); >> - show_regs(regs); >> + __show_regs(regs); >> } >> >> force_sig_fault(signo, code, (void __user *)addr);
On 2021/1/10 6:24, Palmer Dabbelt wrote: > On Mon, 14 Dec 2020 03:52:19 PST (-0800), wangkefeng.wang@huawei.com > wrote: >> hi Palmer, kindly ping... > > Sorry, it looks like I missed this because it's all threaded > together. I'm not > really sure what you're trying to do here: you've got three patch sets > in one > thread, one of which seems to be a v2 of only a single patch. > Do you mind sending out a standalone version of this? Sure, I will rebase on the top of 5.11-rc3 and resend them.
diff --git a/arch/riscv/include/asm/bug.h b/arch/riscv/include/asm/bug.h index d6f1ec08d97b..d3804a2f9aad 100644 --- a/arch/riscv/include/asm/bug.h +++ b/arch/riscv/include/asm/bug.h @@ -85,6 +85,7 @@ do { \ struct pt_regs; struct task_struct; +void __show_regs(struct pt_regs *regs); void die(struct pt_regs *regs, const char *str); void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr); diff --git a/arch/riscv/include/asm/stacktrace.h b/arch/riscv/include/asm/stacktrace.h index 470a65c4ccdc..3450c1912afd 100644 --- a/arch/riscv/include/asm/stacktrace.h +++ b/arch/riscv/include/asm/stacktrace.h @@ -13,5 +13,7 @@ struct stackframe { extern void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs, 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 */ diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c index 19225ec65db6..e41b733abeaa 100644 --- a/arch/riscv/kernel/process.c +++ b/arch/riscv/kernel/process.c @@ -18,6 +18,7 @@ #include <asm/unistd.h> #include <asm/processor.h> #include <asm/csr.h> +#include <asm/stacktrace.h> #include <asm/string.h> #include <asm/switch_to.h> #include <asm/thread_info.h> @@ -39,7 +40,7 @@ void arch_cpu_idle(void) local_irq_enable(); } -void show_regs(struct pt_regs *regs) +void __show_regs(struct pt_regs *regs) { 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", 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, unsigned long sp) diff --git a/arch/riscv/kernel/stacktrace.c b/arch/riscv/kernel/stacktrace.c index 48b870a685b3..76dadf6d396b 100644 --- a/arch/riscv/kernel/stacktrace.c +++ b/arch/riscv/kernel/stacktrace.c @@ -101,10 +101,16 @@ static bool print_trace_address(void *arg, unsigned long pc) 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) { - pr_cont("Call Trace:\n"); - walk_stackframe(task, NULL, print_trace_address, (void *)loglvl); + dump_backtrace(NULL, task, loglvl); } static bool save_wchan(void *arg, unsigned long pc) diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c index ad14f4466d92..570eb078b1e1 100644 --- a/arch/riscv/kernel/traps.c +++ b/arch/riscv/kernel/traps.c @@ -16,6 +16,7 @@ #include <linux/module.h> #include <linux/irq.h> +#include <asm/bug.h> #include <asm/processor.h> #include <asm/ptrace.h> #include <asm/csr.h> @@ -66,7 +67,7 @@ void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr) tsk->comm, task_pid_nr(tsk), signo, code, addr); print_vma_addr(KERN_CONT " in ", instruction_pointer(regs)); pr_cont("\n"); - show_regs(regs); + __show_regs(regs); } force_sig_fault(signo, code, (void __user *)addr);
Like commit 1149aad10b1e ("arm64: Add dump_backtrace() in show_regs"), dump the stack in riscv show_regs as common code expects. Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> --- NOTE: The patches based on https://patchwork.kernel.org/project/linux-riscv/list/?series=383349 arch/riscv/include/asm/bug.h | 1 + arch/riscv/include/asm/stacktrace.h | 2 ++ arch/riscv/kernel/process.c | 9 ++++++++- arch/riscv/kernel/stacktrace.c | 10 ++++++++-- arch/riscv/kernel/traps.c | 3 ++- 5 files changed, 21 insertions(+), 4 deletions(-)