--- np2/i386c/ia32/instructions/ctrl_trans.c 2011/01/15 17:17:23 1.25 +++ np2/i386c/ia32/instructions/ctrl_trans.c 2011/12/20 01:17:30 1.26 @@ -865,6 +865,7 @@ CALL_Aw(void) SINT16 dest; CPU_WORKCLOCK(7); + CPU_SET_PREV_ESP(); GET_PCWORDS(dest); new_ip = CPU_EIP + dest; if (new_ip > CPU_STAT_CS_LIMIT) { @@ -872,6 +873,7 @@ CALL_Aw(void) } PUSH0_16(CPU_IP); CPU_EIP = new_ip; + CPU_CLEAR_PREV_ESP(); } void @@ -881,6 +883,7 @@ CALL_Ad(void) UINT32 dest; CPU_WORKCLOCK(7); + CPU_SET_PREV_ESP(); GET_PCDWORD(dest); new_ip = CPU_EIP + dest; if (new_ip > CPU_STAT_CS_LIMIT) { @@ -888,6 +891,7 @@ CALL_Ad(void) } PUSH0_32(CPU_EIP); CPU_EIP = new_ip; + CPU_CLEAR_PREV_ESP(); } void @@ -896,6 +900,7 @@ CALL_Ew(UINT32 op) UINT32 madr; UINT16 new_ip; + CPU_SET_PREV_ESP(); if (op >= 0xc0) { CPU_WORKCLOCK(7); new_ip = *(reg16_b20[op]); @@ -909,6 +914,7 @@ CALL_Ew(UINT32 op) } PUSH0_16(CPU_IP); CPU_EIP = new_ip; + CPU_CLEAR_PREV_ESP(); } void @@ -917,6 +923,7 @@ CALL_Ed(UINT32 op) UINT32 madr; UINT32 new_ip; + CPU_SET_PREV_ESP(); if (op >= 0xc0) { CPU_WORKCLOCK(7); new_ip = *(reg32_b20[op]); @@ -930,6 +937,7 @@ CALL_Ed(UINT32 op) } PUSH0_32(CPU_EIP); CPU_EIP = new_ip; + CPU_CLEAR_PREV_ESP(); } void @@ -945,6 +953,7 @@ CALL16_Ap(void) GET_PCWORD(new_cs); if (!CPU_STAT_PM || CPU_STAT_VM86) { /* Real mode or VM86 mode */ + CPU_SET_PREV_ESP(); SS_PUSH_CHECK(CPU_STAT_SS32 ? CPU_ESP : CPU_SP, 4); load_segreg(CPU_CS_INDEX, new_cs, &sreg, &sd, GP_EXCEPTION); if (new_ip > sd.u.seg.limit) { @@ -956,6 +965,7 @@ CALL16_Ap(void) LOAD_SEGREG(CPU_CS_INDEX, new_cs); CPU_EIP = new_ip; + CPU_CLEAR_PREV_ESP(); } else { /* Protected mode */ CALLfar_pm(new_cs, new_ip); @@ -975,6 +985,7 @@ CALL32_Ap(void) GET_PCWORD(new_cs); if (!CPU_STAT_PM || CPU_STAT_VM86) { /* Real mode or VM86 mode */ + CPU_SET_PREV_ESP(); SS_PUSH_CHECK(CPU_STAT_SS32 ? CPU_ESP : CPU_SP, 8); load_segreg(CPU_CS_INDEX, new_cs, &sreg, &sd, GP_EXCEPTION); if (new_ip > sd.u.seg.limit) { @@ -986,6 +997,7 @@ CALL32_Ap(void) LOAD_SEGREG(CPU_CS_INDEX, new_cs); CPU_EIP = new_ip; + CPU_CLEAR_PREV_ESP(); } else { /* Protected mode */ CALLfar_pm(new_cs, new_ip); @@ -1008,6 +1020,7 @@ CALL16_Ep(UINT32 op) new_cs = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr + 2); if (!CPU_STAT_PM || CPU_STAT_VM86) { /* Real mode or VM86 mode */ + CPU_SET_PREV_ESP(); SS_PUSH_CHECK(CPU_STAT_SS32 ? CPU_ESP : CPU_SP, 4); load_segreg(CPU_CS_INDEX, new_cs, &sreg, &sd, GP_EXCEPTION); if (new_ip > sd.u.seg.limit) { @@ -1019,6 +1032,7 @@ CALL16_Ep(UINT32 op) LOAD_SEGREG(CPU_CS_INDEX, new_cs); CPU_EIP = new_ip; + CPU_CLEAR_PREV_ESP(); } else { /* Protected mode */ CALLfar_pm(new_cs, new_ip); @@ -1044,6 +1058,7 @@ CALL32_Ep(UINT32 op) new_cs = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr + 4); if (!CPU_STAT_PM || CPU_STAT_VM86) { /* Real mode or VM86 mode */ + CPU_SET_PREV_ESP(); SS_PUSH_CHECK(CPU_STAT_SS32 ? CPU_ESP : CPU_SP, 8); load_segreg(CPU_CS_INDEX, new_cs, &sreg, &sd, GP_EXCEPTION); if (new_ip > sd.u.seg.limit) { @@ -1055,6 +1070,7 @@ CALL32_Ep(UINT32 op) LOAD_SEGREG(CPU_CS_INDEX, new_cs); CPU_EIP = new_ip; + CPU_CLEAR_PREV_ESP(); } else { /* Protected mode */ CALLfar_pm(new_cs, new_ip); @@ -1072,8 +1088,8 @@ RETnear16(void) { UINT16 new_ip; - CPU_SET_PREV_ESP(); CPU_WORKCLOCK(11); + CPU_SET_PREV_ESP(); POP0_16(new_ip); if (new_ip > CPU_STAT_CS_LIMIT) { EXCEPTION(GP_EXCEPTION, 0); @@ -1087,8 +1103,8 @@ RETnear32(void) { UINT32 new_ip; - CPU_SET_PREV_ESP(); CPU_WORKCLOCK(11); + CPU_SET_PREV_ESP(); POP0_32(new_ip); if (new_ip > CPU_STAT_CS_LIMIT) { EXCEPTION(GP_EXCEPTION, 0); @@ -1103,8 +1119,8 @@ RETnear16_Iw(void) UINT16 new_ip; UINT16 size; - CPU_SET_PREV_ESP(); CPU_WORKCLOCK(11); + CPU_SET_PREV_ESP(); GET_PCWORD(size); POP0_16(new_ip); if (new_ip > CPU_STAT_CS_LIMIT) { @@ -1125,8 +1141,8 @@ RETnear32_Iw(void) UINT32 new_ip; UINT16 size; - CPU_SET_PREV_ESP(); CPU_WORKCLOCK(11); + CPU_SET_PREV_ESP(); GET_PCWORD(size); POP0_32(new_ip); if (new_ip > CPU_STAT_CS_LIMIT) { @@ -1427,6 +1443,8 @@ ENTER16_IwIb(void) UINT16 dimsize; UINT8 level; + CPU_SET_PREV_ESP(); + GET_PCWORD(dimsize); GET_PCBYTE(level); level &= 0x1f; @@ -1488,6 +1506,7 @@ ENTER16_IwIb(void) } } } + CPU_CLEAR_PREV_ESP(); } void @@ -1499,6 +1518,8 @@ ENTER32_IwIb(void) UINT16 dimsize; UINT8 level; + CPU_SET_PREV_ESP(); + GET_PCWORD(dimsize); GET_PCBYTE(level); level &= 0x1f; @@ -1560,6 +1581,7 @@ ENTER32_IwIb(void) } } } + CPU_CLEAR_PREV_ESP(); } void @@ -1569,6 +1591,7 @@ LEAVE(void) CPU_WORKCLOCK(4); + CPU_SET_PREV_ESP(); /* check stack room size */ if (!CPU_INST_OP32) { s = 2; @@ -1587,4 +1610,5 @@ LEAVE(void) } else { POP0_32(CPU_EBP); } + CPU_CLEAR_PREV_ESP(); }