linux/arch/mips/include/asm/stacktrace.h
<<
>>
Prefs
   1#ifndef _ASM_STACKTRACE_H
   2#define _ASM_STACKTRACE_H
   3
   4#include <asm/ptrace.h>
   5
   6#ifdef CONFIG_KALLSYMS
   7extern int raw_show_trace;
   8extern unsigned long unwind_stack(struct task_struct *task, unsigned long *sp,
   9                                  unsigned long pc, unsigned long *ra);
  10#else
  11#define raw_show_trace 1
  12static inline unsigned long unwind_stack(struct task_struct *task,
  13        unsigned long *sp, unsigned long pc, unsigned long *ra)
  14{
  15        return 0;
  16}
  17#endif
  18
  19static __always_inline void prepare_frametrace(struct pt_regs *regs)
  20{
  21#ifndef CONFIG_KALLSYMS
  22        /*
  23         * Remove any garbage that may be in regs (specially func
  24         * addresses) to avoid show_raw_backtrace() to report them
  25         */
  26        memset(regs, 0, sizeof(*regs));
  27#endif
  28        __asm__ __volatile__(
  29                ".set push\n\t"
  30                ".set noat\n\t"
  31#ifdef CONFIG_64BIT
  32                "1: dla $1, 1b\n\t"
  33                "sd $1, %0\n\t"
  34                "sd $29, %1\n\t"
  35                "sd $31, %2\n\t"
  36#else
  37                "1: la $1, 1b\n\t"
  38                "sw $1, %0\n\t"
  39                "sw $29, %1\n\t"
  40                "sw $31, %2\n\t"
  41#endif
  42                ".set pop\n\t"
  43                : "=m" (regs->cp0_epc),
  44                "=m" (regs->regs[29]), "=m" (regs->regs[31])
  45                : : "memory");
  46}
  47
  48#endif /* _ASM_STACKTRACE_H */
  49