1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 28637c099SIngo Molnar #ifndef __LINUX_STACKTRACE_H 38637c099SIngo Molnar #define __LINUX_STACKTRACE_H 48637c099SIngo Molnar 59a92a6ceSJoonsoo Kim #include <linux/types.h> 6*e9b98e16SThomas Gleixner #include <asm/errno.h> 79a92a6ceSJoonsoo Kim 8897312bdSAndrew Morton struct task_struct; 99c0729dcSSoeren Sandmann Pedersen struct pt_regs; 10897312bdSAndrew Morton 118637c099SIngo Molnar #ifdef CONFIG_STACKTRACE 12*e9b98e16SThomas Gleixner void stack_trace_print(unsigned long *trace, unsigned int nr_entries, 13*e9b98e16SThomas Gleixner int spaces); 14*e9b98e16SThomas Gleixner int stack_trace_snprint(char *buf, size_t size, unsigned long *entries, 15*e9b98e16SThomas Gleixner unsigned int nr_entries, int spaces); 16*e9b98e16SThomas Gleixner unsigned int stack_trace_save(unsigned long *store, unsigned int size, 17*e9b98e16SThomas Gleixner unsigned int skipnr); 18*e9b98e16SThomas Gleixner unsigned int stack_trace_save_tsk(struct task_struct *task, 19*e9b98e16SThomas Gleixner unsigned long *store, unsigned int size, 20*e9b98e16SThomas Gleixner unsigned int skipnr); 21*e9b98e16SThomas Gleixner unsigned int stack_trace_save_regs(struct pt_regs *regs, unsigned long *store, 22*e9b98e16SThomas Gleixner unsigned int size, unsigned int skipnr); 23*e9b98e16SThomas Gleixner unsigned int stack_trace_save_user(unsigned long *store, unsigned int size); 24*e9b98e16SThomas Gleixner 25*e9b98e16SThomas Gleixner /* Internal interfaces. Do not use in generic code */ 268637c099SIngo Molnar struct stack_trace { 278637c099SIngo Molnar unsigned int nr_entries, max_entries; 288637c099SIngo Molnar unsigned long *entries; 295a1b3999SAndi Kleen int skip; /* input argument: How many entries to skip */ 308637c099SIngo Molnar }; 318637c099SIngo Molnar 32ab1b6f03SChristoph Hellwig extern void save_stack_trace(struct stack_trace *trace); 3339581062SMasami Hiramatsu extern void save_stack_trace_regs(struct pt_regs *regs, 3439581062SMasami Hiramatsu struct stack_trace *trace); 359745512cSArjan van de Ven extern void save_stack_trace_tsk(struct task_struct *tsk, 369745512cSArjan van de Ven struct stack_trace *trace); 37af085d90SJosh Poimboeuf extern int save_stack_trace_tsk_reliable(struct task_struct *tsk, 38af085d90SJosh Poimboeuf struct stack_trace *trace); 398637c099SIngo Molnar 408637c099SIngo Molnar extern void print_stack_trace(struct stack_trace *trace, int spaces); 419a92a6ceSJoonsoo Kim extern int snprint_stack_trace(char *buf, size_t size, 429a92a6ceSJoonsoo Kim struct stack_trace *trace, int spaces); 4302b67518STörök Edwin 448d26487fSTörök Edwin #ifdef CONFIG_USER_STACKTRACE_SUPPORT 4502b67518STörök Edwin extern void save_stack_trace_user(struct stack_trace *trace); 4602b67518STörök Edwin #else 4702b67518STörök Edwin # define save_stack_trace_user(trace) do { } while (0) 4802b67518STörök Edwin #endif 4902b67518STörök Edwin 50af085d90SJosh Poimboeuf #else /* !CONFIG_STACKTRACE */ 51ab1b6f03SChristoph Hellwig # define save_stack_trace(trace) do { } while (0) 529745512cSArjan van de Ven # define save_stack_trace_tsk(tsk, trace) do { } while (0) 5302b67518STörök Edwin # define save_stack_trace_user(trace) do { } while (0) 543b5ad079SJohannes Berg # define print_stack_trace(trace, spaces) do { } while (0) 559a92a6ceSJoonsoo Kim # define snprint_stack_trace(buf, size, trace, spaces) do { } while (0) 56af085d90SJosh Poimboeuf # define save_stack_trace_tsk_reliable(tsk, trace) ({ -ENOSYS; }) 57af085d90SJosh Poimboeuf #endif /* CONFIG_STACKTRACE */ 588637c099SIngo Molnar 59*e9b98e16SThomas Gleixner #if defined(CONFIG_STACKTRACE) && defined(CONFIG_HAVE_RELIABLE_STACKTRACE) 60*e9b98e16SThomas Gleixner int stack_trace_save_tsk_reliable(struct task_struct *tsk, unsigned long *store, 61*e9b98e16SThomas Gleixner unsigned int size); 62*e9b98e16SThomas Gleixner #else 63*e9b98e16SThomas Gleixner static inline int stack_trace_save_tsk_reliable(struct task_struct *tsk, 64*e9b98e16SThomas Gleixner unsigned long *store, 65*e9b98e16SThomas Gleixner unsigned int size) 66*e9b98e16SThomas Gleixner { 67*e9b98e16SThomas Gleixner return -ENOSYS; 68*e9b98e16SThomas Gleixner } 69*e9b98e16SThomas Gleixner #endif 70*e9b98e16SThomas Gleixner 71af085d90SJosh Poimboeuf #endif /* __LINUX_STACKTRACE_H */ 72