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; }
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); }
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); }