|
| 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 | + set *($TPI_BASE + 0x304) = 0x100 |
| 27 | + set *($TPI_BASE + 0x0F0) = $argc > 1 ? $arg1 : 2 |
| 28 | + set *($TPI_BASE + 0x010) = $arg0 |
| 29 | + set *($DWT_BASE) &= ~(0x8000) |
| 30 | + set *($DWT_BASE) |= 0xBFF |
20 | 31 | set language auto |
21 | 32 | end |
22 | 33 |
|
23 | 34 | define SetITMTimestampFrequency |
24 | 35 | set language c |
25 | | - set *0xE0000E80 &= ~(0x3 << 10) |
26 | | - set *0xE0000E80 |= ($arg0 << 10) |
| 36 | + set *($ITM_BASE + 0xE80) &= ~(0x3 << 10) |
| 37 | + set *($ITM_BASE + 0xE80) |= ($arg0 << 10) |
27 | 38 | set language auto |
28 | 39 | end |
29 | 40 |
|
30 | 41 | define SetITMTimestampPrescale |
31 | 42 | set language c |
32 | | - set *0xE0000E80 &= ~(0x3 << 8) |
33 | | - set *0xE0000E80 |= ($arg0 << 8) |
| 43 | + set *($ITM_BASE + 0xE80) &= ~(0x3 << 8) |
| 44 | + set *($ITM_BASE + 0xE80) |= ($arg0 << 8) |
34 | 45 | set language auto |
35 | 46 | end |
36 | 47 |
|
37 | 48 | define EnableITMPorts |
38 | 49 | set language c |
39 | | - set *0xE0000E00 |= $arg0 |
| 50 | + set *($ITM_BASE + 0xE00) |= $arg0 |
40 | 51 | set language auto |
41 | 52 | end |
42 | 53 |
|
43 | 54 | define DisableITMPorts |
44 | 55 | set language c |
45 | | - set *0xE0000E00 &= ~($arg0) |
| 56 | + set *($ITM_BASE + 0xE00) &= ~($arg0) |
46 | 57 | set language auto |
47 | 58 | end |
48 | 59 |
|
49 | 60 | define SetITMId |
50 | 61 | set language c |
51 | | - set *0xE0000E80 &= ~(0x7F << 16) |
52 | | - set *0xE0000E80 |= ($arg0 << 16) |
| 62 | + set *($ITM_BASE + 0xE80) &= ~(0x7F << 16) |
| 63 | + set *($ITM_BASE + 0xE80) |= ($arg0 << 16) |
53 | 64 | set language auto |
54 | 65 | end |
55 | 66 |
|
56 | 67 | define ITMGlobalEnable |
57 | 68 | set language c |
58 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 69 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
59 | 70 | while ($busy) |
60 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 71 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
61 | 72 | end |
62 | 73 |
|
63 | | - set *0xE0000E80 |= 0x1 |
| 74 | + set *($ITM_BASE + 0xE80) |= 0x1 |
64 | 75 |
|
65 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 76 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
66 | 77 | while ($busy) |
67 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 78 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
68 | 79 | end |
69 | 80 | set language auto |
70 | 81 | end |
71 | 82 |
|
72 | 83 | define ITMGlobalDisable |
73 | 84 | set language c |
74 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 85 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
75 | 86 | while ($busy) |
76 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 87 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
77 | 88 | end |
78 | 89 |
|
79 | | - set *0xE0000E80 &= ~(0x1) |
| 90 | + set *($ITM_BASE + 0xE80) &= ~(0x1) |
80 | 91 |
|
81 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 92 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
82 | 93 | while ($busy) |
83 | | - set $busy = ((*0xE0000E80 & 0x800000)) |
| 94 | + set $busy = ((*($ITM_BASE + 0xE80) & 0x800000)) |
84 | 95 | end |
85 | 96 | set language auto |
86 | 97 | end |
87 | 98 |
|
88 | 99 | define ITMTimestampEnable |
89 | 100 | set language c |
90 | | - set *0xE0000E80 |= 0x302 |
| 101 | + set *($ITM_BASE + 0xE80) |= 0x302 |
91 | 102 | set language auto |
92 | 103 | end |
93 | 104 |
|
94 | 105 | define ITMTimestampDisable |
95 | 106 | set language c |
96 | | - set *0xE0000E80 &= ~(0x2) |
| 107 | + set *($ITM_BASE + 0xE80) &= ~(0x2) |
97 | 108 | set language auto |
98 | 109 | end |
99 | 110 |
|
100 | 111 | define ITMSyncEnable |
101 | 112 | set language c |
102 | | - set *0xE0000E80 |= 0x4 |
| 113 | + set *($ITM_BASE + 0xE80) |= 0x4 |
103 | 114 | set language auto |
104 | 115 | end |
105 | 116 |
|
106 | 117 | define ITMSyncDisable |
107 | 118 | set language c |
108 | | - set *0xE0000E80 &= ~(0x4) |
| 119 | + set *($ITM_BASE + 0xE80) &= ~(0x4) |
109 | 120 | set language auto |
110 | 121 | end |
111 | 122 |
|
112 | 123 | define ITMDWTTransferEnable |
113 | 124 | set language c |
114 | | - set *0xE0000E80 |= 0x8 |
| 125 | + set *($ITM_BASE + 0xE80) |= 0x8 |
115 | 126 | set language auto |
116 | 127 | end |
117 | 128 |
|
118 | 129 | define ITMDWTTransferDisable |
119 | 130 | set language c |
120 | | - set *0xE0000E80 &= (~0x8) |
| 131 | + set *($ITM_BASE + 0xE80) &= (~0x8) |
121 | 132 | set language auto |
122 | 133 | end |
123 | 134 |
|
124 | 135 | define EnableDWTSync |
125 | 136 | set language c |
126 | | - set *0xE0001000 |= 0x800 |
| 137 | + set *($DWT_BASE) |= 0x800 |
127 | 138 | set language auto |
128 | 139 | end |
129 | 140 |
|
130 | 141 | define DisableDWTSync |
131 | 142 | set language c |
132 | | - set *0xE0001000 &= ~(0x800) |
| 143 | + set *($DWT_BASE) &= ~(0x800) |
133 | 144 | set language auto |
134 | 145 | end |
135 | 146 |
|
136 | 147 | define EnablePCSample |
137 | 148 | set language c |
138 | | - set *0xE0001004 = 0x0 |
139 | | - set *0xE0001000 |= 0x1201 |
| 149 | + set *($DWT_BASE + 0x004) = 0x0 |
| 150 | + set *($DWT_BASE) |= 0x1201 |
140 | 151 | set language auto |
141 | 152 | end |
142 | 153 |
|
143 | 154 | define DisablePCSample |
144 | 155 | set language c |
145 | | - set *0xE0001000 &= ~(0x1000) |
| 156 | + set *($DWT_BASE) &= ~(0x1000) |
146 | 157 | set language auto |
147 | 158 | end |
148 | 159 |
|
149 | 160 | define EnableCycleCountEvent |
150 | 161 | set language c |
151 | | - set *0xE0001000 |= 0x400000 |
| 162 | + set *($DWT_BASE) |= 0x400000 |
152 | 163 | set language auto |
153 | 164 | end |
154 | 165 |
|
155 | 166 | define DisableCycleCountEvent |
156 | 167 | set language c |
157 | | - set *0xE0001000 &= ~(0x400000) |
| 168 | + set *($DWT_BASE) &= ~(0x400000) |
158 | 169 | set language auto |
159 | 170 | end |
160 | 171 |
|
161 | 172 | define EnableFoldedEvent |
162 | 173 | set language c |
163 | | - set *0xE0001000 |= 0x200000 |
| 174 | + set *($DWT_BASE) |= 0x200000 |
164 | 175 | set language auto |
165 | 176 | end |
166 | 177 |
|
167 | 178 | define DisableFoldedEvent |
168 | 179 | set language c |
169 | | - set *0xE0001000 &= ~(0x200000) |
| 180 | + set *($DWT_BASE) &= ~(0x200000) |
170 | 181 | set language auto |
171 | 182 | end |
172 | 183 |
|
173 | 184 | define EnableLSUCountEvent |
174 | 185 | set language c |
175 | | - set *0xE0001000 |= 0x100000 |
| 186 | + set *($DWT_BASE) |= 0x100000 |
176 | 187 | set language auto |
177 | 188 | end |
178 | 189 |
|
179 | 190 | define DisableLSUCountEvent |
180 | 191 | set language c |
181 | | - set *0xE0001000 &= ~(0x100000) |
| 192 | + set *($DWT_BASE) &= ~(0x100000) |
182 | 193 | set language auto |
183 | 194 | end |
184 | 195 |
|
185 | 196 | define EnableSleepCountEvent |
186 | 197 | set language c |
187 | | - set *0xE0001000 |= 0x80000 |
| 198 | + set *($DWT_BASE) |= 0x80000 |
188 | 199 | set language auto |
189 | 200 | end |
190 | 201 |
|
191 | 202 | define DisableSleepCountEvent |
192 | 203 | set language c |
193 | | - set *0xE0001000 &= ~(0x80000) |
| 204 | + set *($DWT_BASE) &= ~(0x80000) |
194 | 205 | set language auto |
195 | 206 | end |
196 | 207 |
|
197 | 208 | define EnableInterruptOverheadEvent |
198 | 209 | set language c |
199 | | - set *0xE0001000 |= 0x40000 |
| 210 | + set *($DWT_BASE) |= 0x40000 |
200 | 211 | set language auto |
201 | 212 | end |
202 | 213 |
|
203 | 214 | define DisableInterruptOverheadEvent |
204 | 215 | set language c |
205 | | - set *0xE0001000 &= ~(0x40000) |
| 216 | + set *($DWT_BASE) &= ~(0x40000) |
206 | 217 | set language auto |
207 | 218 | end |
208 | 219 |
|
209 | 220 | define EnableCPICountEvent |
210 | 221 | set language c |
211 | | - set *0xE0001000 |= 0x20000 |
| 222 | + set *($DWT_BASE) |= 0x20000 |
212 | 223 | set language auto |
213 | 224 | end |
214 | 225 |
|
215 | 226 | define DisableCPICountEvent |
216 | 227 | set language c |
217 | | - set *0xE0001000 &= ~(0x20000) |
| 228 | + set *($DWT_BASE) &= ~(0x20000) |
218 | 229 | set language auto |
219 | 230 | end |
220 | 231 |
|
221 | 232 | define SoftwareReset |
222 | 233 | set language c |
| 234 | + |
| 235 | + set $halt = 0 |
| 236 | + |
| 237 | + if $argc |
| 238 | + set $halt = $arg0 |
| 239 | + end |
| 240 | + |
| 241 | + if $halt |
| 242 | + set $demcr = *($DCB_BASE + 0xC) |
| 243 | + set *($DCB_BASE + 0xC) |= 1 |
| 244 | + end |
| 245 | + |
223 | 246 | set *0xE000ED0C = 0x05FA0004 |
224 | 247 | set $busy = (*0xE000ED0C & 0x4) |
225 | 248 | while ($busy) |
226 | 249 | set $busy = (*0xE000ED0C & 0x4) |
227 | 250 | end |
| 251 | + |
| 252 | + if $halt |
| 253 | + # restore DEMCR value |
| 254 | + set *($DCB_BASE + 0xC) = $demcr |
| 255 | + end |
| 256 | + |
228 | 257 | set language auto |
229 | 258 | end |
0 commit comments