summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-05-08 15:39:48 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-05-08 15:39:48 +0000
commit504e56ebdca53bf8e8d379aa994e90a2e3b0d564 (patch)
tree7d6d8cd72d6eedc3e16574a97ae83bbd758058f4
parent455b761956a656b378eab3dc1612268decf93fe3 (diff)
downloadqemu-504e56ebdca53bf8e8d379aa994e90a2e3b0d564.tar.gz
more accurate GPF generation
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@128 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--op-i386.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/op-i386.c b/op-i386.c
index ede63eabdc..10dfd8472a 100644
--- 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);