stacktrace.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #ifndef _ASM_STACKTRACE_H
  2. #define _ASM_STACKTRACE_H
  3. #include <asm/ptrace.h>
  4. #include <asm/asm.h>
  5. #include <linux/stringify.h>
  6. #ifdef CONFIG_KALLSYMS
  7. extern int raw_show_trace;
  8. extern unsigned long unwind_stack(struct task_struct *task, unsigned long *sp,
  9. unsigned long pc, unsigned long *ra);
  10. extern unsigned long unwind_stack_by_address(unsigned long stack_page,
  11. unsigned long *sp,
  12. unsigned long pc,
  13. unsigned long *ra);
  14. #else
  15. #define raw_show_trace 1
  16. static inline unsigned long unwind_stack(struct task_struct *task,
  17. unsigned long *sp, unsigned long pc, unsigned long *ra)
  18. {
  19. return 0;
  20. }
  21. #endif
  22. #define STR_PTR_LA __stringify(PTR_LA)
  23. #define STR_LONG_S __stringify(LONG_S)
  24. #define STR_LONG_L __stringify(LONG_L)
  25. #define STR_LONGSIZE __stringify(LONGSIZE)
  26. #define STORE_ONE_REG(r) \
  27. STR_LONG_S " $" __stringify(r)",("STR_LONGSIZE"*"__stringify(r)")(%1)\n\t"
  28. static __always_inline void prepare_frametrace(struct pt_regs *regs)
  29. {
  30. #ifndef CONFIG_KALLSYMS
  31. /*
  32. * Remove any garbage that may be in regs (specially func
  33. * addresses) to avoid show_raw_backtrace() to report them
  34. */
  35. memset(regs, 0, sizeof(*regs));
  36. #endif
  37. __asm__ __volatile__(
  38. ".set push\n\t"
  39. ".set noat\n\t"
  40. /* Store $1 so we can use it */
  41. STR_LONG_S " $1,"STR_LONGSIZE"(%1)\n\t"
  42. /* Store the PC */
  43. "1: " STR_PTR_LA " $1, 1b\n\t"
  44. STR_LONG_S " $1,%0\n\t"
  45. STORE_ONE_REG(2)
  46. STORE_ONE_REG(3)
  47. STORE_ONE_REG(4)
  48. STORE_ONE_REG(5)
  49. STORE_ONE_REG(6)
  50. STORE_ONE_REG(7)
  51. STORE_ONE_REG(8)
  52. STORE_ONE_REG(9)
  53. STORE_ONE_REG(10)
  54. STORE_ONE_REG(11)
  55. STORE_ONE_REG(12)
  56. STORE_ONE_REG(13)
  57. STORE_ONE_REG(14)
  58. STORE_ONE_REG(15)
  59. STORE_ONE_REG(16)
  60. STORE_ONE_REG(17)
  61. STORE_ONE_REG(18)
  62. STORE_ONE_REG(19)
  63. STORE_ONE_REG(20)
  64. STORE_ONE_REG(21)
  65. STORE_ONE_REG(22)
  66. STORE_ONE_REG(23)
  67. STORE_ONE_REG(24)
  68. STORE_ONE_REG(25)
  69. STORE_ONE_REG(26)
  70. STORE_ONE_REG(27)
  71. STORE_ONE_REG(28)
  72. STORE_ONE_REG(29)
  73. STORE_ONE_REG(30)
  74. STORE_ONE_REG(31)
  75. /* Restore $1 */
  76. STR_LONG_L " $1,"STR_LONGSIZE"(%1)\n\t"
  77. ".set pop\n\t"
  78. : "=m" (regs->cp0_epc)
  79. : "r" (regs->regs)
  80. : "memory");
  81. }
  82. #endif /* _ASM_STACKTRACE_H */