Rev 2921 | Rev 3431 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2921 | Rev 3424 | ||
---|---|---|---|
Line 104... | Line 104... | ||
104 | /** Print table of active breakpoints */ |
104 | /** Print table of active breakpoints */ |
105 | int cmd_print_breakpoints(cmd_arg_t *argv __attribute__((unused))) |
105 | int cmd_print_breakpoints(cmd_arg_t *argv __attribute__((unused))) |
106 | { |
106 | { |
107 | unsigned int i; |
107 | unsigned int i; |
108 | char *symbol; |
108 | char *symbol; |
109 | 109 | ||
110 | if (sizeof(void *) == 4) { |
110 | #ifdef __32_BITS__ |
111 | printf("# Count Address In symbol\n"); |
111 | printf("# Count Address In symbol\n"); |
112 | printf("-- ----- ---------- ---------\n"); |
112 | printf("-- ----- ---------- ---------\n"); |
113 | } else { |
113 | #endif |
- | 114 | ||
- | 115 | #ifdef __64_BITS__ |
|
114 | printf("# Count Address In symbol\n"); |
116 | printf("# Count Address In symbol\n"); |
115 | printf("-- ----- ------------------ ---------\n"); |
117 | printf("-- ----- ------------------ ---------\n"); |
116 | } |
118 | #endif |
117 | 119 | ||
118 | for (i = 0; i < BKPOINTS_MAX; i++) |
120 | for (i = 0; i < BKPOINTS_MAX; i++) |
119 | if (breakpoints[i].address) { |
121 | if (breakpoints[i].address) { |
120 | symbol = get_symtab_entry(breakpoints[i].address); |
122 | symbol = get_symtab_entry(breakpoints[i].address); |
121 | 123 | ||
122 | if (sizeof(void *) == 4) |
124 | #ifdef __32_BITS__ |
123 | printf("%-2u %-5d %#10zx %s\n", i, breakpoints[i].counter, |
125 | printf("%-2u %-5d %#10zx %s\n", i, |
124 | breakpoints[i].address, symbol); |
126 | breakpoints[i].counter, breakpoints[i].address, |
- | 127 | symbol); |
|
125 | else |
128 | #endif |
- | 129 | ||
- | 130 | #ifdef __64_BITS__ |
|
126 | printf("%-2u %-5d %#18zx %s\n", i, breakpoints[i].counter, |
131 | printf("%-2u %-5d %#18zx %s\n", i, |
127 | breakpoints[i].address, symbol); |
132 | breakpoints[i].counter, breakpoints[i].address, |
- | 133 | symbol); |
|
- | 134 | #endif |
|
- | 135 | ||
128 | } |
136 | } |
129 | return 1; |
137 | return 1; |
130 | } |
138 | } |
131 | 139 | ||
132 | /* Setup DR register according to table */ |
140 | /* Setup DR register according to table */ |
Line 160... | Line 168... | ||
160 | dr7 &= ~ (0x3 << (16 + 4*curidx)); |
168 | dr7 &= ~ (0x3 << (16 + 4*curidx)); |
161 | dr7 &= ~ (0x3 << (18 + 4*curidx)); |
169 | dr7 &= ~ (0x3 << (18 + 4*curidx)); |
162 | if ((flags & BKPOINT_INSTR)) { |
170 | if ((flags & BKPOINT_INSTR)) { |
163 | ; |
171 | ; |
164 | } else { |
172 | } else { |
- | 173 | ||
165 | if (sizeof(int) == 4) |
174 | #ifdef __32_BITS__ |
166 | dr7 |= ((unative_t) 0x3) << (18 + 4*curidx); |
175 | dr7 |= ((unative_t) 0x3) << (18 + 4 * curidx); |
- | 176 | #endif |
|
- | 177 | ||
167 | else /* 8 */ |
178 | #ifdef __64_BITS__ |
168 | dr7 |= ((unative_t) 0x2) << (18 + 4*curidx); |
179 | dr7 |= ((unative_t) 0x2) << (18 + 4 * curidx); |
- | 180 | #endif |
|
169 | 181 | ||
170 | if ((flags & BKPOINT_WRITE)) |
182 | if ((flags & BKPOINT_WRITE)) |
171 | dr7 |= ((unative_t) 0x1) << (16 + 4*curidx); |
183 | dr7 |= ((unative_t) 0x1) << (16 + 4 * curidx); |
172 | else if ((flags & BKPOINT_READ_WRITE)) |
184 | else if ((flags & BKPOINT_READ_WRITE)) |
173 | dr7 |= ((unative_t) 0x3) << (16 + 4*curidx); |
185 | dr7 |= ((unative_t) 0x3) << (16 + 4 * curidx); |
174 | } |
186 | } |
175 | 187 | ||
176 | /* Enable global breakpoint */ |
188 | /* Enable global breakpoint */ |
177 | dr7 |= 0x2 << (curidx*2); |
189 | dr7 |= 0x2 << (curidx * 2); |
178 | 190 | ||
179 | write_dr7(dr7); |
191 | write_dr7(dr7); |
180 | 192 | ||
181 | } |
193 | } |
182 | } |
194 | } |
Line 244... | Line 256... | ||
244 | /* Handle zero checker */ |
256 | /* Handle zero checker */ |
245 | if (! (breakpoints[slot].flags & BKPOINT_INSTR)) { |
257 | if (! (breakpoints[slot].flags & BKPOINT_INSTR)) { |
246 | if ((breakpoints[slot].flags & BKPOINT_CHECK_ZERO)) { |
258 | if ((breakpoints[slot].flags & BKPOINT_CHECK_ZERO)) { |
247 | if (*((unative_t *) breakpoints[slot].address) != 0) |
259 | if (*((unative_t *) breakpoints[slot].address) != 0) |
248 | return; |
260 | return; |
249 | printf("**** Found ZERO on address %lx (slot %d) ****\n", |
261 | printf("*** Found ZERO on address %lx (slot %d) ***\n", |
250 | breakpoints[slot].address, slot); |
262 | breakpoints[slot].address, slot); |
251 | } else { |
263 | } else { |
252 | printf("Data watchpoint - new data: %lx\n", |
264 | printf("Data watchpoint - new data: %lx\n", |
253 | *((unative_t *) breakpoints[slot].address)); |
265 | *((unative_t *) breakpoints[slot].address)); |
254 | } |
266 | } |
255 | } |
267 | } |
256 | printf("Reached breakpoint %d:%lx(%s)\n", slot, getip(istate), |
268 | printf("Reached breakpoint %d:%lx(%s)\n", slot, getip(istate), |
257 | get_symtab_entry(getip(istate))); |
269 | get_symtab_entry(getip(istate))); |
258 | printf("***Type 'exit' to exit kconsole.\n"); |
270 | printf("***Type 'exit' to exit kconsole.\n"); |
259 | atomic_set(&haltstate,1); |
271 | atomic_set(&haltstate,1); |
260 | kconsole((void *) "debug"); |
272 | kconsole((void *) "debug"); |
261 | atomic_set(&haltstate,0); |
273 | atomic_set(&haltstate,0); |
262 | } |
274 | } |
Line 357... | Line 369... | ||
357 | } |
369 | } |
358 | } |
370 | } |
359 | } |
371 | } |
360 | 372 | ||
361 | #ifdef CONFIG_SMP |
373 | #ifdef CONFIG_SMP |
- | 374 | static void |
|
- | 375 | debug_ipi(int n __attribute__((unused)), |
|
362 | static void debug_ipi(int n __attribute__((unused)), istate_t *istate __attribute__((unused))) |
376 | istate_t *istate __attribute__((unused))) |
363 | { |
377 | { |
364 | int i; |
378 | int i; |
365 | 379 | ||
366 | spinlock_lock(&bkpoint_lock); |
380 | spinlock_lock(&bkpoint_lock); |
367 | for (i = 0; i < BKPOINTS_MAX; i++) |
381 | for (i = 0; i < BKPOINTS_MAX; i++) |
Line 373... | Line 387... | ||
373 | /** Initialize debugger */ |
387 | /** Initialize debugger */ |
374 | void debugger_init() |
388 | void debugger_init() |
375 | { |
389 | { |
376 | int i; |
390 | int i; |
377 | 391 | ||
378 | for (i=0; i<BKPOINTS_MAX; i++) |
392 | for (i = 0; i < BKPOINTS_MAX; i++) |
379 | breakpoints[i].address = NULL; |
393 | breakpoints[i].address = NULL; |
380 | 394 | ||
381 | cmd_initialize(&bkpts_info); |
395 | cmd_initialize(&bkpts_info); |
382 | if (!cmd_register(&bkpts_info)) |
396 | if (!cmd_register(&bkpts_info)) |
383 | panic("could not register command %s\n", bkpts_info.name); |
397 | panic("could not register command %s\n", bkpts_info.name); |
Line 394... | Line 408... | ||
394 | cmd_initialize(&addwatchp_info); |
408 | cmd_initialize(&addwatchp_info); |
395 | if (!cmd_register(&addwatchp_info)) |
409 | if (!cmd_register(&addwatchp_info)) |
396 | panic("could not register command %s\n", addwatchp_info.name); |
410 | panic("could not register command %s\n", addwatchp_info.name); |
397 | #endif |
411 | #endif |
398 | 412 | ||
399 | exc_register(VECTOR_DEBUG, "debugger", |
413 | exc_register(VECTOR_DEBUG, "debugger", debug_exception); |
400 | debug_exception); |
- | |
401 | #ifdef CONFIG_SMP |
414 | #ifdef CONFIG_SMP |
402 | exc_register(VECTOR_DEBUG_IPI, "debugger_smp", |
415 | exc_register(VECTOR_DEBUG_IPI, "debugger_smp", debug_ipi); |
403 | debug_ipi); |
- | |
404 | #endif |
416 | #endif |
405 | } |
417 | } |
406 | 418 | ||
407 | /** @} |
419 | /** @} |
408 | */ |
420 | */ |