9 #include <linux/ptrace.h>
148 static struct hw_breakpoint {
149 unsigned int occupied:1;
153 unsigned int dataacc:2;
154 unsigned short count;
158 static int bfin_set_hw_break(
unsigned long addr,
int len,
enum kgdb_bptype
type)
165 case BP_HARDWARE_BREAKPOINT:
168 case BP_WRITE_WATCHPOINT:
172 case BP_READ_WATCHPOINT:
176 case BP_ACCESS_WATCHPOINT:
191 if (bfin_type == breakinfo[breakno].type
192 && !breakinfo[breakno].occupied) {
193 breakinfo[breakno].occupied = 1;
194 breakinfo[breakno].skip = 0;
195 breakinfo[breakno].enabled = 1;
196 breakinfo[breakno].addr =
addr;
197 breakinfo[breakno].dataacc = dataacc;
198 breakinfo[breakno].count = 0;
205 static int bfin_remove_hw_break(
unsigned long addr,
int len,
enum kgdb_bptype type)
211 case BP_HARDWARE_BREAKPOINT:
214 case BP_WRITE_WATCHPOINT:
215 case BP_READ_WATCHPOINT:
216 case BP_ACCESS_WATCHPOINT:
223 if (bfin_type == breakinfo[breakno].type
224 && breakinfo[breakno].occupied
225 && breakinfo[breakno].addr == addr) {
226 breakinfo[breakno].occupied = 0;
227 breakinfo[breakno].enabled = 0;
233 static void bfin_remove_all_hw_break(
void)
237 memset(breakinfo, 0,
sizeof(
struct hw_breakpoint)*HW_WATCHPOINT_NUM);
245 static void bfin_correct_hw_break(
void)
248 unsigned int wpiactl = 0;
249 unsigned int wpdactl = 0;
253 if (breakinfo[breakno].
enabled) {
295 wpdactl |= breakinfo[breakno].dataacc
303 wpdactl |= breakinfo[breakno].dataacc
323 static void bfin_disable_hw_debug(
struct pt_regs *
regs)
332 void kgdb_passive_cpu_callback(
void *
info)
342 void kgdb_roundup_cpu(
int cpu,
unsigned long flags)
349 static unsigned long kgdb_arch_imask;
358 if (kgdb_arch_imask) {
366 int err_code,
char *remcom_in_buffer,
367 char *remcom_out_buffer,
375 switch (remcom_in_buffer[0]) {
379 strcpy(remcom_out_buffer,
"E00");
386 ptr = &remcom_in_buffer[1];
393 regs->
syscfg &= 0xfffffffe;
396 if (remcom_in_buffer[0] ==
's') {
401 if (kgdb_single_step & 1)
407 kgdb_single_step = i + 1;
416 bfin_correct_hw_break();
424 .gdb_bpt_instr = {0xa1},
425 .flags = KGDB_HW_BREAKPOINT,
426 .set_hw_breakpoint = bfin_set_hw_break,
427 .remove_hw_breakpoint = bfin_remove_hw_break,
428 .disable_hw_break = bfin_disable_hw_debug,
429 .remove_all_hw_break = bfin_remove_all_hw_break,
430 .correct_hw_break = bfin_correct_hw_break,
433 #define IN_MEM(addr, size, l1_addr, l1_size) \
435 unsigned long __addr = (unsigned long)(addr); \
436 (l1_size && __addr >= l1_addr && __addr + (size) <= l1_addr + l1_size); \
438 #define ASYNC_BANK_SIZE \
439 (ASYNC_BANK0_SIZE + ASYNC_BANK1_SIZE + \
440 ASYNC_BANK2_SIZE + ASYNC_BANK3_SIZE)
474 bfin_remove_all_hw_break();