blob: a24340b3e9e142766fe65cb03394132a73cd3d7f [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Ingo Molnar8637c092006-07-03 00:24:38 -07002#ifndef __LINUX_STACKTRACE_H
3#define __LINUX_STACKTRACE_H
4
Joonsoo Kim9a92a6c2014-12-12 16:55:58 -08005#include <linux/types.h>
Thomas Gleixnere9b98e12019-04-25 11:44:55 +02006#include <asm/errno.h>
Joonsoo Kim9a92a6c2014-12-12 16:55:58 -08007
Andrew Morton897312b2008-10-03 15:23:41 -07008struct task_struct;
Soeren Sandmann Pedersen9c0729d2010-11-05 05:59:39 -04009struct pt_regs;
Andrew Morton897312b2008-10-03 15:23:41 -070010
Ingo Molnar8637c092006-07-03 00:24:38 -070011#ifdef CONFIG_STACKTRACE
Thomas Gleixnere9b98e12019-04-25 11:44:55 +020012void stack_trace_print(unsigned long *trace, unsigned int nr_entries,
13 int spaces);
14int stack_trace_snprint(char *buf, size_t size, unsigned long *entries,
15 unsigned int nr_entries, int spaces);
16unsigned int stack_trace_save(unsigned long *store, unsigned int size,
17 unsigned int skipnr);
18unsigned int stack_trace_save_tsk(struct task_struct *task,
19 unsigned long *store, unsigned int size,
20 unsigned int skipnr);
21unsigned int stack_trace_save_regs(struct pt_regs *regs, unsigned long *store,
22 unsigned int size, unsigned int skipnr);
23unsigned int stack_trace_save_user(unsigned long *store, unsigned int size);
24
25/* Internal interfaces. Do not use in generic code */
Ingo Molnar8637c092006-07-03 00:24:38 -070026struct stack_trace {
27 unsigned int nr_entries, max_entries;
28 unsigned long *entries;
Andi Kleen5a1b3992006-09-26 10:52:34 +020029 int skip; /* input argument: How many entries to skip */
Ingo Molnar8637c092006-07-03 00:24:38 -070030};
31
Christoph Hellwigab1b6f02007-05-08 00:23:29 -070032extern void save_stack_trace(struct stack_trace *trace);
Masami Hiramatsu39581062011-06-08 16:09:21 +090033extern void save_stack_trace_regs(struct pt_regs *regs,
34 struct stack_trace *trace);
Arjan van de Ven97455122008-01-25 21:08:34 +010035extern void save_stack_trace_tsk(struct task_struct *tsk,
36 struct stack_trace *trace);
Josh Poimboeufaf085d92017-02-13 19:42:28 -060037extern int save_stack_trace_tsk_reliable(struct task_struct *tsk,
38 struct stack_trace *trace);
Ingo Molnar8637c092006-07-03 00:24:38 -070039
40extern void print_stack_trace(struct stack_trace *trace, int spaces);
Joonsoo Kim9a92a6c2014-12-12 16:55:58 -080041extern int snprint_stack_trace(char *buf, size_t size,
42 struct stack_trace *trace, int spaces);
Török Edwin02b67512008-11-22 13:28:47 +020043
Török Edwin8d264872008-11-23 12:39:08 +020044#ifdef CONFIG_USER_STACKTRACE_SUPPORT
Török Edwin02b67512008-11-22 13:28:47 +020045extern void save_stack_trace_user(struct stack_trace *trace);
46#else
47# define save_stack_trace_user(trace) do { } while (0)
48#endif
49
Josh Poimboeufaf085d92017-02-13 19:42:28 -060050#else /* !CONFIG_STACKTRACE */
Christoph Hellwigab1b6f02007-05-08 00:23:29 -070051# define save_stack_trace(trace) do { } while (0)
Arjan van de Ven97455122008-01-25 21:08:34 +010052# define save_stack_trace_tsk(tsk, trace) do { } while (0)
Török Edwin8d7c6a92008-11-23 12:39:06 +020053# define save_stack_trace_user(trace) do { } while (0)
Johannes Berg3b5ad072007-07-19 01:49:02 -070054# define print_stack_trace(trace, spaces) do { } while (0)
Joonsoo Kim9a92a6c2014-12-12 16:55:58 -080055# define snprint_stack_trace(buf, size, trace, spaces) do { } while (0)
Josh Poimboeufaf085d92017-02-13 19:42:28 -060056# define save_stack_trace_tsk_reliable(tsk, trace) ({ -ENOSYS; })
57#endif /* CONFIG_STACKTRACE */
Ingo Molnar8637c092006-07-03 00:24:38 -070058
Thomas Gleixnere9b98e12019-04-25 11:44:55 +020059#if defined(CONFIG_STACKTRACE) && defined(CONFIG_HAVE_RELIABLE_STACKTRACE)
60int stack_trace_save_tsk_reliable(struct task_struct *tsk, unsigned long *store,
61 unsigned int size);
62#else
63static 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
Josh Poimboeufaf085d92017-02-13 19:42:28 -060071#endif /* __LINUX_STACKTRACE_H */