]> begriffs open source - meson-cross/blob - armv7m/gdb.conf.in
Make debugging command work
[meson-cross] / armv7m / gdb.conf.in
1 tar ext :3333
2 set remote hardware-breakpoint-limit @CROSS_NUM_BREAKPOINTS@
3 set remote hardware-watchpoint-limit @CROSS_NUM_WATCHPOINTS@
4 monitor arm semihosting enable
5
6 echo Loading ARMv7M GDB macros.\n
7
8 define reset_halt
9         mon reset halt
10         load
11         mon gdb_sync
12         stepi
13         info thr
14 end
15
16 define faultstate
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
29         if $vect < 15
30
31                 if $hfsr != 0
32                         printf "HardFault:"
33                         if $hfsr & (1<<1)
34                                 printf " due to vector table read fault\n"
35                         end
36                         if $hfsr & (1<<30)
37                                 printf " forced due to escalated or disabled configurable fault (see below)\n"
38                         end
39                         if $hfsr & (1<<31)
40                                 printf " due to an unexpected debug event\n"
41                         end
42                 end
43                 if $mmfsr != 0
44                         printf "MemManage:"
45                         if $mmfsr & (1<<5)
46                                 printf " during lazy FP state save"
47                         end
48                         if $mmfsr & (1<<4)
49                                 printf " during exception entry"
50                         end
51                         if $mmfsr & (1<<3)
52                                 printf " during exception return"
53                         end
54                         if $mmfsr & (1<<1)
55                                 printf " during data access"
56                         end
57                         if $mmfsr & (1<<0)
58                                 printf " during instruction prefetch"
59                         end
60                         if $mmfsr & (1<<7)
61                                 printf " accessing 0x%08x", $mmfar
62                         end
63                         printf "\n"
64                 end
65                 if $bfsr != 0
66                         printf "BusFault:"
67                         if $bfsr & (1<<2)
68                                 printf " (imprecise)"
69                         end
70                         if $bfsr & (1<<1)
71                                 printf " (precise)"
72                         end
73                         if $bfsr & (1<<5)
74                                 printf " during lazy FP state save"
75                         end
76                         if $bfsr & (1<<4)
77                                 printf " during exception entry"
78                         end
79                         if $bfsr & (1<<3)
80                                 printf " during exception return"
81                         end
82                         if $bfsr & (1<<0)
83                                 printf " during instruction prefetch"
84                         end
85                         if $bfsr & (1<<7)
86                                 printf " accessing 0x%08x", $bfar
87                         end
88                         printf "\n"
89                 end
90                 if $ufsr != 0
91                         printf "UsageFault"
92                         if $ufsr & (1<<9)
93                                 printf " due to divide-by-zero"
94                         end
95                         if $ufsr & (1<<8)
96                                 printf " due to unaligned memory access"
97                         end
98                         if $ufsr & (1<<3)
99                                 printf " due to access to disabled/absent coprocessor"
100                         end
101                         if $ufsr & (1<<2)
102                                 printf " due to a bad EXC_RETURN value"
103                         end
104                         if $ufsr & (1<<1)
105                                 printf " due to bad T or IT bits in EPSR"
106                         end
107                         if $ufsr & (1<<0)
108                                 printf " due to executing an undefined instruction"
109                         end
110                         printf "\n"
111                 end
112         else
113                 if $vect >= 15
114                         printf "Handling vector %u\n", $vect
115                 end
116         end
117
118         echo \nSelect relevant thread, and run "prefault" to restore state prior to fault.\n\n
119
120         info thr
121 end
122
123 define prefault
124         if (($lr & 0xffffff00) == 0xffffff00) && (($lr & 0x1) == 0x1)
125                 # save register values so they can be restored
126                 set $sp_post = $sp
127                 set $lr_post = $lr
128                 set $pc_post = $pc
129                 set $r0_post = $r0
130                 set $r1_post = $r1
131                 set $r2_post = $r2
132                 set $r3_post = $r3
133                 set $r12_post = $r12
134
135                 if $lr & 0x4
136                         echo Stack was in PSP:\n
137                         set $stack = (uint32_t*)$psp
138                 else
139                         echo Stack was in MSP:\n
140                         set $stack = (uint32_t*)$msp
141                 end
142
143         # retrieve prior register states from the eight
144                 # 32-bit words the MCU pushed on the stack
145                 set $r0_pre = $stack[0]
146                 set $r1_pre = $stack[1]
147                 set $r2_pre = $stack[2]
148                 set $r3_pre = $stack[3]
149                 set $r12_pre = $stack[4]
150                 set $lr_pre = $stack[5]
151                 set $pc_pre = $stack[6]
152                 set $psr_pre = $stack[7]
153
154                 set $stack_offset_cpu = 4*8
155
156                 # exception stack alignment. this is constant across CPUs
157                 if (unsigned int)$psr_pre & 0x200
158                         set $stack_offset_exception_align = 4
159                 else
160                         set $stack_offset_exception_align = 0
161                 end
162
163                 # reset SP to pre-fault stack frame
164                 set $sp = $stack + $stack_offset_cpu + $stack_offset_exception_align
165
166                 # reset other core regs to pre-fault values
167                 set $r0 = $r0_pre
168                 set $r1 = $r1_pre
169                 set $r2 = $r2_pre
170                 set $r3 = $r3_pre
171                 set $r12 = $r12_pre
172                 set $lr = $lr_pre
173                 set $pc = $pc_pre
174                 set $psr = $psr_pre
175
176                 echo \nRestored registers to pre-fault status.\n
177                 echo The "postfault" command returns to the fault handler.\n
178
179                 bt
180         else
181                 echo \nDid not detect fault status. Doing nothing.\n
182         end
183 end
184
185 define postfault
186         if $pc_post
187                 echo \nRestoring core registers.\n
188                 set $sp = $sp_post
189                 set $lr = $lr_post
190                 set $pc = $pc_post
191                 set $r0 = $r0_post
192                 set $r1 = $r1_post
193                 set $r2 = $r2_post
194                 set $r3 = $r3_post
195                 set $r12 = $r12_post
196
197                 # clear sentinel to prevent repated Calls
198                 set $pc_post = 0
199         else
200                 echo \nNo post-fault state to restore.\n
201         end
202 end