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