nexmon – Blame information for rev 1
?pathlinks?
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 */ |