xref: /openbmc/linux/arch/ia64/kernel/stacktrace.c (revision 85718fae2a8d845e66762e6464152a255e323777)
1*85718faeSTony Luck /*
2*85718faeSTony Luck  * arch/ia64/kernel/stacktrace.c
3*85718faeSTony Luck  *
4*85718faeSTony Luck  * Stack trace management functions
5*85718faeSTony Luck  *
6*85718faeSTony Luck  */
7*85718faeSTony Luck #include <linux/sched.h>
8*85718faeSTony Luck #include <linux/stacktrace.h>
9*85718faeSTony Luck #include <linux/module.h>
10*85718faeSTony Luck 
11*85718faeSTony Luck static void
12*85718faeSTony Luck ia64_do_save_stack(struct unw_frame_info *info, void *arg)
13*85718faeSTony Luck {
14*85718faeSTony Luck 	struct stack_trace *trace = arg;
15*85718faeSTony Luck 	unsigned long ip;
16*85718faeSTony Luck 	int skip = trace->skip;
17*85718faeSTony Luck 
18*85718faeSTony Luck 	trace->nr_entries = 0;
19*85718faeSTony Luck 	do {
20*85718faeSTony Luck 		unw_get_ip(info, &ip);
21*85718faeSTony Luck 		if (ip == 0)
22*85718faeSTony Luck 			break;
23*85718faeSTony Luck 		if (skip == 0) {
24*85718faeSTony Luck 			trace->entries[trace->nr_entries++] = ip;
25*85718faeSTony Luck 			if (trace->nr_entries == trace->max_entries)
26*85718faeSTony Luck 				break;
27*85718faeSTony Luck 		} else
28*85718faeSTony Luck 			skip--;
29*85718faeSTony Luck 	} while (unw_unwind(info) >= 0);
30*85718faeSTony Luck }
31*85718faeSTony Luck 
32*85718faeSTony Luck /*
33*85718faeSTony Luck  * Save stack-backtrace addresses into a stack_trace buffer.
34*85718faeSTony Luck  */
35*85718faeSTony Luck void save_stack_trace(struct stack_trace *trace)
36*85718faeSTony Luck {
37*85718faeSTony Luck 	unw_init_running(ia64_do_save_stack, trace);
38*85718faeSTony Luck }
39*85718faeSTony Luck EXPORT_SYMBOL(save_stack_trace);
40