File Index
Files and directories
Sign in
FILE

stacktrace.h

File preview with syntax highlighting.

linux-6.19.14/include/linux/stacktrace.h C
  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
  8struct task_struct;
  9struct pt_regs;
 10
 11#ifdef CONFIG_ARCH_STACKWALK
 12
 13/**
 14 * stack_trace_consume_fn - Callback for arch_stack_walk()
 15 * @cookie:	Caller supplied pointer handed back by arch_stack_walk()
 16 * @addr:	The stack entry address to consume
 17 *
 18 * Return:	True, if the entry was consumed or skipped
 19 *		False, if there is no space left to store
 20 */
 21typedef bool (*stack_trace_consume_fn)(void *cookie, unsigned long addr);
 22/**
 23 * arch_stack_walk - Architecture specific function to walk the stack
 24 * @consume_entry:	Callback which is invoked by the architecture code for
 25 *			each entry.
 26 * @cookie:		Caller supplied pointer which is handed back to
 27 *			@consume_entry
 28 * @task:		Pointer to a task struct, can be NULL
 29 * @regs:		Pointer to registers, can be NULL
 30 *
 31 * ============ ======= ============================================
 32 * task	        regs
 33 * ============ ======= ============================================
 34 * task		NULL	Stack trace from task (can be current)
 35 * current	regs	Stack trace starting on regs->stackpointer
 36 * ============ ======= ============================================
 37 */
 38void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
 39		     struct task_struct *task, struct pt_regs *regs);
 40
 41/**
 42 * arch_stack_walk_reliable - Architecture specific function to walk the
 43 *			      stack reliably
 44 *
 45 * @consume_entry:	Callback which is invoked by the architecture code for
 46 *			each entry.
 47 * @cookie:		Caller supplied pointer which is handed back to
 48 *			@consume_entry
 49 * @task:		Pointer to a task struct, can be NULL
 50 *
 51 * This function returns an error if it detects any unreliable
 52 * features of the stack. Otherwise it guarantees that the stack
 53 * trace is reliable.
 54 *
 55 * If the task is not 'current', the caller *must* ensure the task is
 56 * inactive and its stack is pinned.
 57 */
 58int arch_stack_walk_reliable(stack_trace_consume_fn consume_entry, void *cookie,
 59			     struct task_struct *task);
 60
 61void arch_stack_walk_user(stack_trace_consume_fn consume_entry, void *cookie,
 62			  const struct pt_regs *regs);
 63#endif /* CONFIG_ARCH_STACKWALK */
 64
 65#ifdef CONFIG_STACKTRACE
 66void stack_trace_print(const unsigned long *trace, unsigned int nr_entries,
 67		       int spaces);
 68int stack_trace_snprint(char *buf, size_t size, const unsigned long *entries,
 69			unsigned int nr_entries, int spaces);
 70unsigned int stack_trace_save(unsigned long *store, unsigned int size,
 71			      unsigned int skipnr);
 72unsigned int stack_trace_save_tsk(struct task_struct *task,
 73				  unsigned long *store, unsigned int size,
 74				  unsigned int skipnr);
 75unsigned int stack_trace_save_regs(struct pt_regs *regs, unsigned long *store,
 76				   unsigned int size, unsigned int skipnr);
 77unsigned int stack_trace_save_user(unsigned long *store, unsigned int size);
 78unsigned int filter_irq_stacks(unsigned long *entries, unsigned int nr_entries);
 79
 80#ifndef CONFIG_ARCH_STACKWALK
 81/* Internal interfaces. Do not use in generic code */
 82struct stack_trace {
 83	unsigned int nr_entries, max_entries;
 84	unsigned long *entries;
 85	unsigned int skip;	/* input argument: How many entries to skip */
 86};
 87
 88extern void save_stack_trace(struct stack_trace *trace);
 89extern void save_stack_trace_regs(struct pt_regs *regs,
 90				  struct stack_trace *trace);
 91extern void save_stack_trace_tsk(struct task_struct *tsk,
 92				struct stack_trace *trace);
 93extern int save_stack_trace_tsk_reliable(struct task_struct *tsk,
 94					 struct stack_trace *trace);
 95extern void save_stack_trace_user(struct stack_trace *trace);
 96#endif /* !CONFIG_ARCH_STACKWALK */
 97#endif /* CONFIG_STACKTRACE */
 98
 99#if defined(CONFIG_STACKTRACE) && defined(CONFIG_HAVE_RELIABLE_STACKTRACE)
100int stack_trace_save_tsk_reliable(struct task_struct *tsk, unsigned long *store,
101				  unsigned int size);
102#else
103static inline int stack_trace_save_tsk_reliable(struct task_struct *tsk,
104						unsigned long *store,
105						unsigned int size)
106{
107	return -ENOSYS;
108}
109#endif
110
111#endif /* __LINUX_STACKTRACE_H */
~/ Read-only file preview.