/* * SW breakpoint management: */ int dbg_activate_sw_breakpoints(void) { unsigned long addr; int error; int ret = 0; int i; for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) { if (kgdb_break[i].state != BP_SET) continue; addr = kgdb_break[i].bpt_addr; error = kgdb_arch_set_breakpoint(addr, kgdb_break[i].saved_instr); if (error) { ret = error; printk(KERN_INFO "KGDB: BP install failed: %lx", addr); continue; } kgdb_flush_swbreak_addr(addr); kgdb_break[i].state = BP_ACTIVE; } return ret; }
int __weak kgdb_validate_break_address(unsigned long addr) { char tmp_variable[BREAK_INSTR_SIZE]; int err; /* Validate setting the breakpoint and then removing it. In the * remove fails, the kernel needs to emit a bad message because we * are deep trouble not being able to put things back the way we * found them. */ err = kgdb_arch_set_breakpoint(addr, tmp_variable); if (err) return err; err = kgdb_arch_remove_breakpoint(addr, tmp_variable); if (err) printk(KERN_ERR "KGDB: Critical breakpoint error, kernel " "memory destroyed at: %lx", addr); return err; }
int __weak kgdb_validate_break_address(unsigned long addr) { struct kgdb_bkpt tmp; int err; /* Validate setting the breakpoint and then removing it. If the * remove fails, the kernel needs to emit a bad message because we * are deep trouble not being able to put things back the way we * found them. */ tmp.bpt_addr = addr; err = kgdb_arch_set_breakpoint(&tmp); if (err) return err; err = kgdb_arch_remove_breakpoint(&tmp); if (err) printk(KERN_ERR "KGDB: Critical breakpoint error, kernel " "memory destroyed at: %lx", addr); return err; }
/* * SW breakpoint management: */ static int kgdb_activate_sw_breakpoints(void) { unsigned long addr; int error = 0; int i; for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) { if (kgdb_break[i].state != BP_SET) continue; addr = kgdb_break[i].bpt_addr; error = kgdb_arch_set_breakpoint(addr, kgdb_break[i].saved_instr); if (error) return error; kgdb_flush_swbreak_addr(addr); kgdb_break[i].state = BP_ACTIVE; } return 0; }
/* * SW breakpoint management: */ int dbg_activate_sw_breakpoints(void) { int error; int ret = 0; int i; for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) { if (kgdb_break[i].state != BP_SET) continue; error = kgdb_arch_set_breakpoint(&kgdb_break[i]); if (error) { ret = error; pr_info("BP install failed: %lx\n", kgdb_break[i].bpt_addr); continue; } kgdb_flush_swbreak_addr(kgdb_break[i].bpt_addr); kgdb_break[i].state = BP_ACTIVE; } return ret; }