1 // SPDX-License-Identifier: GPL-2.0-only
2 #include <linux/export.h>
3 #include <linux/kprobes.h>
4 #include <linux/sched.h>
5 #include <linux/sched/debug.h>
6 #include <linux/stacktrace.h>
8 #include <asm/sections.h>
9 #include <asm/stacktrace.h>
10 #include <asm/traps.h>
14 #if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND)
16 * Unwind the current stack frame and store the new register values in the
17 * structure passed as argument. Unwinding is equivalent to a function return,
18 * hence the new PC value rather than LR should be used for backtrace.
20 * With framepointer enabled, a simple function prologue looks like this:
22 * stmdb sp!, {fp, ip, lr, pc}
25 * A simple function epilogue looks like this:
26 * ldm sp, {fp, sp, pc}
28 * When compiled with clang, pc and sp are not pushed. A simple function
29 * prologue looks like this when built with clang:
35 * A simple function epilogue looks like this when built with clang:
41 * Note that with framepointer enabled, even the leaf functions have the same
42 * prologue and epilogue, therefore we can ignore the LR value in this case.
45 extern unsigned long call_with_stack_end
;
47 static int frame_pointer_check(struct stackframe
*frame
)
49 unsigned long high
, low
;
50 unsigned long fp
= frame
->fp
;
51 unsigned long pc
= frame
->pc
;
54 * call_with_stack() is the only place we allow SP to jump from one
55 * stack to another, with FP and SP pointing to different stacks,
56 * skipping the FP boundary check at this point.
58 if (pc
>= (unsigned long)&call_with_stack
&&
59 pc
< (unsigned long)&call_with_stack_end
)
62 /* only go to a higher address on the stack */
64 high
= ALIGN(low
, THREAD_SIZE
);
66 /* check current frame pointer is within bounds */
67 #ifdef CONFIG_CC_IS_CLANG
68 if (fp
< low
+ 4 || fp
> high
- 4)
71 if (fp
< low
+ 12 || fp
> high
- 4)
78 int notrace
unwind_frame(struct stackframe
*frame
)
80 unsigned long fp
= frame
->fp
;
82 if (frame_pointer_check(frame
))
86 * When we unwind through an exception stack, include the saved PC
87 * value into the stack trace.
89 if (frame
->ex_frame
) {
90 struct pt_regs
*regs
= (struct pt_regs
*)frame
->sp
;
93 * We check that 'regs + sizeof(struct pt_regs)' (that is,
94 * ®s[1]) does not exceed the bottom of the stack to avoid
95 * accessing data outside the task's stack. This may happen
96 * when frame->ex_frame is a false positive.
98 if ((unsigned long)®s
[1] > ALIGN(frame
->sp
, THREAD_SIZE
))
101 frame
->pc
= regs
->ARM_pc
;
102 frame
->ex_frame
= false;
106 /* restore the registers from the stack frame */
107 #ifdef CONFIG_CC_IS_CLANG
108 frame
->sp
= frame
->fp
;
109 frame
->fp
= READ_ONCE_NOCHECK(*(unsigned long *)(fp
));
110 frame
->pc
= READ_ONCE_NOCHECK(*(unsigned long *)(fp
+ 4));
112 frame
->fp
= READ_ONCE_NOCHECK(*(unsigned long *)(fp
- 12));
113 frame
->sp
= READ_ONCE_NOCHECK(*(unsigned long *)(fp
- 8));
114 frame
->pc
= READ_ONCE_NOCHECK(*(unsigned long *)(fp
- 4));
116 #ifdef CONFIG_KRETPROBES
117 if (is_kretprobe_trampoline(frame
->pc
))
118 frame
->pc
= kretprobe_find_ret_addr(frame
->tsk
,
119 (void *)frame
->fp
, &frame
->kr_cur
);
122 if (in_entry_text(frame
->pc
))
123 frame
->ex_frame
= true;
129 void notrace
walk_stackframe(struct stackframe
*frame
,
130 bool (*fn
)(void *, unsigned long), void *data
)
135 if (!fn(data
, frame
->pc
))
137 ret
= unwind_frame(frame
);
142 EXPORT_SYMBOL(walk_stackframe
);
144 #ifdef CONFIG_STACKTRACE
145 static void start_stack_trace(struct stackframe
*frame
, struct task_struct
*task
,
146 unsigned long fp
, unsigned long sp
,
147 unsigned long lr
, unsigned long pc
)
153 #ifdef CONFIG_KRETPROBES
154 frame
->kr_cur
= NULL
;
157 #ifdef CONFIG_UNWINDER_FRAME_POINTER
158 frame
->ex_frame
= in_entry_text(frame
->pc
);
162 void arch_stack_walk(stack_trace_consume_fn consume_entry
, void *cookie
,
163 struct task_struct
*task
, struct pt_regs
*regs
)
165 struct stackframe frame
;
168 start_stack_trace(&frame
, NULL
, regs
->ARM_fp
, regs
->ARM_sp
,
169 regs
->ARM_lr
, regs
->ARM_pc
);
170 } else if (task
!= current
) {
173 * What guarantees do we have here that 'tsk' is not
174 * running on another CPU? For now, ignore it as we
175 * can't guarantee we won't explode.
179 start_stack_trace(&frame
, task
, thread_saved_fp(task
),
180 thread_saved_sp(task
), 0,
181 thread_saved_pc(task
));
185 start_stack_trace(&frame
, task
,
186 (unsigned long)__builtin_frame_address(0),
187 current_stack_pointer
,
188 (unsigned long)__builtin_return_address(0),
189 (unsigned long)&&here
);
190 /* skip this function */
191 if (unwind_frame(&frame
))
195 walk_stackframe(&frame
, consume_entry
, cookie
);