linux/include/linux/stacktrace.h
<<
>>
Prefs
   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_STACKTRACE
  12void 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 */
  26#ifdef CONFIG_ARCH_STACKWALK
  27
  28/**
  29 * stack_trace_consume_fn - Callback for arch_stack_walk()
  30 * @cookie:     Caller supplied pointer handed back by arch_stack_walk()
  31 * @addr:       The stack entry address to consume
  32 * @reliable:   True when the stack entry is reliable. Required by
  33 *              some printk based consumers.
  34 *
  35 * Return:      True, if the entry was consumed or skipped
  36 *              False, if there is no space left to store
  37 */
  38typedef bool (*stack_trace_consume_fn)(void *cookie, unsigned long addr,
  39                                       bool reliable);
  40/**
  41 * arch_stack_walk - Architecture specific function to walk the stack
  42 * @consume_entry:      Callback which is invoked by the architecture code for
  43 *                      each entry.
  44 * @cookie:             Caller supplied pointer which is handed back to
  45 *                      @consume_entry
  46 * @task:               Pointer to a task struct, can be NULL
  47 * @regs:               Pointer to registers, can be NULL
  48 *
  49 * ============ ======= ============================================
  50 * task         regs
  51 * ============ ======= ============================================
  52 * task         NULL    Stack trace from task (can be current)
  53 * current      regs    Stack trace starting on regs->stackpointer
  54 * ============ ======= ============================================
  55 */
  56void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
  57                     struct task_struct *task, struct pt_regs *regs);
  58int arch_stack_walk_reliable(stack_trace_consume_fn consume_entry, void *cookie,
  59                             struct task_struct *task);
  60void arch_stack_walk_user(stack_trace_consume_fn consume_entry, void *cookie,
  61                          const struct pt_regs *regs);
  62
  63#else /* CONFIG_ARCH_STACKWALK */
  64struct stack_trace {
  65        unsigned int nr_entries, max_entries;
  66        unsigned long *entries;
  67        int skip;       /* input argument: How many entries to skip */
  68};
  69
  70extern void save_stack_trace(struct stack_trace *trace);
  71extern void save_stack_trace_regs(struct pt_regs *regs,
  72                                  struct stack_trace *trace);
  73extern void save_stack_trace_tsk(struct task_struct *tsk,
  74                                struct stack_trace *trace);
  75extern int save_stack_trace_tsk_reliable(struct task_struct *tsk,
  76                                         struct stack_trace *trace);
  77extern void save_stack_trace_user(struct stack_trace *trace);
  78#endif /* !CONFIG_ARCH_STACKWALK */
  79#endif /* CONFIG_STACKTRACE */
  80
  81#if defined(CONFIG_STACKTRACE) && defined(CONFIG_HAVE_RELIABLE_STACKTRACE)
  82int stack_trace_save_tsk_reliable(struct task_struct *tsk, unsigned long *store,
  83                                  unsigned int size);
  84#else
  85static inline int stack_trace_save_tsk_reliable(struct task_struct *tsk,
  86                                                unsigned long *store,
  87                                                unsigned int size)
  88{
  89        return -ENOSYS;
  90}
  91#endif
  92
  93#endif /* __LINUX_STACKTRACE_H */
  94