--- np2/i386c/ia32/ctrlxfer.c 2011/12/29 13:32:12 1.24 +++ np2/i386c/ia32/ctrlxfer.c 2012/03/02 03:35:05 1.26 @@ -973,7 +973,7 @@ RETfar_pm(UINT nbytes) && (CPU_STAT_CPL > sdp->dpl)) { /* current segment descriptor is invalid */ CPU_REGS_SREG(i) = 0; - segdesc_clear(sdp); + memset(sdp, 0, sizeof(*sdp)); continue; } @@ -982,7 +982,7 @@ RETfar_pm(UINT nbytes) if (rv < 0) { /* segment register is invalid */ CPU_REGS_SREG(i) = 0; - segdesc_clear(sdp); + memset(sdp, 0, sizeof(*sdp)); continue; } @@ -999,7 +999,7 @@ RETfar_pm(UINT nbytes) && (CPU_STAT_CPL > temp_sel.desc.dpl))) { /* segment descriptor is invalid */ CPU_REGS_SREG(i) = 0; - segdesc_clear(sdp); + memset(sdp, 0, sizeof(*sdp)); } } } @@ -1334,7 +1334,7 @@ IRET_pm_protected_mode_return_outer_priv && (sdp->dpl < CPU_STAT_CPL)) { /* segment register is invalid */ CPU_REGS_SREG(i) = 0; - segdesc_clear(sdp); + memset(sdp, 0, sizeof(*sdp)); } } } @@ -1364,10 +1364,6 @@ IRET_pm_return_to_vm86(UINT16 new_cs, UI } SS_POP_CHECK(sp, 36); - if (new_ip > 0xffff) { - EXCEPTION(GP_EXCEPTION, 0); - } - new_sp = cpu_vmemoryread_d(CPU_SS_INDEX, sp + 12); segsel[CPU_SS_INDEX] = cpu_vmemoryread_w(CPU_SS_INDEX, sp + 16); segsel[CPU_ES_INDEX] = cpu_vmemoryread_w(CPU_SS_INDEX, sp + 20); @@ -1381,7 +1377,7 @@ IRET_pm_return_to_vm86(UINT16 new_cs, UI } CPU_ESP = new_sp; - CPU_EIP = new_ip; + CPU_EIP = new_ip & 0xffff; /* to VM86 mode */ set_eflags(new_flags, IOPL_FLAG|I_FLAG|VM_FLAG|RF_FLAG);