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