xref: /linux-6.15/include/linux/stacktrace.h (revision e9b98e16)
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