DR6 single step exception status bit, by Juergen Keil.
authorths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>
Tue, 26 Jun 2007 08:35:18 +0000 (08:35 +0000)
committerths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>
Tue, 26 Jun 2007 08:35:18 +0000 (08:35 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3024 c046a42c-6fe2-441c-8c8c-71466251a162

target-i386/exec.h
target-i386/helper.c
target-i386/op.c
target-i386/translate.c

index f6d05e0..f48462a 100644 (file)
@@ -190,6 +190,7 @@ void helper_divq_EAX_T0(void);
 void helper_idivq_EAX_T0(void);
 void helper_bswapq_T0(void);
 void helper_cmpxchg8b(void);
+void helper_single_step(void);
 void helper_cpuid(void);
 void helper_enter_level(int level, int data32);
 void helper_enter64_level(int level, int data64);
index 951fdc5..3c051b9 100644 (file)
@@ -1622,6 +1622,12 @@ void helper_cmpxchg8b(void)
     CC_SRC = eflags;
 }
 
+void helper_single_step()
+{
+    env->dr[6] |= 0x4000;
+    raise_exception(EXCP01_SSTP);
+}
+
 void helper_cpuid(void)
 {
     uint32_t index;
index a8cfce2..ea8aec6 100644 (file)
@@ -730,6 +730,11 @@ void OPPROTO op_cmpxchg8b(void)
     helper_cmpxchg8b();
 }
 
+void OPPROTO op_single_step(void)
+{
+    helper_single_step();
+}
+
 void OPPROTO op_movl_T0_0(void)
 {
     T0 = 0;
index 393db0d..15bfef5 100644 (file)
@@ -2277,7 +2277,7 @@ static void gen_eob(DisasContext *s)
     if (s->singlestep_enabled) {
         gen_op_debug();
     } else if (s->tf) {
-        gen_op_raise_exception(EXCP01_SSTP);
+       gen_op_single_step();
     } else {
         gen_op_movl_T0_0();
         gen_op_exit_tb();