@@ -303,7 +303,32 @@ static int windbg_hw_breakpoint_remove(CPUState *cpu, int index)
}
static void windbg_set_dr7(CPUState *cpu, target_ulong new_dr7)
-{}
+{
+ CPUArchState *env = cpu->env_ptr;
+ target_ulong old_dr7 = env->dr[7];
+ int iobpt = 0;
+ int i;
+
+ new_dr7 |= DR7_FIXED_1;
+ if (new_dr7 == old_dr7) {
+ return;
+ }
+
+ for (i = 0; i < DR7_MAX_BP; i++) {
+ if (IS_BP_ENABLED(old_dr7, i) && !IS_BP_ENABLED(new_dr7, i)) {
+ windbg_hw_breakpoint_remove(cpu, i);
+ }
+ }
+
+ env->dr[7] = new_dr7;
+ for (i = 0; i < DR7_MAX_BP; i++) {
+ if (IS_BP_ENABLED(env->dr[7], i)) {
+ iobpt |= windbg_hw_breakpoint_insert(cpu, i);
+ }
+ }
+
+ env->hflags = (env->hflags & ~HF_IOBPT_MASK) | iobpt;
+}
static void windbg_set_dr(CPUState *cpu, int index, target_ulong value)
{