[PATCH 1/2] riscv: Add dump stack in show_regs
Palmer Dabbelt
palmerdabbelt at google.com
Sat Jan 9 17:24:39 EST 2021
On Mon, 14 Dec 2020 03:52:19 PST (-0800), wangkefeng.wang at 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 at 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);
More information about the linux-riscv
mailing list