Пример #1
0
static void
i386_linux_new_thread (ptid_t ptid)
{
  int i;

  for (i = DR_FIRSTADDR; i <= DR_LASTADDR; i++)
    i386_linux_dr_set (ptid, i, i386_linux_dr[i]);

  i386_linux_dr_set (ptid, DR_CONTROL, i386_linux_dr[DR_CONTROL]);
}
void
i386_linux_dr_reset_addr (int regnum)
{
  gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);

  i386_linux_dr_set (DR_FIRSTADDR + regnum, 0L);
}
void
i386_linux_dr_set_addr (int regnum, CORE_ADDR addr)
{
  gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);

  i386_linux_dr_set (DR_FIRSTADDR + regnum, addr);
}
Пример #4
0
static void
i386_linux_dr_set_control (unsigned long control)
{
  struct lwp_info *lp;

  i386_linux_dr[DR_CONTROL] = control;
  ALL_LWPS (lp)
    i386_linux_dr_set (lp->ptid, DR_CONTROL, control);
}
Пример #5
0
static void
i386_linux_prepare_to_resume (struct lwp_info *lwp)
{
  int clear_status = 0;

  /* NULL means this is the main thread still going through the shell,
     or, no watchpoint has been set yet.  In that case, there's
     nothing to do.  */
  if (lwp->arch_private == NULL)
    return;

  if (lwp->arch_private->debug_registers_changed)
    {
      struct i386_debug_reg_state *state
	= i386_debug_reg_state (ptid_get_pid (lwp->ptid));
      int i;

      /* See amd64_linux_prepare_to_resume for Linux kernel note on
	 i386_linux_dr_set calls ordering.  */

      i386_linux_dr_set (lwp->ptid, DR_CONTROL, 0);

      for (i = DR_FIRSTADDR; i <= DR_LASTADDR; i++)
	if (state->dr_ref_count[i] > 0)
	  {
	    i386_linux_dr_set (lwp->ptid, i, state->dr_mirror[i]);

	    /* If we're setting a watchpoint, any change the inferior
	       had done itself to the debug registers needs to be
	       discarded, otherwise, i386_stopped_data_address can get
	       confused.  */
	    clear_status = 1;
	  }

      if (state->dr_control_mirror != 0)
	i386_linux_dr_set (lwp->ptid, DR_CONTROL, state->dr_control_mirror);

      lwp->arch_private->debug_registers_changed = 0;
    }

  if (clear_status || lwp->stopped_by_watchpoint)
    i386_linux_dr_set (lwp->ptid, DR_STATUS, 0);
}
Пример #6
0
static void
i386_linux_dr_set_addr (int regnum, CORE_ADDR addr)
{
  struct lwp_info *lp;

  gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);

  i386_linux_dr[DR_FIRSTADDR + regnum] = addr;
  ALL_LWPS (lp)
    i386_linux_dr_set (lp->ptid, DR_FIRSTADDR + regnum, addr);
}
Пример #7
0
static void
i386_linux_dr_unset_status (unsigned long mask)
{
  struct lwp_info *lp;

  ALL_LWPS (lp)
    {
      unsigned long value;

      value = i386_linux_dr_get (lp->ptid, DR_STATUS);
      value &= ~mask;
      i386_linux_dr_set (lp->ptid, DR_STATUS, value);
    }
}
void
i386_linux_dr_set_control (unsigned long control)
{
  i386_linux_dr_set (DR_CONTROL, control);
}