diff options
Diffstat (limited to 'arch/microblaze/kernel/stacktrace.c')
| -rw-r--r-- | arch/microblaze/kernel/stacktrace.c | 44 | 
1 files changed, 5 insertions, 39 deletions
| diff --git a/arch/microblaze/kernel/stacktrace.c b/arch/microblaze/kernel/stacktrace.c index 123692f22647..84bc6686102c 100644 --- a/arch/microblaze/kernel/stacktrace.c +++ b/arch/microblaze/kernel/stacktrace.c @@ -14,52 +14,18 @@  #include <linux/thread_info.h>  #include <linux/ptrace.h>  #include <linux/module.h> +#include <asm/unwind.h> -/* FIXME initial support */  void save_stack_trace(struct stack_trace *trace)  { -	unsigned long *sp; -	unsigned long addr; -	asm("addik %0, r1, 0" : "=r" (sp)); - -	while (!kstack_end(sp)) { -		addr = *sp++; -		if (__kernel_text_address(addr)) { -			if (trace->skip > 0) -				trace->skip--; -			else -				trace->entries[trace->nr_entries++] = addr; - -			if (trace->nr_entries >= trace->max_entries) -				break; -		} -	} +	/* Exclude our helper functions from the trace*/ +	trace->skip += 2; +	microblaze_unwind(NULL, trace);  }  EXPORT_SYMBOL_GPL(save_stack_trace);  void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)  { -	unsigned int *sp; -	unsigned long addr; - -	struct thread_info *ti = task_thread_info(tsk); - -	if (tsk == current) -		asm("addik %0, r1, 0" : "=r" (sp)); -	else -		sp = (unsigned int *)ti->cpu_context.r1; - -	while (!kstack_end(sp)) { -		addr = *sp++; -		if (__kernel_text_address(addr)) { -			if (trace->skip > 0) -				trace->skip--; -			else -				trace->entries[trace->nr_entries++] = addr; - -			if (trace->nr_entries >= trace->max_entries) -				break; -		} -	} +	microblaze_unwind(tsk, trace);  }  EXPORT_SYMBOL_GPL(save_stack_trace_tsk); |