cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

stacktrace.h (4097B)


      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 */