IMPLEMENT void Jdb_bp::at_jdb_leave() { write_debug_register(6, Val_leave); write_debug_register(7, dr7); }
static int Jdb_bp::set_debug_address_register(int num, Mword addr, Mword len, Breakpoint::Mode mode, Task *task) { if (!task) { putstr(" => kernel task not allowed for breakpoints"); return 0; } if (num >= 0 && num <= 3) { Mword local_dr7; Task *old_task = Kobject::dcast<Task*>(Kobject::from_dbg(Kobject_dbg::id_to_obj(bps[num].restricted_task()))); if (old_task) { // clear old breakpoint of other process local_dr7 = get_debug_control_register(old_task); clr_dr7(num, local_dr7); set_debug_control_register(local_dr7, old_task); } bps[num].restrict_task(0, task->dbg_info()->dbg_id()); write_debug_register(num, addr, task); local_dr7 = get_debug_control_register(task); clr_dr7(num, local_dr7); set_dr7(num, len, mode, local_dr7); set_debug_control_register(local_dr7, task); return 1; } return 0; }
IMPLEMENT void Jdb_bp::at_jdb_leave() { if (Jdb::get_current_active() && Jdb::get_current_active()->space() != Kernel_task::kernel_task()) write_debug_register(6, 0, Jdb::get_current_active()->space()); }
IMPLEMENT void Jdb_bp::at_jdb_enter() { dr7 = read_debug_register(7); // disable breakpoints while we are in kernel debugger write_debug_register(7, dr7 & Val_enter); }
static int Jdb_bp::set_debug_address_register(int num, Mword addr, Mword len, Breakpoint::Mode mode, Space *) { clr_dr7(num, dr7); set_dr7(num, len, mode, dr7); switch (num) { case 0: write_debug_register(0, addr); break; case 1: write_debug_register(1, addr); break; case 2: write_debug_register(2, addr); break; case 3: write_debug_register(3, addr); break; default:; } return 1; }
PUBLIC static inline void Jdb_bp::set_debug_control_register(Mword val, Space *task) { printf("set_debug_control_register\n"); for (int i=0; i<4; i++) if (!(val & (2 << 2*i))) val &= ~(0x0f << (16 + 4*i)); write_debug_register(7, val, task); }
/** @return 0 if only breakpoints were logged and jdb should not be entered */ IMPLEMENT int Jdb_bp::test_log_only() { Mword dr6 = read_debug_register(6); if (dr6 & Val_test) { dr7 = read_debug_register(7); // disable breakpoints -- we might trigger a r/w breakpoint again write_debug_register(7, dr7 & Val_enter); test_log(dr6); write_debug_register(6, dr6); write_debug_register(7, dr7); if (!(dr6 & Val_test_other)) // don't enter jdb, breakpoints only logged return 1; } // enter jdb return 0; }
/** @return 1 if other debug exception occured */ IMPLEMENT int Jdb_bp::test_other(String_buffer *buf) { Mword dr6 = read_debug_register(6); if (!(dr6 & Val_test_other)) return 0; buf->printf("unknown trap 1 (dr6=" L4_PTR_FMT ")", dr6); write_debug_register(6, Val_leave); return 1; }
/** @return 1 if breakpoint occured */ IMPLEMENT int Jdb_bp::test_break(String_buffer *buf) { Mword dr6 = read_debug_register(6); if (!(dr6 & Val_test)) return 0; int ret = test_break(buf, dr6); write_debug_register(6, dr6 & ~Val_test); return ret; }
/** @return 1 if single step occured */ IMPLEMENT int Jdb_bp::test_sstep() { Mword dr6 = read_debug_register(6); if (!(dr6 & Val_test_sstep)) return 0; // single step has highest priority, don't consider other conditions write_debug_register(6, Val_leave); return 1; }
/** @return 1 if other debug exception occured */ IMPLEMENT int Jdb_bp::test_other(char *errbuf, size_t bufsize) { Mword dr6 = read_debug_register(6); if (!(dr6 & Val_test_other)) return 0; snprintf(errbuf, bufsize, "unknown trap 1 (dr6=" L4_PTR_FMT ")", dr6); write_debug_register(6, Val_leave); return 1; }
/** @return 1 if breakpoint occured */ IMPLEMENT int Jdb_bp::test_break(char *errbuf, size_t bufsize) { Mword dr6 = read_debug_register(6); if (!(dr6 & Val_test)) return 0; int ret = test_break(dr6, errbuf, bufsize); write_debug_register(6, dr6 & ~Val_test); return ret; }
/** @return 1 if breakpoint occured */ IMPLEMENT int Jdb_bp::test_break(char *errbuf, size_t bufsize) { Space *t = Jdb::get_thread(0)->space(); Mword dr6 = read_debug_register(6, t); if (!(dr6 & 0x000000f)) return 0; test_break(dr6, errbuf, bufsize); write_debug_register(6, dr6 & ~0x0000000f, t); return 1; }
IMPLEMENT int Jdb_bp::test_log_only() { Space *t = Jdb::get_thread(0)->space(); Mword dr6 = read_debug_register(6, t); if (dr6 & 0x0000000f) { test_log(dr6); write_debug_register(6, dr6, t); if (!(dr6 & 0x0000e00f)) // don't enter jdb, breakpoints only logged return 1; } // enter jdb return 0; }