diff options
Diffstat (limited to 'arch/openrisc/kernel/stacktrace.c')
| -rw-r--r-- | arch/openrisc/kernel/stacktrace.c | 18 | 
1 files changed, 16 insertions, 2 deletions
diff --git a/arch/openrisc/kernel/stacktrace.c b/arch/openrisc/kernel/stacktrace.c index 43f140a28bc7..54d38809e22c 100644 --- a/arch/openrisc/kernel/stacktrace.c +++ b/arch/openrisc/kernel/stacktrace.c @@ -13,6 +13,7 @@  #include <linux/export.h>  #include <linux/sched.h>  #include <linux/sched/debug.h> +#include <linux/sched/task_stack.h>  #include <linux/stacktrace.h>  #include <asm/processor.h> @@ -68,12 +69,25 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)  {  	unsigned long *sp = NULL; +	if (!try_get_task_stack(tsk)) +		return; +  	if (tsk == current)  		sp = (unsigned long *) &sp; -	else -		sp = (unsigned long *) KSTK_ESP(tsk); +	else { +		unsigned long ksp; + +		/* Locate stack from kernel context */ +		ksp = task_thread_info(tsk)->ksp; +		ksp += STACK_FRAME_OVERHEAD;	/* redzone */ +		ksp += sizeof(struct pt_regs); + +		sp = (unsigned long *) ksp; +	}  	unwind_stack(trace, sp, save_stack_address_nosched); + +	put_task_stack(tsk);  }  EXPORT_SYMBOL_GPL(save_stack_trace_tsk);  |