|
| 1 | +# The following are ARM CoreSight blocks but the Silicon Vendors are free to chose |
| 2 | +# alternate base addresses. Check with your vendor documentation |
| 3 | +set language c |
| 4 | +set $ITM_BASE = 0xE0000000 |
| 5 | +set $DWT_BASE = 0xE0001000 |
| 6 | +set $SCS_BASE = 0xE000E000 |
| 7 | +set $SCB_BASE = $SCS_BASE + 0xD00 |
| 8 | +set $DCB_BASE = $SCB_BASE + 0xF0 |
| 9 | +set $TPI_BASE = 0xE0040000 |
| 10 | +set language auto |
| 11 | + |
1 | 12 | # |
2 | 13 | # Help needed: There are many useful functions here but most of them use hardcoded addresses |
3 | 14 | # that may not be the same for all devices. Wish we can port all these functions to something |
4 | 15 | # more usable (modifiable). In the meantime we are going to use the function defined in gdb-swo.Initializes |
5 | 16 | # |
6 | 17 | define EnableITMAccess |
7 | 18 | set language c |
8 | | - set *0xE000EDFC |= 0x1000000 |
9 | | - set *0xE0000FB0 = 0xC5ACCE55 |
| 19 | + set *($DCB_BASE + 0xC) |= 0x1000000 |
| 20 | + set *($ITM_BASE + 0xFB0) = 0xC5ACCE55 |
10 | 21 | set language auto |
11 | 22 | end |
12 | 23 |
|
13 | 24 | define BaseSWOSetup |
14 | 25 | set language c |
15 | | - set *0xE0040304 = 0x100 |
16 | | - set *0xE00400F0 = 2 |
17 | | - set *0xE0040010 = $arg0 |
18 | | - set *0xE0001000 &= ~(0x8000) |
19 | | - set *0xE0001000 |= 0xBFF |
| 26 | + |
| 27 | + # NRZ is the default format |
| 28 | + set $format = 2 |
| 29 | + if $argc > 1 |
| 30 | + # format specified explicitly |
| 31 | + set $format = $arg1 |
| 32 | + end |
| 33 | + |
| 34 | + set *($TPI_BASE + 0x304) = 0x100 |
| 35 | + set *($TPI_BASE + 0x0F0) = $format |
| 36 | + set *($TPI_BASE + 0x010) = $arg0 |
| 37 | + set *($DWT_BASE) &= ~(0x8000) |
| 38 | + set *($DWT_BASE) |= 0xBFF |
20 | 39 | set language auto |
21 | 40 | end |
22 | 41 |
|
23 | 42 | define SetITMTimestampFrequency |
24 | 43 | set language c |
25 | | - set *0xE0000E80 &= ~(0x3 << 10) |
26 | | - set *0xE0000E80 |= ($arg0 << 10) |
| 44 | + set *($ITM_BASE + 0xE80) &= ~(0x3 << 10) |
| 45 | + set *($ITM_BASE + 0xE80) |= ($arg0 << 10) |
27 | 46 | set language auto |
28 | 47 | end |
29 | 48 |
|
30 | 49 | define SetITMTimestampPrescale |
31 | 50 | set language c |
32 | | - set *0xE0000E80 &= ~(0x3 << 8) |
33 | | - set *0xE0000E80 |= ($arg0 << 8) |
| 51 | + set *($ITM_BASE + 0xE80) &= ~(0x3 << 8) |
| 52 | + set *($ITM_BASE + 0xE80) |= ($arg0 << 8) |
34 | 53 | set language auto |
35 | 54 | end |
36 | 55 |
|
37 | 56 | define EnableITMPorts |
38 | 57 | set language c |
39 | | - set *0xE0000E00 |= $arg0 |
| 58 | + set *($ITM_BASE + 0xE00) |= $arg0 |
40 | 59 | set language auto |
41 | 60 | end |
42 | 61 |
|
43 | 62 | define DisableITMPorts |
44 | 63 | set language c |
45 | | - set *0xE0000E00 &= ~($arg0) |
| 64 | + set *($ITM_BASE + 0xE00) &= ~($arg0) |
46 | 65 | set language auto |
47 | 66 | end |
48 | 67 |
|
49 | 68 | define SetITMId |
50 | 69 | set language c |
51 | | - set *0xE0000E80 &= ~(0x7F << 16) |
52 | | - set *0xE0000E80 |= ($arg0 << 16) |
| 70 | + set *($ITM_BASE + 0xE80) &= ~(0x7F << 16) |
| 71 | + set *($ITM_BASE + 0xE80) |= ($arg0 << 16) |
53 | 72 | set language auto |
54 | 73 | end |
55 | 74 |
|
56 | 75 | define ITMGlobalEnable |
57 | 76 | set language c |
58 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 77 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
59 | 78 | while ($busy) |
60 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 79 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
61 | 80 | end |
62 | 81 |
|
63 | | - set *0xE0000E80 |= 0x1 |
| 82 | + set *($ITM_BASE + 0xE80) |= 0x1 |
64 | 83 |
|
65 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 84 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
66 | 85 | while ($busy) |
67 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 86 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
68 | 87 | end |
69 | 88 | set language auto |
70 | 89 | end |
71 | 90 |
|
72 | 91 | define ITMGlobalDisable |
73 | 92 | set language c |
74 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 93 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
75 | 94 | while ($busy) |
76 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 95 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
77 | 96 | end |
78 | 97 |
|
79 | | - set *0xE0000E80 &= ~(0x1) |
| 98 | + set *($ITM_BASE + 0xE80) &= ~(0x1) |
80 | 99 |
|
81 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 100 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
82 | 101 | while ($busy) |
83 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 102 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
84 | 103 | end |
85 | 104 | set language auto |
86 | 105 | end |
87 | 106 |
|
88 | 107 | define ITMTimestampEnable |
89 | 108 | set language c |
90 | | - set *0xE0000E80 |= 0x302 |
| 109 | + set *($ITM_BASE + 0xE80) |= 0x302 |
91 | 110 | set language auto |
92 | 111 | end |
93 | 112 |
|
94 | 113 | define ITMTimestampDisable |
95 | 114 | set language c |
96 | | - set *0xE0000E80 &= ~(0x2) |
| 115 | + set *($ITM_BASE + 0xE80) &= ~(0x2) |
97 | 116 | set language auto |
98 | 117 | end |
99 | 118 |
|
100 | 119 | define ITMSyncEnable |
101 | 120 | set language c |
102 | | - set *0xE0000E80 |= 0x4 |
| 121 | + set *($ITM_BASE + 0xE80) |= 0x4 |
103 | 122 | set language auto |
104 | 123 | end |
105 | 124 |
|
106 | 125 | define ITMSyncDisable |
107 | 126 | set language c |
108 | | - set *0xE0000E80 &= ~(0x4) |
| 127 | + set *($ITM_BASE + 0xE80) &= ~(0x4) |
109 | 128 | set language auto |
110 | 129 | end |
111 | 130 |
|
112 | 131 | define ITMDWTTransferEnable |
113 | 132 | set language c |
114 | | - set *0xE0000E80 |= 0x8 |
| 133 | + set *($ITM_BASE + 0xE80) |= 0x8 |
115 | 134 | set language auto |
116 | 135 | end |
117 | 136 |
|
118 | 137 | define ITMDWTTransferDisable |
119 | 138 | set language c |
120 | | - set *0xE0000E80 &= (~0x8) |
| 139 | + set *($ITM_BASE + 0xE80) &= (~0x8) |
121 | 140 | set language auto |
122 | 141 | end |
123 | 142 |
|
124 | 143 | define EnableDWTSync |
125 | 144 | set language c |
126 | | - set *0xE0001000 |= 0x800 |
| 145 | + set *($DWT_BASE) |= 0x800 |
127 | 146 | set language auto |
128 | 147 | end |
129 | 148 |
|
130 | 149 | define DisableDWTSync |
131 | 150 | set language c |
132 | | - set *0xE0001000 &= ~(0x800) |
| 151 | + set *($DWT_BASE) &= ~(0x800) |
133 | 152 | set language auto |
134 | 153 | end |
135 | 154 |
|
136 | 155 | define EnablePCSample |
137 | 156 | set language c |
138 | | - set *0xE0001004 = 0x0 |
139 | | - set *0xE0001000 |= 0x1201 |
| 157 | + set *($DWT_BASE + 0x004) = 0x0 |
| 158 | + set *($DWT_BASE) |= 0x1201 |
140 | 159 | set language auto |
141 | 160 | end |
142 | 161 |
|
143 | 162 | define DisablePCSample |
144 | 163 | set language c |
145 | | - set *0xE0001000 &= ~(0x1000) |
| 164 | + set *($DWT_BASE) &= ~(0x1000) |
146 | 165 | set language auto |
147 | 166 | end |
148 | 167 |
|
149 | 168 | define EnableCycleCountEvent |
150 | 169 | set language c |
151 | | - set *0xE0001000 |= 0x400000 |
| 170 | + set *($DWT_BASE) |= 0x400000 |
152 | 171 | set language auto |
153 | 172 | end |
154 | 173 |
|
155 | 174 | define DisableCycleCountEvent |
156 | 175 | set language c |
157 | | - set *0xE0001000 &= ~(0x400000) |
| 176 | + set *($DWT_BASE) &= ~(0x400000) |
158 | 177 | set language auto |
159 | 178 | end |
160 | 179 |
|
161 | 180 | define EnableFoldedEvent |
162 | 181 | set language c |
163 | | - set *0xE0001000 |= 0x200000 |
| 182 | + set *($DWT_BASE) |= 0x200000 |
164 | 183 | set language auto |
165 | 184 | end |
166 | 185 |
|
167 | 186 | define DisableFoldedEvent |
168 | 187 | set language c |
169 | | - set *0xE0001000 &= ~(0x200000) |
| 188 | + set *($DWT_BASE) &= ~(0x200000) |
170 | 189 | set language auto |
171 | 190 | end |
172 | 191 |
|
173 | 192 | define EnableLSUCountEvent |
174 | 193 | set language c |
175 | | - set *0xE0001000 |= 0x100000 |
| 194 | + set *($DWT_BASE) |= 0x100000 |
176 | 195 | set language auto |
177 | 196 | end |
178 | 197 |
|
179 | 198 | define DisableLSUCountEvent |
180 | 199 | set language c |
181 | | - set *0xE0001000 &= ~(0x100000) |
| 200 | + set *($DWT_BASE) &= ~(0x100000) |
182 | 201 | set language auto |
183 | 202 | end |
184 | 203 |
|
185 | 204 | define EnableSleepCountEvent |
186 | 205 | set language c |
187 | | - set *0xE0001000 |= 0x80000 |
| 206 | + set *($DWT_BASE) |= 0x80000 |
188 | 207 | set language auto |
189 | 208 | end |
190 | 209 |
|
191 | 210 | define DisableSleepCountEvent |
192 | 211 | set language c |
193 | | - set *0xE0001000 &= ~(0x80000) |
| 212 | + set *($DWT_BASE) &= ~(0x80000) |
194 | 213 | set language auto |
195 | 214 | end |
196 | 215 |
|
197 | 216 | define EnableInterruptOverheadEvent |
198 | 217 | set language c |
199 | | - set *0xE0001000 |= 0x40000 |
| 218 | + set *($DWT_BASE) |= 0x40000 |
200 | 219 | set language auto |
201 | 220 | end |
202 | 221 |
|
203 | 222 | define DisableInterruptOverheadEvent |
204 | 223 | set language c |
205 | | - set *0xE0001000 &= ~(0x40000) |
| 224 | + set *($DWT_BASE) &= ~(0x40000) |
206 | 225 | set language auto |
207 | 226 | end |
208 | 227 |
|
209 | 228 | define EnableCPICountEvent |
210 | 229 | set language c |
211 | | - set *0xE0001000 |= 0x20000 |
| 230 | + set *($DWT_BASE) |= 0x20000 |
212 | 231 | set language auto |
213 | 232 | end |
214 | 233 |
|
215 | 234 | define DisableCPICountEvent |
216 | 235 | set language c |
217 | | - set *0xE0001000 &= ~(0x20000) |
| 236 | + set *($DWT_BASE) &= ~(0x20000) |
218 | 237 | set language auto |
219 | 238 | end |
220 | 239 |
|
221 | 240 | define SoftwareReset |
222 | 241 | set language c |
| 242 | + |
| 243 | + set $halt = 0 |
| 244 | + |
| 245 | + if $argc |
| 246 | + set $halt = $arg0 |
| 247 | + end |
| 248 | + |
| 249 | + if $halt |
| 250 | + set $demcr = *($DCB_BASE + 0xC) |
| 251 | + set *($DCB_BASE + 0xC) |= 1 |
| 252 | + end |
| 253 | + |
223 | 254 | set *0xE000ED0C = 0x05FA0004 |
224 | 255 | set $busy = (*0xE000ED0C & 0x4) |
225 | 256 | while ($busy) |
226 | 257 | set $busy = (*0xE000ED0C & 0x4) |
227 | 258 | end |
| 259 | + |
| 260 | + if $halt |
| 261 | + # restore DEMCR value |
| 262 | + set *($DCB_BASE + 0xC) = $demcr |
| 263 | + end |
| 264 | + |
228 | 265 | set language auto |
229 | 266 | end |
0 commit comments