xref: /linux-6.15/include/linux/stacktrace.h (revision e9b98e16)
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 
40 extern void print_stack_trace(struct stack_trace *trace, int spaces);
41 extern int snprint_stack_trace(char *buf, size_t size,
42 			struct stack_trace *trace, int spaces);
43 
44 #ifdef CONFIG_USER_STACKTRACE_SUPPORT
45 extern void save_stack_trace_user(struct stack_trace *trace);
46 #else
47 # define save_stack_trace_user(trace)              do { } while (0)
48 #endif
49 
50 #else /* !CONFIG_STACKTRACE */
51 # define save_stack_trace(trace)			do { } while (0)
52 # define save_stack_trace_tsk(tsk, trace)		do { } while (0)
53 # define save_stack_trace_user(trace)			do { } while (0)
54 # define print_stack_trace(trace, spaces)		do { } while (0)
55 # define snprint_stack_trace(buf, size, trace, spaces)	do { } while (0)
56 # define save_stack_trace_tsk_reliable(tsk, trace)	({ -ENOSYS; })
57 #endif /* CONFIG_STACKTRACE */
58 
59 #if defined(CONFIG_STACKTRACE) && defined(CONFIG_HAVE_RELIABLE_STACKTRACE)
60 int stack_trace_save_tsk_reliable(struct task_struct *tsk, unsigned long *store,
61 				  unsigned int size);
62 #else
63 static inline int stack_trace_save_tsk_reliable(struct task_struct *tsk,
64 						unsigned long *store,
65 						unsigned int size)
66 {
67 	return -ENOSYS;
68 }
69 #endif
70 
71 #endif /* __LINUX_STACKTRACE_H */
72