2 * Stack trace management functions
4 * Copyright IBM Corp. 2006
5 * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
8 #include <linux/sched.h>
9 #include <linux/stacktrace.h>
10 #include <linux/kallsyms.h>
11 #include <linux/module.h>
13 static int __save_address(void *data
, unsigned long address
, int nosched
)
15 struct stack_trace
*trace
= data
;
17 if (nosched
&& in_sched_functions(address
))
19 if (trace
->skip
> 0) {
23 if (trace
->nr_entries
< trace
->max_entries
) {
24 trace
->entries
[trace
->nr_entries
++] = address
;
30 static int save_address(void *data
, unsigned long address
, int reliable
)
32 return __save_address(data
, address
, 0);
35 static int save_address_nosched(void *data
, unsigned long address
, int reliable
)
37 return __save_address(data
, address
, 1);
40 void save_stack_trace(struct stack_trace
*trace
)
44 sp
= current_stack_pointer();
45 dump_trace(save_address
, trace
, NULL
, sp
);
46 if (trace
->nr_entries
< trace
->max_entries
)
47 trace
->entries
[trace
->nr_entries
++] = ULONG_MAX
;
49 EXPORT_SYMBOL_GPL(save_stack_trace
);
51 void save_stack_trace_tsk(struct task_struct
*tsk
, struct stack_trace
*trace
)
57 sp
= current_stack_pointer();
58 dump_trace(save_address_nosched
, trace
, tsk
, sp
);
59 if (trace
->nr_entries
< trace
->max_entries
)
60 trace
->entries
[trace
->nr_entries
++] = ULONG_MAX
;
62 EXPORT_SYMBOL_GPL(save_stack_trace_tsk
);
64 void save_stack_trace_regs(struct pt_regs
*regs
, struct stack_trace
*trace
)
68 sp
= kernel_stack_pointer(regs
);
69 dump_trace(save_address
, trace
, NULL
, sp
);
70 if (trace
->nr_entries
< trace
->max_entries
)
71 trace
->entries
[trace
->nr_entries
++] = ULONG_MAX
;
73 EXPORT_SYMBOL_GPL(save_stack_trace_regs
);