1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2384740dcSRalf Baechle #ifndef _ASM_STACKTRACE_H
3384740dcSRalf Baechle #define _ASM_STACKTRACE_H
4384740dcSRalf Baechle
5384740dcSRalf Baechle #include <asm/ptrace.h>
65b6b0847SCorey Minyard #include <asm/asm.h>
75b6b0847SCorey Minyard #include <linux/stringify.h>
8384740dcSRalf Baechle
9384740dcSRalf Baechle #ifdef CONFIG_KALLSYMS
10384740dcSRalf Baechle extern int raw_show_trace;
11384740dcSRalf Baechle extern unsigned long unwind_stack(struct task_struct *task, unsigned long *sp,
12384740dcSRalf Baechle unsigned long pc, unsigned long *ra);
1394ea09c6SDaniel Kalmar extern unsigned long unwind_stack_by_address(unsigned long stack_page,
1494ea09c6SDaniel Kalmar unsigned long *sp,
1594ea09c6SDaniel Kalmar unsigned long pc,
1694ea09c6SDaniel Kalmar unsigned long *ra);
17384740dcSRalf Baechle #else
18384740dcSRalf Baechle #define raw_show_trace 1
unwind_stack(struct task_struct * task,unsigned long * sp,unsigned long pc,unsigned long * ra)19384740dcSRalf Baechle static inline unsigned long unwind_stack(struct task_struct *task,
20384740dcSRalf Baechle unsigned long *sp, unsigned long pc, unsigned long *ra)
21384740dcSRalf Baechle {
22384740dcSRalf Baechle return 0;
23384740dcSRalf Baechle }
24384740dcSRalf Baechle #endif
25384740dcSRalf Baechle
265b6b0847SCorey Minyard #define STR_PTR_LA __stringify(PTR_LA)
275b6b0847SCorey Minyard #define STR_LONG_S __stringify(LONG_S)
285b6b0847SCorey Minyard #define STR_LONG_L __stringify(LONG_L)
295b6b0847SCorey Minyard #define STR_LONGSIZE __stringify(LONGSIZE)
305b6b0847SCorey Minyard
315b6b0847SCorey Minyard #define STORE_ONE_REG(r) \
325b6b0847SCorey Minyard STR_LONG_S " $" __stringify(r)",("STR_LONGSIZE"*"__stringify(r)")(%1)\n\t"
335b6b0847SCorey Minyard
prepare_frametrace(struct pt_regs * regs)34384740dcSRalf Baechle static __always_inline void prepare_frametrace(struct pt_regs *regs)
35384740dcSRalf Baechle {
36384740dcSRalf Baechle #ifndef CONFIG_KALLSYMS
37384740dcSRalf Baechle /*
38384740dcSRalf Baechle * Remove any garbage that may be in regs (specially func
39384740dcSRalf Baechle * addresses) to avoid show_raw_backtrace() to report them
40384740dcSRalf Baechle */
41384740dcSRalf Baechle memset(regs, 0, sizeof(*regs));
42384740dcSRalf Baechle #endif
43384740dcSRalf Baechle __asm__ __volatile__(
44384740dcSRalf Baechle ".set push\n\t"
45384740dcSRalf Baechle ".set noat\n\t"
465b6b0847SCorey Minyard /* Store $1 so we can use it */
475b6b0847SCorey Minyard STR_LONG_S " $1,"STR_LONGSIZE"(%1)\n\t"
485b6b0847SCorey Minyard /* Store the PC */
495b6b0847SCorey Minyard "1: " STR_PTR_LA " $1, 1b\n\t"
505b6b0847SCorey Minyard STR_LONG_S " $1,%0\n\t"
515b6b0847SCorey Minyard STORE_ONE_REG(2)
525b6b0847SCorey Minyard STORE_ONE_REG(3)
535b6b0847SCorey Minyard STORE_ONE_REG(4)
545b6b0847SCorey Minyard STORE_ONE_REG(5)
555b6b0847SCorey Minyard STORE_ONE_REG(6)
565b6b0847SCorey Minyard STORE_ONE_REG(7)
575b6b0847SCorey Minyard STORE_ONE_REG(8)
585b6b0847SCorey Minyard STORE_ONE_REG(9)
595b6b0847SCorey Minyard STORE_ONE_REG(10)
605b6b0847SCorey Minyard STORE_ONE_REG(11)
615b6b0847SCorey Minyard STORE_ONE_REG(12)
625b6b0847SCorey Minyard STORE_ONE_REG(13)
635b6b0847SCorey Minyard STORE_ONE_REG(14)
645b6b0847SCorey Minyard STORE_ONE_REG(15)
655b6b0847SCorey Minyard STORE_ONE_REG(16)
665b6b0847SCorey Minyard STORE_ONE_REG(17)
675b6b0847SCorey Minyard STORE_ONE_REG(18)
685b6b0847SCorey Minyard STORE_ONE_REG(19)
695b6b0847SCorey Minyard STORE_ONE_REG(20)
705b6b0847SCorey Minyard STORE_ONE_REG(21)
715b6b0847SCorey Minyard STORE_ONE_REG(22)
725b6b0847SCorey Minyard STORE_ONE_REG(23)
735b6b0847SCorey Minyard STORE_ONE_REG(24)
745b6b0847SCorey Minyard STORE_ONE_REG(25)
755b6b0847SCorey Minyard STORE_ONE_REG(26)
765b6b0847SCorey Minyard STORE_ONE_REG(27)
775b6b0847SCorey Minyard STORE_ONE_REG(28)
785b6b0847SCorey Minyard STORE_ONE_REG(29)
795b6b0847SCorey Minyard STORE_ONE_REG(30)
805b6b0847SCorey Minyard STORE_ONE_REG(31)
815b6b0847SCorey Minyard /* Restore $1 */
825b6b0847SCorey Minyard STR_LONG_L " $1,"STR_LONGSIZE"(%1)\n\t"
83384740dcSRalf Baechle ".set pop\n\t"
845b6b0847SCorey Minyard : "=m" (regs->cp0_epc)
855b6b0847SCorey Minyard : "r" (regs->regs)
865b6b0847SCorey Minyard : "memory");
87384740dcSRalf Baechle }
88384740dcSRalf Baechle
89384740dcSRalf Baechle #endif /* _ASM_STACKTRACE_H */
90