1 // SPDX-License-Identifier: GPL-2.0
3 * Stack trace management functions
5 * Copyright IBM Corp. 2006
6 * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
9 #include <linux/sched.h>
10 #include <linux/sched/debug.h>
11 #include <linux/stacktrace.h>
12 #include <linux/kallsyms.h>
13 #include <linux/export.h>
15 static int __save_address(void *data
, unsigned long address
, int nosched
)
17 struct stack_trace
*trace
= data
;
19 if (nosched
&& in_sched_functions(address
))
21 if (trace
->skip
> 0) {
25 if (trace
->nr_entries
< trace
->max_entries
) {
26 trace
->entries
[trace
->nr_entries
++] = address
;
32 static int save_address(void *data
, unsigned long address
, int reliable
)
34 return __save_address(data
, address
, 0);
37 static int save_address_nosched(void *data
, unsigned long address
, int reliable
)
39 return __save_address(data
, address
, 1);
42 void save_stack_trace(struct stack_trace
*trace
)
46 sp
= current_stack_pointer();
47 dump_trace(save_address
, trace
, NULL
, sp
);
48 if (trace
->nr_entries
< trace
->max_entries
)
49 trace
->entries
[trace
->nr_entries
++] = ULONG_MAX
;
51 EXPORT_SYMBOL_GPL(save_stack_trace
);
53 void save_stack_trace_tsk(struct task_struct
*tsk
, struct stack_trace
*trace
)
59 sp
= current_stack_pointer();
60 dump_trace(save_address_nosched
, trace
, tsk
, sp
);
61 if (trace
->nr_entries
< trace
->max_entries
)
62 trace
->entries
[trace
->nr_entries
++] = ULONG_MAX
;
64 EXPORT_SYMBOL_GPL(save_stack_trace_tsk
);
66 void save_stack_trace_regs(struct pt_regs
*regs
, struct stack_trace
*trace
)
70 sp
= kernel_stack_pointer(regs
);
71 dump_trace(save_address
, trace
, NULL
, sp
);
72 if (trace
->nr_entries
< trace
->max_entries
)
73 trace
->entries
[trace
->nr_entries
++] = ULONG_MAX
;
75 EXPORT_SYMBOL_GPL(save_stack_trace_regs
);