From bf4eca4e2ee44ca5d05e3acaf0499f662af9f9f5 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 19 Feb 2011 10:08:02 +0000 Subject: [PATCH] i386 - Fix for exceptions that require the return address to point to the instruction at fault. [Barry Rodewald] --- src/emu/cpu/i386/i386.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/emu/cpu/i386/i386.c b/src/emu/cpu/i386/i386.c index 44c44fee538..28e6c222003 100644 --- a/src/emu/cpu/i386/i386.c +++ b/src/emu/cpu/i386/i386.c @@ -295,7 +295,10 @@ static void i386_trap(i386_state *cpustate,int irq, int irq_gate) /* 16-bit */ PUSH16(cpustate, get_flags(cpustate) & 0xffff ); PUSH16(cpustate, cpustate->sreg[CS].selector ); - PUSH16(cpustate, cpustate->eip ); + if(irq == 3 || irq == 4 || irq == 9 || irq_gate == 1) + PUSH16(cpustate, cpustate->eip ); + else + PUSH16(cpustate, cpustate->prev_eip ); cpustate->sreg[CS].selector = READ16(cpustate, cpustate->idtr.base + entry + 2 ); cpustate->eip = READ16(cpustate, cpustate->idtr.base + entry ); @@ -325,13 +328,19 @@ static void i386_trap(i386_state *cpustate,int irq, int irq_gate) { PUSH16(cpustate, get_flags(cpustate) & 0xffff ); PUSH16(cpustate, cpustate->sreg[CS].selector ); - PUSH16(cpustate, cpustate->eip ); + if(irq == 3 || irq == 4 || irq == 9 || irq_gate == 1) + PUSH16(cpustate, cpustate->eip ); + else + PUSH16(cpustate, cpustate->prev_eip ); } else { PUSH32(cpustate, get_flags(cpustate) & 0x00fcffff ); PUSH32(cpustate, cpustate->sreg[CS].selector ); - PUSH32(cpustate, cpustate->eip ); + if(irq == 3 || irq == 4 || irq == 9 || irq_gate == 1) + PUSH32(cpustate, cpustate->eip ); + else + PUSH32(cpustate, cpustate->prev_eip ); } cpustate->sreg[CS].selector = segment;