1 #include <linux/sched.h>
5 #include <linux/export.h>
6 #include <asm/ptrace.h>
7 #include <asm/stacktrace.h>
11 static void __save_stack_trace(
struct thread_info *tp,
12 struct stack_trace *
trace,
15 unsigned long ksp,
fp;
16 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
23 __asm__ __volatile__(
"mov %%fp, %0" :
"=r" (ksp));
29 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
37 if (!kstack_valid(tp, fp))
41 regs = (
struct pt_regs *) (sf + 1);
43 if (kstack_is_trap_frame(tp, regs)) {
50 fp = (
unsigned long)sf->
fp + STACK_BIAS;
56 trace->entries[trace->nr_entries++] =
pc;
57 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
59 int index = t->curr_ret_stack;
60 if (t->ret_stack && index >= graph) {
61 pc = t->ret_stack[index - graph].ret;
62 if (trace->nr_entries <
64 trace->entries[trace->nr_entries++] =
pc;
70 }
while (trace->nr_entries < trace->max_entries);
83 __save_stack_trace(tp, trace,
true);