1 #include <linux/export.h>
2 #include <linux/sched.h>
5 #include <asm/stacktrace.h>
7 #if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND)
27 unsigned long fp = frame->
fp;
34 if (fp < (low + 12) || fp + 4 >= high)
38 frame->
fp = *(
unsigned long *)(fp - 12);
39 frame->
sp = *(
unsigned long *)(fp - 8);
40 frame->
pc = *(
unsigned long *)(fp - 4);
61 #ifdef CONFIG_STACKTRACE
62 struct stack_trace_data {
63 struct stack_trace *
trace;
64 unsigned int no_sched_functions;
68 static int save_trace(
struct stackframe *frame,
void *
d)
70 struct stack_trace_data *
data =
d;
71 struct stack_trace *
trace = data->trace;
72 unsigned long addr = frame->
pc;
81 trace->entries[trace->nr_entries++] =
addr;
83 return trace->nr_entries >= trace->max_entries;
88 struct stack_trace_data data;
92 data.skip = trace->skip;
101 if (trace->nr_entries < trace->max_entries)
102 trace->entries[trace->nr_entries++] =
ULONG_MAX;
105 data.no_sched_functions = 1;
106 frame.
fp = thread_saved_fp(tsk);
107 frame.
sp = thread_saved_sp(tsk);
112 register unsigned long current_sp
asm (
"sp");
114 data.no_sched_functions = 0;
115 frame.
fp = (
unsigned long)__builtin_frame_address(0);
116 frame.
sp = current_sp;
117 frame.
lr = (
unsigned long)__builtin_return_address(0);
122 if (trace->nr_entries < trace->max_entries)
123 trace->entries[trace->nr_entries++] =
ULONG_MAX;