target/i386: implement DR7.GD

DR7.GD triggers a #DB exception on any access to debug registers.
The GD bit is cleared so that the #DB handler itself can access
the debug registers.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2024-05-29 13:18:56 +02:00
parent 330e6adc1a
commit 57f8dbdbe9
1 changed files with 12 additions and 0 deletions

View File

@ -238,6 +238,12 @@ target_ulong helper_get_dr(CPUX86State *env, int reg)
}
}
if (env->dr[7] & DR7_GD) {
env->dr[7] &= ~DR7_GD;
env->dr[6] |= DR6_BD;
raise_exception_ra(env, EXCP01_DB, GETPC());
}
return env->dr[reg];
}
@ -251,6 +257,12 @@ void helper_set_dr(CPUX86State *env, int reg, target_ulong t0)
}
}
if (env->dr[7] & DR7_GD) {
env->dr[7] &= ~DR7_GD;
env->dr[6] |= DR6_BD;
raise_exception_ra(env, EXCP01_DB, GETPC());
}
if (reg < 4) {
if (hw_breakpoint_enabled(env->dr[7], reg)
&& hw_breakpoint_type(env->dr[7], reg) != DR7_TYPE_IO_RW) {