1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __LINUX_STACKTRACE_H 3 #define __LINUX_STACKTRACE_H 4 5 #include <linux/types.h> 6 #include <asm/errno.h> 7 8 struct task_struct; 9 struct pt_regs; 10 11 #ifdef CONFIG_STACKTRACE 12 void stack_trace_print(unsigned long *trace, unsigned int nr_entries, 13 int spaces); 14 int stack_trace_snprint(char *buf, size_t size, 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 struct stack_trace { 27 unsigned int nr_entries, max_entries; 28 unsigned long *entries; 29 int skip; /* input argument: How many entries to skip */ 30 }; 31 32 extern void save_stack_trace(struct stack_trace *trace); 33 extern void save_stack_trace_regs(struct pt_regs *regs, 34 struct stack_trace *trace); 35 extern void save_stack_trace_tsk(struct task_struct *tsk, 36 struct stack_trace *trace); 37 extern int save_stack_trace_tsk_reliable(struct task_struct *tsk, 38 struct stack_trace *trace); 39 extern void save_stack_trace_user(struct stack_trace *trace); 40 #endif /* CONFIG_STACKTRACE */ 41 42 #if defined(CONFIG_STACKTRACE) && defined(CONFIG_HAVE_RELIABLE_STACKTRACE) 43 int stack_trace_save_tsk_reliable(struct task_struct *tsk, unsigned long *store, 44 unsigned int size); 45 #else 46 static inline int stack_trace_save_tsk_reliable(struct task_struct *tsk, 47 unsigned long *store, 48 unsigned int size) 49 { 50 return -ENOSYS; 51 } 52 #endif 53 54 #endif /* __LINUX_STACKTRACE_H */ 55