diff options
author | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2003-05-08 15:39:48 +0000 |
---|---|---|
committer | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2003-05-08 15:39:48 +0000 |
commit | 504e56ebdca53bf8e8d379aa994e90a2e3b0d564 (patch) | |
tree | 7d6d8cd72d6eedc3e16574a97ae83bbd758058f4 /op-i386.c | |
parent | 455b761956a656b378eab3dc1612268decf93fe3 (diff) |
more accurate GPF generation
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@128 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'op-i386.c')
-rw-r--r-- | op-i386.c | 21 |
1 files changed, 14 insertions, 7 deletions
@@ -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); |