1 /* 2 * kernel/stacktrace.c 3 * 4 * Stack trace management functions 5 * 6 * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> 7 */ 8 #include <linux/sched.h> 9 #include <linux/kernel.h> 10 #include <linux/export.h> 11 #include <linux/kallsyms.h> 12 #include <linux/stacktrace.h> 13 14 void print_stack_trace(struct stack_trace *trace, int spaces) 15 { 16 int i; 17 18 if (WARN_ON(!trace->entries)) 19 return; 20 21 for (i = 0; i < trace->nr_entries; i++) 22 printk("%*c%pS\n", 1 + spaces, ' ', (void *)trace->entries[i]); 23 } 24 EXPORT_SYMBOL_GPL(print_stack_trace); 25 26 int snprint_stack_trace(char *buf, size_t size, 27 struct stack_trace *trace, int spaces) 28 { 29 int i; 30 int generated; 31 int total = 0; 32 33 if (WARN_ON(!trace->entries)) 34 return 0; 35 36 for (i = 0; i < trace->nr_entries; i++) { 37 generated = snprintf(buf, size, "%*c%pS\n", 1 + spaces, ' ', 38 (void *)trace->entries[i]); 39 40 total += generated; 41 42 /* Assume that generated isn't a negative number */ 43 if (generated >= size) { 44 buf += size; 45 size = 0; 46 } else { 47 buf += generated; 48 size -= generated; 49 } 50 } 51 52 return total; 53 } 54 EXPORT_SYMBOL_GPL(snprint_stack_trace); 55 56 /* 57 * Architectures that do not implement save_stack_trace_*() 58 * get these weak aliases and once-per-bootup warnings 59 * (whenever this facility is utilized - for example by procfs): 60 */ 61 __weak void 62 save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace) 63 { 64 WARN_ONCE(1, KERN_INFO "save_stack_trace_tsk() not implemented yet.\n"); 65 } 66 67 __weak void 68 save_stack_trace_regs(struct pt_regs *regs, struct stack_trace *trace) 69 { 70 WARN_ONCE(1, KERN_INFO "save_stack_trace_regs() not implemented yet.\n"); 71 } 72 73 __weak int 74 save_stack_trace_tsk_reliable(struct task_struct *tsk, 75 struct stack_trace *trace) 76 { 77 WARN_ONCE(1, KERN_INFO "save_stack_tsk_reliable() not implemented yet.\n"); 78 return -ENOSYS; 79 } 80