OSDN Git Service

more accurate GPF generation
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Thu, 8 May 2003 15:39:48 +0000 (15:39 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Thu, 8 May 2003 15:39:48 +0000 (15:39 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@128 c046a42c-6fe2-441c-8c8c-71466251a162

op-i386.c

index ede63ea..10dfd84 100644 (file)
--- a/op-i386.c
+++ b/op-i386.c
@@ -616,8 +616,10 @@ void OPPROTO op_jmp_im(void)
 
 void OPPROTO op_int_im(void)
 {
-    EIP = PARAM1;
-    raise_exception(EXCP0D_GPF);
+    int intno;
+    intno = PARAM1;
+    EIP = PARAM2;
+    raise_exception_err(EXCP0D_GPF, intno * 8 + 2);
 }
 
 void OPPROTO op_int3(void)
@@ -633,18 +635,23 @@ void OPPROTO op_into(void)
     if (eflags & CC_O) {
         raise_exception(EXCP04_INTO);
     }
+    FORCE_RET();
 }
 
-/* XXX: add IOPL/CPL tests */
-void OPPROTO op_cli(void)
+void OPPROTO op_gpf(void)
 {
+    EIP = PARAM1;
     raise_exception(EXCP0D_GPF);
 }
 
-/* XXX: add IOPL/CPL tests */
+void OPPROTO op_cli(void)
+{
+    env->eflags &= ~IF_MASK;
+}
+
 void OPPROTO op_sti(void)
 {
-    raise_exception(EXCP0D_GPF);
+    env->eflags |= IF_MASK;
 }
 
 /* vm86plus instructions */
@@ -1097,7 +1104,7 @@ void load_seg(int seg_reg, int selector)
             dt = &env->gdt;
         index = selector & ~7;
         if ((index + 7) > dt->limit)
-            raise_exception(EXCP0D_GPF);
+            raise_exception_err(EXCP0D_GPF, selector);
         ptr = dt->base + index;
         e1 = ldl(ptr);
         e2 = ldl(ptr + 4);