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 12#define unwind_stack(task, sp, pc, ra) 0 13#endif 14 15static __always_inline void prepare_frametrace(struct pt_regs *regs) 16{ 17#ifndef CONFIG_KALLSYMS 18 /* 19 * Remove any garbage that may be in regs (specially func 20 * addresses) to avoid show_raw_backtrace() to report them 21 */ 22 memset(regs, 0, sizeof(*regs)); 23#endif 24 __asm__ __volatile__( 25 ".set push\n\t" 26 ".set noat\n\t" 27#ifdef CONFIG_64BIT 28 "1: dla $1, 1b\n\t" 29 "sd $1, %0\n\t" 30 "sd $29, %1\n\t" 31 "sd $31, %2\n\t" 32#else 33 "1: la $1, 1b\n\t" 34 "sw $1, %0\n\t" 35 "sw $29, %1\n\t" 36 "sw $31, %2\n\t" 37#endif 38 ".set pop\n\t" 39 : "=m" (regs->cp0_epc), 40 "=m" (regs->regs[29]), "=m" (regs->regs[31]) 41 : : "memory"); 42} 43 44#endif /* _ASM_STACKTRACE_H */ 45