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