diff options
Diffstat (limited to 'arch/riscv/kernel/process.c')
| -rw-r--r-- | arch/riscv/kernel/process.c | 20 | 
1 files changed, 16 insertions, 4 deletions
diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c index dd5f985b1f40..6f728e731bed 100644 --- a/arch/riscv/kernel/process.c +++ b/arch/riscv/kernel/process.c @@ -18,13 +18,14 @@  #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>  register unsigned long gp_in_global __asm__("gp"); -#ifdef CONFIG_STACKPROTECTOR +#if defined(CONFIG_STACKPROTECTOR) && !defined(CONFIG_STACKPROTECTOR_PER_TASK)  #include <linux/stackprotector.h>  unsigned long __stack_chk_guard __read_mostly;  EXPORT_SYMBOL(__stack_chk_guard); @@ -39,11 +40,16 @@ void arch_cpu_idle(void)  	raw_local_irq_enable();  } -void show_regs(struct pt_regs *regs) +void __show_regs(struct pt_regs *regs)  {  	show_regs_print_info(KERN_DEFAULT); -	pr_cont("epc: " REG_FMT " ra : " REG_FMT " sp : " REG_FMT "\n", +	if (!user_mode(regs)) { +		pr_cont("epc : %pS\n", (void *)regs->epc); +		pr_cont(" ra : %pS\n", (void *)regs->ra); +	} + +	pr_cont("epc : " REG_FMT " ra : " REG_FMT " sp : " REG_FMT "\n",  		regs->epc, regs->ra, regs->sp);  	pr_cont(" gp : " REG_FMT " tp : " REG_FMT " t0 : " REG_FMT "\n",  		regs->gp, regs->tp, regs->t0); @@ -69,6 +75,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) @@ -112,7 +124,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, unsigned long arg,  	struct pt_regs *childregs = task_pt_regs(p);  	/* p->thread holds context to be restored by __switch_to() */ -	if (unlikely(p->flags & PF_KTHREAD)) { +	if (unlikely(p->flags & (PF_KTHREAD | PF_IO_WORKER))) {  		/* Kernel thread */  		memset(childregs, 0, sizeof(struct pt_regs));  		childregs->gp = gp_in_global;  | 
