diff mbox series

[1/2] riscv: Add dump stack in show_regs

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

Commit Message

Kefeng Wang Nov. 24, 2020, 11:20 a.m. UTC
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(-)

Comments

Atish Patra Nov. 25, 2020, 11:04 p.m. UTC | #1
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>
Kefeng Wang Dec. 14, 2020, 11:52 a.m. UTC | #2
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);
Palmer Dabbelt Jan. 9, 2021, 10:24 p.m. UTC | #3
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);
Kefeng Wang Jan. 11, 2021, 3:23 a.m. UTC | #4
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 mbox series

Patch

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);