| .. | .. |
|---|
| 3 | 3 | #define __LINUX_STACKTRACE_H |
|---|
| 4 | 4 | |
|---|
| 5 | 5 | #include <linux/types.h> |
|---|
| 6 | +#include <asm/errno.h> |
|---|
| 6 | 7 | |
|---|
| 7 | 8 | struct task_struct; |
|---|
| 8 | 9 | struct pt_regs; |
|---|
| 9 | 10 | |
|---|
| 10 | 11 | #ifdef CONFIG_STACKTRACE |
|---|
| 12 | +void stack_trace_print(const unsigned long *trace, unsigned int nr_entries, |
|---|
| 13 | + int spaces); |
|---|
| 14 | +int stack_trace_snprint(char *buf, size_t size, const unsigned long *entries, |
|---|
| 15 | + unsigned int nr_entries, int spaces); |
|---|
| 16 | +unsigned int stack_trace_save(unsigned long *store, unsigned int size, |
|---|
| 17 | + unsigned int skipnr); |
|---|
| 18 | +unsigned int stack_trace_save_tsk(struct task_struct *task, |
|---|
| 19 | + unsigned long *store, unsigned int size, |
|---|
| 20 | + unsigned int skipnr); |
|---|
| 21 | +unsigned int stack_trace_save_regs(struct pt_regs *regs, unsigned long *store, |
|---|
| 22 | + unsigned int size, unsigned int skipnr); |
|---|
| 23 | +unsigned int stack_trace_save_user(unsigned long *store, unsigned int size); |
|---|
| 24 | + |
|---|
| 25 | +/* Internal interfaces. Do not use in generic code */ |
|---|
| 26 | +#ifdef CONFIG_ARCH_STACKWALK |
|---|
| 27 | + |
|---|
| 28 | +/** |
|---|
| 29 | + * stack_trace_consume_fn - Callback for arch_stack_walk() |
|---|
| 30 | + * @cookie: Caller supplied pointer handed back by arch_stack_walk() |
|---|
| 31 | + * @addr: The stack entry address to consume |
|---|
| 32 | + * |
|---|
| 33 | + * Return: True, if the entry was consumed or skipped |
|---|
| 34 | + * False, if there is no space left to store |
|---|
| 35 | + */ |
|---|
| 36 | +typedef bool (*stack_trace_consume_fn)(void *cookie, unsigned long addr); |
|---|
| 37 | +/** |
|---|
| 38 | + * arch_stack_walk - Architecture specific function to walk the stack |
|---|
| 39 | + * @consume_entry: Callback which is invoked by the architecture code for |
|---|
| 40 | + * each entry. |
|---|
| 41 | + * @cookie: Caller supplied pointer which is handed back to |
|---|
| 42 | + * @consume_entry |
|---|
| 43 | + * @task: Pointer to a task struct, can be NULL |
|---|
| 44 | + * @regs: Pointer to registers, can be NULL |
|---|
| 45 | + * |
|---|
| 46 | + * ============ ======= ============================================ |
|---|
| 47 | + * task regs |
|---|
| 48 | + * ============ ======= ============================================ |
|---|
| 49 | + * task NULL Stack trace from task (can be current) |
|---|
| 50 | + * current regs Stack trace starting on regs->stackpointer |
|---|
| 51 | + * ============ ======= ============================================ |
|---|
| 52 | + */ |
|---|
| 53 | +void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie, |
|---|
| 54 | + struct task_struct *task, struct pt_regs *regs); |
|---|
| 55 | +int arch_stack_walk_reliable(stack_trace_consume_fn consume_entry, void *cookie, |
|---|
| 56 | + struct task_struct *task); |
|---|
| 57 | +void arch_stack_walk_user(stack_trace_consume_fn consume_entry, void *cookie, |
|---|
| 58 | + const struct pt_regs *regs); |
|---|
| 59 | + |
|---|
| 60 | +#else /* CONFIG_ARCH_STACKWALK */ |
|---|
| 11 | 61 | struct stack_trace { |
|---|
| 12 | 62 | unsigned int nr_entries, max_entries; |
|---|
| 13 | 63 | unsigned long *entries; |
|---|
| 14 | | - int skip; /* input argument: How many entries to skip */ |
|---|
| 64 | + unsigned int skip; /* input argument: How many entries to skip */ |
|---|
| 15 | 65 | }; |
|---|
| 16 | 66 | |
|---|
| 17 | 67 | extern void save_stack_trace(struct stack_trace *trace); |
|---|
| .. | .. |
|---|
| 21 | 71 | struct stack_trace *trace); |
|---|
| 22 | 72 | extern int save_stack_trace_tsk_reliable(struct task_struct *tsk, |
|---|
| 23 | 73 | struct stack_trace *trace); |
|---|
| 24 | | - |
|---|
| 25 | | -extern void print_stack_trace(struct stack_trace *trace, int spaces); |
|---|
| 26 | | -extern int snprint_stack_trace(char *buf, size_t size, |
|---|
| 27 | | - struct stack_trace *trace, int spaces); |
|---|
| 28 | | - |
|---|
| 29 | | -#ifdef CONFIG_USER_STACKTRACE_SUPPORT |
|---|
| 30 | 74 | extern void save_stack_trace_user(struct stack_trace *trace); |
|---|
| 31 | | -#else |
|---|
| 32 | | -# define save_stack_trace_user(trace) do { } while (0) |
|---|
| 33 | | -#endif |
|---|
| 34 | | - |
|---|
| 35 | | -#else /* !CONFIG_STACKTRACE */ |
|---|
| 36 | | -# define save_stack_trace(trace) do { } while (0) |
|---|
| 37 | | -# define save_stack_trace_tsk(tsk, trace) do { } while (0) |
|---|
| 38 | | -# define save_stack_trace_user(trace) do { } while (0) |
|---|
| 39 | | -# define print_stack_trace(trace, spaces) do { } while (0) |
|---|
| 40 | | -# define snprint_stack_trace(buf, size, trace, spaces) do { } while (0) |
|---|
| 41 | | -# define save_stack_trace_tsk_reliable(tsk, trace) ({ -ENOSYS; }) |
|---|
| 75 | +#endif /* !CONFIG_ARCH_STACKWALK */ |
|---|
| 42 | 76 | #endif /* CONFIG_STACKTRACE */ |
|---|
| 43 | 77 | |
|---|
| 78 | +#if defined(CONFIG_STACKTRACE) && defined(CONFIG_HAVE_RELIABLE_STACKTRACE) |
|---|
| 79 | +int stack_trace_save_tsk_reliable(struct task_struct *tsk, unsigned long *store, |
|---|
| 80 | + unsigned int size); |
|---|
| 81 | +#else |
|---|
| 82 | +static inline int stack_trace_save_tsk_reliable(struct task_struct *tsk, |
|---|
| 83 | + unsigned long *store, |
|---|
| 84 | + unsigned int size) |
|---|
| 85 | +{ |
|---|
| 86 | + return -ENOSYS; |
|---|
| 87 | +} |
|---|
| 88 | +#endif |
|---|
| 89 | + |
|---|
| 44 | 90 | #endif /* __LINUX_STACKTRACE_H */ |
|---|