nexmon – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 #ifndef DEBUG_H
2 #define DEBUG_H
3  
4 struct trace {
5 unsigned int exception_id;
6 unsigned int PC;
7 unsigned int CPSR;
8 unsigned int SPSR;
9 unsigned int r0;
10 unsigned int r1;
11 unsigned int r2;
12 unsigned int r3;
13 unsigned int r4;
14 unsigned int r5;
15 unsigned int r6;
16 unsigned int r7;
17 unsigned int r8;
18 unsigned int r9;
19 unsigned int r10;
20 unsigned int r11;
21 unsigned int r12;
22 unsigned int sp;
23 unsigned int lr;
24 unsigned int pc;
25 } __attribute__((packed));
26  
27 /* the number of available watch- and breakpoints */
28 #define DBG_NUMBER_OF_WATCHPOINTS 4
29 #define DBG_NUMBER_OF_BREAKPOINTS 4
30  
31 #define SET_DBG_VALUE(name, value) (((value) & name ## _MASK) << name ## _SHIFT)
32 #define GET_DBG_VALUE(name, reg) (((reg) >> name ## _SHIFT) & name ## _MASK)
33 #define GET_DBG_MASK(name) (name ## _MASK << name ## _SHIFT)
34 #define GET_DBG_INV_MASK(name) ~GET_DBG_MASK(name)
35 #define UPDATE_DBG_REG(reg, mask, value) (((reg) & ~(mask)) | (value))
36  
37 /* The address where the memory mapped debug registers are located */
38 #define DBGBASE (0x18007000)
39  
40 /* C11.11.20 DBGDSCR - Debug Status and Control Register */
41 #define DBGDSCR (*(volatile int *) (DBGBASE + 0x88))
42  
43 // MASK masks the bits before shifting left or after shifting right
44 /* DBGDTRRX register full (read only) */
45 #define DBGDSCR_RXfull_SHIFT 30
46 #define DBGDSCR_RXfull_MASK 1
47 #define DBGDSCR_RXfull_EMPTY 0
48 #define DBGDSCR_RXfull_FULL 1
49  
50 /* DBGDTRTX register full (read only) */
51 #define DBGDSCR_TXfull_SHIFT 29
52 #define DBGDSCR_TXfull_MASK 1
53 #define DBGDSCR_TXfull_EMPTY 0
54 #define DBGDSCR_TXfull_FULL 1
55  
56 /* Latched RXfull (read only) */
57 #define DBGDSCR_RXfull_I_SHIFT 27
58 #define DBGDSCR_RXfull_I_MASK 1
59  
60 /* Latched TXfull (read only) */
61 #define DBGDSCR_TXfull_I_SHIFT 26
62 #define DBGDSCR_TXfull_I_MASK 1
63  
64 /* Sticky Pipeline Advance bit (read only) */
65 #define DBGDSCR_PipeAdv_SHIFT 25
66 #define DBGDSCR_PipeAdv_MASK 1
67  
68 /* Latched Instruction Complete (read only) */
69 #define DBGDSCR_InstrCompl_I_SHIFT 24
70 #define DBGDSCR_InstrCompl_I_MASK 1
71 #define DBGDSCR_InstrCompl_I_NOT_COMPLETED 0
72 #define DBGDSCR_InstrCompl_I_COMPLETED 1
73  
74 /* External DCC access mode */
75 #define DBGDSCR_ExtDCCmode_SHIFT 20
76 #define DBGDSCR_ExtDCCmode_MASK 3
77 #define DBGDSCR_ExtDCCmode_NON_BLOCKING_MODE 0x0
78 #define DBGDSCR_ExtDCCmode_STALL_MODE 0x1
79 #define DBGDSCR_ExtDCCmode_FAST_MODE 0x2
80  
81 /* Asynchronous Aborts Discarded */
82 #define DBGDSCR_ADAdiscard_SHIFT 19
83 #define DBGDSCR_ADAdiscard_MASK 1
84  
85 /* Non-secure state status */
86 #define DBGDSCR_NS_SHIFT 18
87 #define DBGDSCR_NS_MASK 1
88  
89 /* Secure PL1 Non_invasive Debug Disabled */
90 #define DBGDSCR_SPNIDdis_SHIFT 17
91 #define DBGDSCR_SPNIDdis_MASK 1
92 #define DBGDSCR_SPNIDdis_PERMITTED 0
93 #define DBGDSCR_SPNIDdis_NOT_PERMITTED 1
94  
95 /* Secure PL1 Invasive Debug Disabled bit */
96 #define DBGDSCR_SPIDdis_SHIFT 16
97 #define DBGDSCR_SPIDdis_MASK 1
98 #define DBGDSCR_SPIDdis_PERMITTED 0
99 #define DBGDSCR_SPIDdis_NOT_PERMITTED 1
100  
101 /* Monitor debug-mode enable */
102 #define DBGDSCR_MDBGen_SHIFT 15
103 #define DBGDSCR_MDBGen_MASK 1
104 #define DBGDSCR_MDBGen_DISABLED 0
105 #define DBGDSCR_MDBGen_ENABLED 1
106  
107 /* Halting debug-mode enable */
108 #define DBGDSCR_HDBGen_SHIFT 14
109 #define DBGDSCR_HDBGen_MASK 1
110 #define DBGDSCR_HDBGen_DISABLED 0
111 #define DBGDSCR_HDBGen_ENABLED 1
112  
113 /* Execute ARM instruction enable */
114 #define DBGDSCR_ITRen_SHIFT 13
115 #define DBGDSCR_ITRen_MASK 1
116 #define DBGDSCR_ITRen_DISABLED 0
117 #define DBGDSCR_ITRen_ENABLED 1
118  
119 /* User mode access to Debug Communications Channel (DCC) disabled */
120 #define DBGDSCR_UDCCdis_SHIFT 12
121 #define DBGDSCR_UDCCdis_MASK 1
122 #define DBGDSCR_UDCCdis_ENABLED 0
123 #define DBGDSCR_UDCCdis_DISABLED 1
124  
125 /* Interrumpts Disable */
126 #define DBGDSCR_INTdis_SHIFT 11
127 #define DBGDSCR_INTdis_MASK 1
128 #define DBGDSCR_INTdis_ENABLED 0
129 #define DBGDSCR_INTdis_DISABLED 1
130  
131 /* Force Debug Acknowledge */
132 #define DBGDSCR_DBGack_SHIFT 10
133 #define DBGDSCR_DBGack_MASK 1
134  
135 /* Fault status */
136 #define DBGDSCR_FS_SHIFT 9
137 #define DBGDSCR_FS_MASK 1
138  
139 /* Sticky Undefined Instruction */
140 #define DBGDSCR_UND_I_SHIFT 8
141 #define DBGDSCR_UND_I_MASK 1
142  
143 /* Sticky Asynchronous Abort */
144 #define DBGDSCR_ADABORT_I_SHIFT 7
145 #define DBGDSCR_ADABORT_I_MASK 1
146  
147 /* Sticky Synchronous Data Abort */
148 #define DBGDSCR_SDABORT_I_SHIFT 6
149 #define DBGDSCR_SDABORT_I_MASK 1
150  
151 /* Method of Debug entry */
152 #define DBGDSCR_MOE_SHIFT 2
153 #define DBGDSCR_MOE_MASK 0xF
154  
155 /* Processor Restarted */
156 #define DBGDSCR_RESTARTED_SHIFT 1
157 #define DBGDSCR_RESTARTED_MASK 1
158  
159 /* Processor Halted */
160 #define DBGDSCR_HALTED_SHIFT 0
161 #define DBGDSCR_HALTED_MASK 1
162 #define DBGDSCR_HALTED_NON_DEBUG_STATE 0
163 #define DBGDSCR_HALTED_DEBUG_STATE 1
164  
165 /* C11.11.3 DBGBVR - Breakpoint Value Registers */
166 #define DBGBVR0 (*(volatile int *) (DBGBASE + 0x100))
167 #define DBGBVR1 (*(volatile int *) (DBGBASE + 0x104))
168 #define DBGBVR2 (*(volatile int *) (DBGBASE + 0x108))
169 #define DBGBVR3 (*(volatile int *) (DBGBASE + 0x10C))
170 #define DBGBVR4 (*(volatile int *) (DBGBASE + 0x110))
171 #define DBGBVR5 (*(volatile int *) (DBGBASE + 0x114))
172 #define DBGBVR6 (*(volatile int *) (DBGBASE + 0x118))
173 #define DBGBVR7 (*(volatile int *) (DBGBASE + 0x11C))
174  
175 /* The last two bits of an instruction address needs to be set to 0 */
176 #define DBGBVR_ADDRMASK (0xFFFFFFFC)
177  
178 /* C11.11.2 DBGBCR - Breakpoint Control Registers */
179 #define DBGBCR0 (*(volatile int *) (DBGBASE + 0x140))
180 #define DBGBCR1 (*(volatile int *) (DBGBASE + 0x144))
181 #define DBGBCR2 (*(volatile int *) (DBGBASE + 0x148))
182 #define DBGBCR3 (*(volatile int *) (DBGBASE + 0x14C))
183 #define DBGBCR4 (*(volatile int *) (DBGBASE + 0x150))
184 #define DBGBCR5 (*(volatile int *) (DBGBASE + 0x154))
185 #define DBGBCR6 (*(volatile int *) (DBGBASE + 0x158))
186 #define DBGBCR7 (*(volatile int *) (DBGBASE + 0x15C))
187  
188 /* Address range mask */
189 #define DBGBCR_MASK_SHIFT 24
190 #define DBGBCR_MASK_MASK 0x1F
191 #define DBGBCR_MASK_NO_MASK 0
192 #define DBGBCR_MASK_00000007 3
193 #define DBGBCR_MASK_0000000F 4
194 #define DBGBCR_MASK_0000001F 5
195 #define DBGBCR_MASK_0000003F 6
196 #define DBGBCR_MASK_0000007F 7
197 #define DBGBCR_MASK_000000FF 8
198 #define DBGBCR_MASK_000001FF 9
199 #define DBGBCR_MASK_000003FF 10
200 #define DBGBCR_MASK_000007FF 11
201 #define DBGBCR_MASK_00000FFF 12
202 #define DBGBCR_MASK_00001FFF 13
203 #define DBGBCR_MASK_00003FFF 14
204 #define DBGBCR_MASK_00007FFF 15
205 #define DBGBCR_MASK_0000FFFF 16
206 #define DBGBCR_MASK_0001FFFF 17
207 #define DBGBCR_MASK_0003FFFF 18
208 #define DBGBCR_MASK_0007FFFF 19
209 #define DBGBCR_MASK_000FFFFF 20
210 #define DBGBCR_MASK_001FFFFF 21
211 #define DBGBCR_MASK_003FFFFF 22
212 #define DBGBCR_MASK_007FFFFF 23
213 #define DBGBCR_MASK_00FFFFFF 24
214 #define DBGBCR_MASK_01FFFFFF 25
215 #define DBGBCR_MASK_03FFFFFF 26
216 #define DBGBCR_MASK_07FFFFFF 27
217 #define DBGBCR_MASK_0FFFFFFF 28
218 #define DBGBCR_MASK_1FFFFFFF 29
219 #define DBGBCR_MASK_3FFFFFFF 30
220 #define DBGBCR_MASK_7FFFFFFF 31
221  
222 /* Breakpoint type */
223 #define DBGBCR_BT_SHIFT 20
224 #define DBGBCR_BT_MASK 0xF
225 #define DBGBCR_BT_UNLINKED_INSTR_ADDR_MATCH 0
226 #define DBGBCR_BT_LINKED_INSTR_ADDR_MATCH 1
227 #define DBGBCR_BT_UNLINKED_CONTEXT_ID_MATCH 2
228 #define DBGBCR_BT_LINKED_CONTEXT_ID_MATCH 3
229 #define DBGBCR_BT_UNLINKED_INSTR_ADDR_MISMATCH 4
230 #define DBGBCR_BT_LINKED_INSTR_ADDR_MISMATCH 5
231  
232 /* Linked breakpoint number */
233 #define DBGBCR_LBN_SHIFT 16
234 #define DBGBCR_LBN_MASK 0xF
235  
236 /* Security state control */
237 #define DBGBCR_SSC_SHIFT 14
238 #define DBGBCR_SSC_MASK 3
239  
240 /* Hyp mode control bit */
241 #define DBGBCR_HMC_SHIFT 13
242 #define DBGBCR_HMC_MASK 1
243  
244 /* Byte address select */
245 #define DBGBCR_BAS_SHIFT 5
246 #define DBGBCR_BAS_MASK 0xF
247  
248 #define GET_BAS_FOR_THUMB_ADDR(addr) (3 << (addr & 2))
249  
250 /* Privileged mode control */
251 #define DBGBCR_PMC_SHIFT 1
252 #define DBGBCR_PMC_MASK 3
253  
254 /* combined options for SSC, HMC and PMC */
255 /* secure and non secure modes */
256 #define DBGBCR_SSC_HMC_PMC__PL0_SUP_SYS (SET_DBG_VALUE(DBGBCR_SSC, 0) | SET_DBG_VALUE(DBGBCR_HMC, 0) | SET_DBG_VALUE(DBGBCR_PMC, 0))
257 #define DBGBCR_SSC_HMC_PMC__PL1 (SET_DBG_VALUE(DBGBCR_SSC, 0) | SET_DBG_VALUE(DBGBCR_HMC, 0) | SET_DBG_VALUE(DBGBCR_PMC, 1))
258 #define DBGBCR_SSC_HMC_PMC__PL0 (SET_DBG_VALUE(DBGBCR_SSC, 0) | SET_DBG_VALUE(DBGBCR_HMC, 0) | SET_DBG_VALUE(DBGBCR_PMC, 2))
259 #define DBGBCR_SSC_HMC_PMC__SEC_ALL__NON_SEC_PL1_PL0 (SET_DBG_VALUE(DBGBCR_SSC, 0) | SET_DBG_VALUE(DBGBCR_HMC, 0) | SET_DBG_VALUE(DBGBCR_PMC, 3))
260 #define DBGBCR_SSC_HMC_PMC__SEC_PL1__NON_SEC_PL2_PL1 (SET_DBG_VALUE(DBGBCR_SSC, 0) | SET_DBG_VALUE(DBGBCR_HMC, 1) | SET_DBG_VALUE(DBGBCR_PMC, 1))
261 #define DBGBCR_SSC_HMC_PMC__ALL (SET_DBG_VALUE(DBGBCR_SSC, 0) | SET_DBG_VALUE(DBGBCR_HMC, 1) | SET_DBG_VALUE(DBGBCR_PMC, 3))
262 /* only non-secure modes */
263 #define DBGBCR_SSC_HMC_PMC__NON_SEC_PL0_SUP_SYS (SET_DBG_VALUE(DBGBCR_SSC, 1) | SET_DBG_VALUE(DBGBCR_HMC, 0) | SET_DBG_VALUE(DBGBCR_PMC, 0))
264 #define DBGBCR_SSC_HMC_PMC__NON_SEC_PL2 (SET_DBG_VALUE(DBGBCR_SSC, 3) | SET_DBG_VALUE(DBGBCR_HMC, 1) | SET_DBG_VALUE(DBGBCR_PMC, 0))
265 #define DBGBCR_SSC_HMC_PMC__NON_SEC_PL1 (SET_DBG_VALUE(DBGBCR_SSC, 1) | SET_DBG_VALUE(DBGBCR_HMC, 0) | SET_DBG_VALUE(DBGBCR_PMC, 1))
266 #define DBGBCR_SSC_HMC_PMC__NON_SEC_PL0 (SET_DBG_VALUE(DBGBCR_SSC, 1) | SET_DBG_VALUE(DBGBCR_HMC, 0) | SET_DBG_VALUE(DBGBCR_PMC, 2))
267 #define DBGBCR_SSC_HMC_PMC__NON_SEC_PL1_PL0 (SET_DBG_VALUE(DBGBCR_SSC, 1) | SET_DBG_VALUE(DBGBCR_HMC, 0) | SET_DBG_VALUE(DBGBCR_PMC, 3))
268 #define DBGBCR_SSC_HMC_PMC__NON_SEC_PL2_PL1 (SET_DBG_VALUE(DBGBCR_SSC, 1) | SET_DBG_VALUE(DBGBCR_HMC, 1) | SET_DBG_VALUE(DBGBCR_PMC, 1))
269 #define DBGBCR_SSC_HMC_PMC__NON_SEC_ALL (SET_DBG_VALUE(DBGBCR_SSC, 1) | SET_DBG_VALUE(DBGBCR_HMC, 1) | SET_DBG_VALUE(DBGBCR_PMC, 3))
270 /* only secure modes */
271 #define DBGBCR_SSC_HMC_PMC__SEC_PL0_SUP_SYS (SET_DBG_VALUE(DBGBCR_SSC, 2) | SET_DBG_VALUE(DBGBCR_HMC, 0) | SET_DBG_VALUE(DBGBCR_PMC, 0))
272 #define DBGBCR_SSC_HMC_PMC__SEC_PL1 (SET_DBG_VALUE(DBGBCR_SSC, 2) | SET_DBG_VALUE(DBGBCR_HMC, 0) | SET_DBG_VALUE(DBGBCR_PMC, 1))
273 #define DBGBCR_SSC_HMC_PMC__SEC_PL0 (SET_DBG_VALUE(DBGBCR_SSC, 2) | SET_DBG_VALUE(DBGBCR_HMC, 0) | SET_DBG_VALUE(DBGBCR_PMC, 2))
274 #define DBGBCR_SSC_HMC_PMC__SEC_ALL (SET_DBG_VALUE(DBGBCR_SSC, 2) | SET_DBG_VALUE(DBGBCR_HMC, 0) | SET_DBG_VALUE(DBGBCR_PMC, 3))
275  
276 #define DBGBCR_SSC_HMC_PMC_SHIFT 0
277 #define DBGBCR_SSC_HMC_PMC_MASK (GET_DBG_MASK(DBGBCR_SSC) | GET_DBG_MASK(DBGBCR_HMC) | GET_DBG_MASK(DBGBCR_PMC))
278  
279 /* Breakpoint enable */
280 #define DBGBCR_E_SHIFT 0
281 #define DBGBCR_E_MASK 1
282 #define DBGBCR_E_DISABLED 0
283 #define DBGBCR_E_ENABLED 1
284  
285 /* DBGLAR - Lock Access Register */
286 #define DBGLAR (*(volatile int *) (DBGBASE + 0xFB0))
287 #define DBGLAR_UNLOCK_CODE (0xC5ACCE55)
288  
289 /* Breakpoint numbers one-hot encoded */
290 #define DBGBP0 (1 << 0)
291 #define DBGBP1 (1 << 1)
292 #define DBGBP2 (1 << 2)
293 #define DBGBP3 (1 << 3)
294  
295 /* Watch numbers one-hot encoded */
296 #define DBGWP0 (1 << 0)
297 #define DBGWP1 (1 << 1)
298 #define DBGWP2 (1 << 2)
299 #define DBGWP3 (1 << 3)
300  
301 /* C11.11.46 DBGWVR - Watchpoint Value Registers */
302 #define DBGWVR0 (*(volatile int *) (DBGBASE + 0x180))
303 #define DBGWVR1 (*(volatile int *) (DBGBASE + 0x184))
304 #define DBGWVR2 (*(volatile int *) (DBGBASE + 0x188))
305 #define DBGWVR3 (*(volatile int *) (DBGBASE + 0x18C))
306 #define DBGWVR4 (*(volatile int *) (DBGBASE + 0x190))
307 #define DBGWVR5 (*(volatile int *) (DBGBASE + 0x194))
308 #define DBGWVR6 (*(volatile int *) (DBGBASE + 0x198))
309 #define DBGWVR7 (*(volatile int *) (DBGBASE + 0x19C))
310  
311 /* The last two bits of an address needs to be set to 0 */
312 #define DBGWVR_ADDRMASK (0xFFFFFFFC)
313  
314 /* C11.11.44 DBGWCR - Watchpoint Control Registers */
315 #define DBGWCR0 (*(volatile int *) (DBGBASE + 0x1C0))
316 #define DBGWCR1 (*(volatile int *) (DBGBASE + 0x1C4))
317 #define DBGWCR2 (*(volatile int *) (DBGBASE + 0x1C8))
318 #define DBGWCR3 (*(volatile int *) (DBGBASE + 0x1CC))
319 #define DBGWCR4 (*(volatile int *) (DBGBASE + 0x1D0))
320 #define DBGWCR5 (*(volatile int *) (DBGBASE + 0x1D4))
321 #define DBGWCR6 (*(volatile int *) (DBGBASE + 0x1D8))
322 #define DBGWCR7 (*(volatile int *) (DBGBASE + 0x1DC))
323  
324 /* Address range mask */
325 #define DBGWCR_MASK_SHIFT 24
326 #define DBGWCR_MASK_MASK 0x1F
327 #define DBGWCR_MASK_NO_MASK 0
328 #define DBGWCR_MASK_00000007 3
329 #define DBGWCR_MASK_0000000F 4
330 #define DBGWCR_MASK_0000001F 5
331 #define DBGWCR_MASK_0000003F 6
332 #define DBGWCR_MASK_0000007F 7
333 #define DBGWCR_MASK_000000FF 8
334 #define DBGWCR_MASK_000001FF 9
335 #define DBGWCR_MASK_000003FF 10
336 #define DBGWCR_MASK_000007FF 11
337 #define DBGWCR_MASK_00000FFF 12
338 #define DBGWCR_MASK_00001FFF 13
339 #define DBGWCR_MASK_00003FFF 14
340 #define DBGWCR_MASK_00007FFF 15
341 #define DBGWCR_MASK_0000FFFF 16
342 #define DBGWCR_MASK_0001FFFF 17
343 #define DBGWCR_MASK_0003FFFF 18
344 #define DBGWCR_MASK_0007FFFF 19
345 #define DBGWCR_MASK_000FFFFF 20
346 #define DBGWCR_MASK_001FFFFF 21
347 #define DBGWCR_MASK_003FFFFF 22
348 #define DBGWCR_MASK_007FFFFF 23
349 #define DBGWCR_MASK_00FFFFFF 24
350 #define DBGWCR_MASK_01FFFFFF 25
351 #define DBGWCR_MASK_03FFFFFF 26
352 #define DBGWCR_MASK_07FFFFFF 27
353 #define DBGWCR_MASK_0FFFFFFF 28
354 #define DBGWCR_MASK_1FFFFFFF 29
355 #define DBGWCR_MASK_3FFFFFFF 30
356 #define DBGWCR_MASK_7FFFFFFF 31
357  
358 /* Watchpoint type */
359 #define DBGWCR_WT_SHIFT 20
360 #define DBGWCR_WT_MASK 1
361 #define DBGWCR_WT_UNLINKED_DATA_ADDR_MATCH 0
362 #define DBGWCR_WT_LINKED_DATA_ADDR_MATCH 1
363  
364 /* Linked watchpoint number */
365 #define DBGWCR_LBN_SHIFT 16
366 #define DBGWCR_LBN_MASK 0xF
367  
368 /* Security state control */
369 #define DBGWCR_SSC_SHIFT 14
370 #define DBGWCR_SSC_MASK 3
371  
372 /* Hyp mode control bit */
373 #define DBGWCR_HMC_SHIFT 13
374 #define DBGWCR_HMC_MASK 1
375  
376 /* Byte address select */
377 #define DBGWCR_BAS_4BIT_SHIFT 5
378 #define DBGWCR_BAS_4BIT_MASK 0xF
379 #define DBGWCR_BAS_8BIT_SHIFT 5
380 #define DBGWCR_BAS_8BIT_MASK 0xFF
381  
382 /* Load/store access control */
383 #define DBGWCR_LSC_SHIFT 3
384 #define DBGWCR_LSC_MASK 3
385 #define DBGWCR_LSC_MATCH_LOAD 1
386 #define DBGWCR_LSC_MATCH_STORE 2
387 #define DBGWCR_LSC_MATCH_ALL 3
388  
389 /* Privileged access control */
390 #define DBGWCR_PAC_SHIFT 1
391 #define DBGWCR_PAC_MASK 3
392  
393 /* combined options for SSC, HMC and PAC */
394 /* secure and non secure modes */
395 #define DBGWCR_SSC_HMC_PAC__PL1 (SET_DBG_VALUE(DBGWCR_SSC, 0) | SET_DBG_VALUE(DBGWCR_HMC, 0) | SET_DBG_VALUE(DBGWCR_PAC, 1))
396 #define DBGWCR_SSC_HMC_PAC__PL0 (SET_DBG_VALUE(DBGWCR_SSC, 0) | SET_DBG_VALUE(DBGWCR_HMC, 0) | SET_DBG_VALUE(DBGWCR_PAC, 2))
397 #define DBGWCR_SSC_HMC_PAC__PL1_PL0 (SET_DBG_VALUE(DBGWCR_SSC, 0) | SET_DBG_VALUE(DBGWCR_HMC, 0) | SET_DBG_VALUE(DBGWCR_PAC, 3))
398 #define DBGWCR_SSC_HMC_PAC__SEC_PL1__NON_SEC_PL2_PL1 (SET_DBG_VALUE(DBGWCR_SSC, 0) | SET_DBG_VALUE(DBGWCR_HMC, 1) | SET_DBG_VALUE(DBGWCR_PAC, 1))
399 #define DBGWCR_SSC_HMC_PAC__ALL (SET_DBG_VALUE(DBGWCR_SSC, 0) | SET_DBG_VALUE(DBGWCR_HMC, 1) | SET_DBG_VALUE(DBGWCR_PAC, 3))
400 /* only non-secure modes */
401 #define DBGWCR_SSC_HMC_PAC__NON_SEC_PL2 (SET_DBG_VALUE(DBGWCR_SSC, 3) | SET_DBG_VALUE(DBGWCR_HMC, 1) | SET_DBG_VALUE(DBGWCR_PAC, 0))
402 #define DBGWCR_SSC_HMC_PAC__NON_SEC_PL1 (SET_DBG_VALUE(DBGWCR_SSC, 1) | SET_DBG_VALUE(DBGWCR_HMC, 0) | SET_DBG_VALUE(DBGWCR_PAC, 1))
403 #define DBGWCR_SSC_HMC_PAC__NON_SEC_PL0 (SET_DBG_VALUE(DBGWCR_SSC, 1) | SET_DBG_VALUE(DBGWCR_HMC, 0) | SET_DBG_VALUE(DBGWCR_PAC, 2))
404 #define DBGWCR_SSC_HMC_PAC__NON_SEC_PL1_PL0 (SET_DBG_VALUE(DBGWCR_SSC, 1) | SET_DBG_VALUE(DBGWCR_HMC, 0) | SET_DBG_VALUE(DBGWCR_PAC, 3))
405 #define DBGWCR_SSC_HMC_PAC__NON_SEC_PL2_PL1 (SET_DBG_VALUE(DBGWCR_SSC, 1) | SET_DBG_VALUE(DBGWCR_HMC, 1) | SET_DBG_VALUE(DBGWCR_PAC, 1))
406 #define DBGWCR_SSC_HMC_PAC__NON_SEC_PL2_PL1_PL0 (SET_DBG_VALUE(DBGWCR_SSC, 1) | SET_DBG_VALUE(DBGWCR_HMC, 1) | SET_DBG_VALUE(DBGWCR_PAC, 3))
407 /* only secure modes */
408 #define DBGWCR_SSC_HMC_PAC__SEC_PL1 (SET_DBG_VALUE(DBGWCR_SSC, 2) | SET_DBG_VALUE(DBGWCR_HMC, 0) | SET_DBG_VALUE(DBGWCR_PAC, 1))
409 #define DBGWCR_SSC_HMC_PAC__SEC_PL0 (SET_DBG_VALUE(DBGWCR_SSC, 2) | SET_DBG_VALUE(DBGWCR_HMC, 0) | SET_DBG_VALUE(DBGWCR_PAC, 2))
410 #define DBGWCR_SSC_HMC_PAC__SEC_PL1_PL0 (SET_DBG_VALUE(DBGWCR_SSC, 2) | SET_DBG_VALUE(DBGWCR_HMC, 0) | SET_DBG_VALUE(DBGWCR_PAC, 3))
411  
412 #define DBGWCR_SSC_HMC_PAC_SHIFT 0
413 #define DBGWCR_SSC_HMC_PAC_MASK (GET_DBG_MASK(DBGWCR_SSC) | GET_DBG_MASK(DBGWCR_HMC) | GET_DBG_MASK(DBGWCR_PAC))
414  
415 /* Watchpoint enable */
416 #define DBGWCR_E_SHIFT 0
417 #define DBGWCR_E_MASK 1
418 #define DBGWCR_E_DISABLED 0
419 #define DBGWCR_E_ENABLED 1
420  
421 /* Processor modes */
422 #define DBG_PROCESSOR_MODE_USR 0x10
423 #define DBG_PROCESSOR_MODE_FIQ 0x11
424 #define DBG_PROCESSOR_MODE_IRQ 0x12
425 #define DBG_PROCESSOR_MODE_SVC 0x13
426 #define DBG_PROCESSOR_MODE_ABT 0x17
427 #define DBG_PROCESSOR_MODE_UND 0x1B
428 #define DBG_PROCESSOR_MODE_SYS 0x1F
429  
430 /* debug helper macros */
431 #define dbg_expand1(x) #x
432 #define dbg_expand(x) dbg_expand1(x)
433  
434 #define dbg_change_processor_mode(mode) do { \
435 asm("cps #" dbg_expand(mode) "\n"); \
436 } while (0)
437  
438 #define dbg_unlock_debug_registers() do { \
439 DBGLAR = DBGLAR_UNLOCK_CODE; \
440 } while (0)
441  
442 #define dbg_enable_monitor_mode_debugging() do { \
443 DBGDSCR = UPDATE_DBG_REG(DBGDSCR, GET_DBG_MASK(DBGDSCR_MDBGen), SET_DBG_VALUE(DBGDSCR_MDBGen, DBGDSCR_MDBGen_ENABLED)); \
444 } while (0)
445  
446 #define dbg_disable_monitor_mode_debugging() do { \
447 DBGDSCR = UPDATE_DBG_REG(DBGDSCR, GET_DBG_MASK(DBGDSCR_MDBGen), SET_DBG_VALUE(DBGDSCR_MDBGen, DBGDSCR_MDBGen_DISABLED)); \
448 } while (0)
449  
450 #define dbg_enable_breakpoint(number) do { \
451 DBGBCR ## number = UPDATE_DBG_REG(DBGBCR ## number, GET_DBG_MASK(DBGBCR_E), SET_DBG_VALUE(DBGBCR_E, DBGBCR_E_ENABLED)); \
452 } while (0)
453  
454 #define dbg_disable_breakpoint(number) do { \
455 DBGBCR ## number = UPDATE_DBG_REG(DBGBCR ## number, GET_DBG_MASK(DBGBCR_E), SET_DBG_VALUE(DBGBCR_E, DBGBCR_E_DISABLED)); \
456 } while (0)
457  
458 #define dbg_set_breakpoint_type_to_instr_addr_match(number) do { \
459 DBGBCR ## number = UPDATE_DBG_REG(DBGBCR ## number, GET_DBG_MASK(DBGBCR_BT), SET_DBG_VALUE(DBGBCR_BT, DBGBCR_BT_UNLINKED_INSTR_ADDR_MATCH)); \
460 } while (0)
461  
462 #define dbg_set_breakpoint_type_to_instr_addr_mismatch(number) do { \
463 DBGBCR ## number = UPDATE_DBG_REG(DBGBCR ## number, GET_DBG_MASK(DBGBCR_BT), SET_DBG_VALUE(DBGBCR_BT, DBGBCR_BT_UNLINKED_INSTR_ADDR_MISMATCH)); \
464 } while (0)
465  
466 #define dbg_is_breakpoint_enabled(number) (GET_DBG_VALUE(DBGBCR_E, DBGBCR ## number))
467  
468 #define dbg_is_breakpoint_type_instr_addr_match(number) (GET_DBG_VALUE(DBGBCR_BT, DBGBCR ## number) == DBGBCR_BT_UNLINKED_INSTR_ADDR_MATCH)
469  
470 #define dbg_is_breakpoint_type_instr_addr_mismatch(number) (GET_DBG_VALUE(DBGBCR_BT, DBGBCR ## number) == DBGBCR_BT_UNLINKED_INSTR_ADDR_MISMATCH)
471  
472 #define dbg_triggers_on_breakpoint_address(number, address) ((DBGBVR ## number == (address & DBGBVR_ADDRMASK)) && (GET_DBG_VALUE(DBGBCR_BAS, DBGBCR ## number) == GET_BAS_FOR_THUMB_ADDR(address)))
473  
474 #define dbg_set_breakpoint_for_addr_match(number, address) do { \
475 DBGBCR ## number = 0x0; \
476 DBGBVR ## number = (address) & DBGBVR_ADDRMASK; \
477 DBGBCR ## number = \
478 SET_DBG_VALUE(DBGBCR_BT, DBGBCR_BT_UNLINKED_INSTR_ADDR_MATCH) | \
479 SET_DBG_VALUE(DBGBCR_MASK, DBGBCR_MASK_NO_MASK) | \
480 SET_DBG_VALUE(DBGBCR_E, DBGBCR_E_ENABLED) | \
481 SET_DBG_VALUE(DBGBCR_SSC_HMC_PMC, DBGBCR_SSC_HMC_PMC__PL0_SUP_SYS) | \
482 SET_DBG_VALUE(DBGBCR_BAS, GET_BAS_FOR_THUMB_ADDR(address)); \
483 } while (0)
484  
485 #define dbg_set_breakpoint_for_addr_mismatch(number, address) do { \
486 DBGBCR ## number = 0x0; \
487 DBGBVR ## number = (address) & DBGBVR_ADDRMASK; \
488 DBGBCR ## number = \
489 SET_DBG_VALUE(DBGBCR_BT, DBGBCR_BT_UNLINKED_INSTR_ADDR_MISMATCH) | \
490 SET_DBG_VALUE(DBGBCR_MASK, DBGBCR_MASK_NO_MASK) | \
491 SET_DBG_VALUE(DBGBCR_E, DBGBCR_E_ENABLED) | \
492 SET_DBG_VALUE(DBGBCR_SSC_HMC_PMC, DBGBCR_SSC_HMC_PMC__PL0_SUP_SYS) | \
493 SET_DBG_VALUE(DBGBCR_BAS, GET_BAS_FOR_THUMB_ADDR(address)); \
494 } while (0)
495  
496  
497 #define dbg_enable_watchpoint(number) do { \
498 DBGWCR ## number = UPDATE_DBG_REG(DBGWCR ## number, GET_DBG_MASK(DBGWCR_E), SET_DBG_VALUE(DBGWCR_E, DBGWCR_E_ENABLED)); \
499 } while (0)
500  
501 #define dbg_disable_watchpoint(number) do { \
502 DBGWCR ## number = UPDATE_DBG_REG(DBGWCR ## number, GET_DBG_MASK(DBGWCR_E), SET_DBG_VALUE(DBGWCR_E, DBGWCR_E_DISABLED)); \
503 } while (0)
504  
505 #define dbg_set_watchpoint_for_addr_match(number, address) do { \
506 DBGWCR ## number = 0x0; \
507 DBGWVR ## number = (address) & DBGWVR_ADDRMASK; \
508 DBGWCR ## number = \
509 SET_DBG_VALUE(DBGWCR_WT, DBGWCR_WT_UNLINKED_DATA_ADDR_MATCH) | \
510 SET_DBG_VALUE(DBGWCR_MASK, DBGWCR_MASK_NO_MASK) | \
511 SET_DBG_VALUE(DBGWCR_E, DBGWCR_E_ENABLED) | \
512 SET_DBG_VALUE(DBGWCR_SSC_HMC_PAC, DBGWCR_SSC_HMC_PAC__ALL) | \
513 SET_DBG_VALUE(DBGWCR_LSC, DBGWCR_LSC_MATCH_ALL) | \
514 SET_DBG_VALUE(DBGWCR_BAS_4BIT, 0xF); \
515 } while (0)
516  
517 #define dbg_set_watchpoint_for_addr_match_with_mask(number, address, mask) do { \
518 DBGWCR ## number = 0x0; \
519 DBGWVR ## number = (address) & DBGWVR_ADDRMASK; \
520 DBGWCR ## number = \
521 SET_DBG_VALUE(DBGWCR_WT, DBGWCR_WT_UNLINKED_DATA_ADDR_MATCH) | \
522 SET_DBG_VALUE(DBGWCR_MASK, mask) | \
523 SET_DBG_VALUE(DBGWCR_E, DBGWCR_E_ENABLED) | \
524 SET_DBG_VALUE(DBGWCR_SSC_HMC_PAC, DBGWCR_SSC_HMC_PAC__ALL) | \
525 SET_DBG_VALUE(DBGWCR_LSC, DBGWCR_LSC_MATCH_ALL) | \
526 SET_DBG_VALUE(DBGWCR_BAS_4BIT, 0xF); \
527 } while (0)
528  
529  
530 #endif /* DEBUG_H */