GNU Linux-libre 5.19-rc6-gnu
[releases.git] / arch / arm / include / asm / stacktrace.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __ASM_STACKTRACE_H
3 #define __ASM_STACKTRACE_H
4
5 #include <asm/ptrace.h>
6 #include <linux/llist.h>
7
8 struct stackframe {
9         /*
10          * FP member should hold R7 when CONFIG_THUMB2_KERNEL is enabled
11          * and R11 otherwise.
12          */
13         unsigned long fp;
14         unsigned long sp;
15         unsigned long lr;
16         unsigned long pc;
17
18         /* address of the LR value on the stack */
19         unsigned long *lr_addr;
20 #ifdef CONFIG_KRETPROBES
21         struct llist_node *kr_cur;
22         struct task_struct *tsk;
23 #endif
24 };
25
26 static __always_inline
27 void arm_get_current_stackframe(struct pt_regs *regs, struct stackframe *frame)
28 {
29                 frame->fp = frame_pointer(regs);
30                 frame->sp = regs->ARM_sp;
31                 frame->lr = regs->ARM_lr;
32                 frame->pc = regs->ARM_pc;
33 #ifdef CONFIG_KRETPROBES
34                 frame->kr_cur = NULL;
35                 frame->tsk = current;
36 #endif
37 }
38
39 extern int unwind_frame(struct stackframe *frame);
40 extern void walk_stackframe(struct stackframe *frame,
41                             int (*fn)(struct stackframe *, void *), void *data);
42 extern void dump_mem(const char *lvl, const char *str, unsigned long bottom,
43                      unsigned long top);
44
45 #endif  /* __ASM_STACKTRACE_H */