Пример #1
0
static int
ia64_linux_remove_watchpoint (struct target_ops *self,
			      CORE_ADDR addr, int len,
			      enum target_hw_bp_type type,
			      struct expression *cond)
{
  int idx;
  long dbr_addr, dbr_mask;
  int max_watchpoints = 4;

  if (len <= 0 || !is_power_of_2 (len))
    return -1;

  for (idx = 0; idx < max_watchpoints; idx++)
    {
      dbr_addr = debug_registers[2 * idx];
      dbr_mask = debug_registers[2 * idx + 1];
      if ((dbr_mask & (0x3UL << 62)) && addr == (CORE_ADDR) dbr_addr)
	{
	  struct lwp_info *lp;

	  debug_registers[2 * idx] = 0;
	  debug_registers[2 * idx + 1] = 0;
	  dbr_addr = 0;
	  dbr_mask = 0;

	  ALL_LWPS (lp)
	    store_debug_register_pair (lp->ptid, idx, &dbr_addr, &dbr_mask);

	  return 0;
	}
    }
  return -1;
}
Пример #2
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);
}
Пример #3
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);
}