.. | .. |
---|
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 */ |
---|