gdb_macros 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #
  2. # Assorted ARMv7M macros for debugging with GDB
  3. #
  4. echo Loading ARMv7M GDB macros. Use 'help armv7m' for more information.\n
  5. define armv7m
  6. echo Use 'help armv7m' for more information.\n
  7. end
  8. document armv7m
  9. . Various macros for working with the ARMv7M family of processors.
  10. .
  11. . vecstate
  12. . Print information about the current exception handling state.
  13. .
  14. . Use 'help <macro>' for more specific help.
  15. end
  16. define vecstate
  17. set $icsr = *(unsigned *)0xe000ed04
  18. set $vect = $icsr & 0x1ff
  19. set $pend = ($icsr & 0x1ff000) >> 12
  20. set $shcsr = *(unsigned *)0xe000ed24
  21. set $cfsr = *(unsigned *)0xe000ed28
  22. set $mmfsr = $cfsr & 0xff
  23. set $bfsr = ($cfsr >> 8) & 0xff
  24. set $ufsr = ($cfsr >> 16) & 0xffff
  25. set $hfsr = *(unsigned *)0xe000ed2c
  26. set $bfar = *(unsigned *)0xe000ed38
  27. set $mmfar = *(unsigned *)0xe000ed34
  28. if $vect < 15
  29. if $hfsr != 0
  30. printf "HardFault:"
  31. if $hfsr & (1<<1)
  32. printf " due to vector table read fault\n"
  33. end
  34. if $hfsr & (1<<30)
  35. printf " forced due to escalated or disabled configurable fault (see below)\n"
  36. end
  37. if $hfsr & (1<<31)
  38. printf " due to an unexpected debug event\n"
  39. end
  40. end
  41. if $mmfsr != 0
  42. printf "MemManage:"
  43. if $mmfsr & (1<<5)
  44. printf " during lazy FP state save"
  45. end
  46. if $mmfsr & (1<<4)
  47. printf " during exception entry"
  48. end
  49. if $mmfsr & (1<<3)
  50. printf " during exception return"
  51. end
  52. if $mmfsr & (1<<0)
  53. printf " during data access"
  54. end
  55. if $mmfsr & (1<<0)
  56. printf " during instruction prefetch"
  57. end
  58. if $mmfsr & (1<<7)
  59. printf " accessing 0x%08x", $mmfar
  60. end
  61. printf "\n"
  62. end
  63. if $bfsr != 0
  64. printf "BusFault:"
  65. if $bfsr & (1<<2)
  66. printf " (imprecise)"
  67. end
  68. if $bfsr & (1<<1)
  69. printf " (precise)"
  70. end
  71. if $bfsr & (1<<5)
  72. printf " during lazy FP state save"
  73. end
  74. if $bfsr & (1<<4)
  75. printf " during exception entry"
  76. end
  77. if $bfsr & (1<<3)
  78. printf " during exception return"
  79. end
  80. if $bfsr & (1<<0)
  81. printf " during instruction prefetch"
  82. end
  83. if $bfsr & (1<<7)
  84. printf " accessing 0x%08x", $bfar
  85. end
  86. printf "\n"
  87. end
  88. if $ufsr != 0
  89. printf "UsageFault"
  90. if $ufsr & (1<<9)
  91. printf " due to divide-by-zero"
  92. end
  93. if $ufsr & (1<<8)
  94. printf " due to unaligned memory access"
  95. end
  96. if $ufsr & (1<<3)
  97. printf " due to access to disabled/absent coprocessor"
  98. end
  99. if $ufsr & (1<<2)
  100. printf " due to a bad EXC_RETURN value"
  101. end
  102. if $ufsr & (1<<1)
  103. printf " due to bad T or IT bits in EPSR"
  104. end
  105. if $ufsr & (1<<0)
  106. printf " due to executing an undefined instruction"
  107. end
  108. printf "\n"
  109. end
  110. else
  111. if $vect >= 15
  112. printf "Handling vector %u\n", $vect
  113. end
  114. end
  115. if ((unsigned)$lr & 0xf0000000) == 0xf0000000
  116. if ($lr & 1)
  117. printf "exception frame is on MSP\n"
  118. #set $frame_ptr = (unsigned *)$msp
  119. set $frame_ptr = (unsigned *)$sp
  120. else
  121. printf "exception frame is on PSP, backtrace may not be possible\n"
  122. #set $frame_ptr = (unsigned *)$psp
  123. set $frame_ptr = (unsigned *)$sp
  124. end
  125. printf " r0: %08x r1: %08x r2: %08x r3: %08x\n", $frame_ptr[0], $frame_ptr[1], $frame_ptr[2], $frame_ptr[3]
  126. printf " r4: %08x r5: %08x r6: %08x r7: %08x\n", $r4, $r5, $r6, $r7
  127. printf " r8: %08x r9: %08x r10: %08x r11: %08x\n", $r8, $r9, $r10, $r11
  128. printf " r12: %08x lr: %08x pc: %08x PSR: %08x\n", $frame_ptr[4], $frame_ptr[5], $frame_ptr[6], $frame_ptr[7]
  129. # Swap to the context of the faulting code and try to print a backtrace
  130. set $saved_sp = $sp
  131. if $lr & 0x10
  132. set $sp = $frame_ptr + (8 * 4)
  133. else
  134. set $sp = $frame_ptr + (26 * 4)
  135. end
  136. set $saved_lr = $lr
  137. set $lr = $frame_ptr[5]
  138. set $saved_pc = $pc
  139. set $pc = $frame_ptr[6]
  140. bt
  141. set $sp = $saved_sp
  142. set $lr = $saved_lr
  143. set $pc = $saved_pc
  144. else
  145. printf "(not currently in exception handler)\n"
  146. end
  147. end
  148. document vecstate
  149. . vecstate
  150. . Print information about the current exception handling state.
  151. end
  152. define hf_backtrace
  153. set $pc = ((uint32_t*)$psp)[6]
  154. set $lr = ((uint32_t*)$psp)[5]
  155. set $r12 = ((uint32_t*)$psp)[4]
  156. set $r3 = ((uint32_t*)$psp)[3]
  157. set $r2 = ((uint32_t*)$psp)[2]
  158. set $r1 = ((uint32_t*)$psp)[1]
  159. set $r0 = ((uint32_t*)$psp)[0]
  160. set $sp = $psp + 4*26
  161. bt
  162. end