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;
}
Пример #7
0
/** @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;
}
Пример #8
0
/** @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;
}
Пример #9
0
/** @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;
}
Пример #10
0
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;
}
Пример #11
0
PUBLIC static inline
Mword
Jdb_bp::get_debug_control_register(Space *task)
{
  return read_debug_register(7, task);
}