PUBLIC static inline Mword Jdb_bp::get_dr(Mword i) { switch (i) { case 0: return read_debug_register(0); case 1: return read_debug_register(1); case 2: return read_debug_register(2); case 3: return read_debug_register(3); case 6: return read_debug_register(6); case 7: return dr7; default: return 0; } }
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); }
/** @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; }
PUBLIC static inline Mword Jdb_bp::get_debug_control_register(Space *task) { return read_debug_register(7, task); }