| 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
| 2 | #ifndef _ASM_UML_STACKTRACE_H |
| 3 | #define _ASM_UML_STACKTRACE_H |
| 4 | |
| 5 | #include <linux/uaccess.h> |
| 6 | #include <linux/ptrace.h> |
| 7 | |
| 8 | struct stack_frame { |
| 9 | struct stack_frame *next_frame; |
| 10 | unsigned long return_address; |
| 11 | }; |
| 12 | |
| 13 | struct stacktrace_ops { |
| 14 | void (*address)(void *data, unsigned long address, int reliable); |
| 15 | }; |
| 16 | |
| 17 | #ifdef CONFIG_FRAME_POINTER |
| 18 | static inline unsigned long |
| 19 | get_frame_pointer(struct task_struct *task, struct pt_regs *segv_regs) |
| 20 | { |
| 21 | if (!task || task == current) |
| 22 | return segv_regs ? PT_REGS_BP(segv_regs) : current_bp(); |
| 23 | return KSTK_EBP(task); |
| 24 | } |
| 25 | #else |
| 26 | static inline unsigned long |
| 27 | get_frame_pointer(struct task_struct *task, struct pt_regs *segv_regs) |
| 28 | { |
| 29 | return 0; |
| 30 | } |
| 31 | #endif |
| 32 | |
| 33 | static inline unsigned long |
| 34 | *get_stack_pointer(struct task_struct *task, struct pt_regs *segv_regs) |
| 35 | { |
| 36 | if (!task || task == current) |
| 37 | return segv_regs ? (unsigned long *)PT_REGS_SP(segv_regs) : current_sp(); |
| 38 | return (unsigned long *)KSTK_ESP(task); |
| 39 | } |
| 40 | |
| 41 | void dump_trace(struct task_struct *tsk, const struct stacktrace_ops *ops, void *data); |
| 42 | |
| 43 | #endif /* _ASM_UML_STACKTRACE_H */ |