aboutsummaryrefslogtreecommitdiff
path: root/target/i386/tcg/sysemu
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2024-05-29 13:18:56 +0200
committerPaolo Bonzini <pbonzini@redhat.com>2024-06-08 10:33:38 +0200
commit57f8dbdbe94a502301f51809e8b282b02df43370 (patch)
treea02f1bc3f03e72d5d12f4669fe200a0955ef7922 /target/i386/tcg/sysemu
parent330e6adc1acd2a235a96b502b3dd15ba6e77c228 (diff)
downloadqemu-57f8dbdbe94a502301f51809e8b282b02df43370.zip
qemu-57f8dbdbe94a502301f51809e8b282b02df43370.tar.gz
qemu-57f8dbdbe94a502301f51809e8b282b02df43370.tar.bz2
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>
Diffstat (limited to 'target/i386/tcg/sysemu')
-rw-r--r--target/i386/tcg/sysemu/bpt_helper.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/target/i386/tcg/sysemu/bpt_helper.c b/target/i386/tcg/sysemu/bpt_helper.c
index 4d96a48..c1d5fce 100644
--- a/target/i386/tcg/sysemu/bpt_helper.c
+++ b/target/i386/tcg/sysemu/bpt_helper.c
@@ -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) {