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