--- np2/i386c/ia32/instructions/ctrl_trans.c 2008/03/22 04:03:08 1.24 +++ np2/i386c/ia32/instructions/ctrl_trans.c 2012/01/08 11:36:06 1.28 @@ -1,5 +1,3 @@ -/* $Id: ctrl_trans.c,v 1.24 2008/03/22 04:03:08 monaka Exp $ */ - /* * Copyright (c) 2002-2003 NONAKA Kimihiro * All rights reserved. @@ -61,7 +59,7 @@ JMP_Jd(void) JMPNEAR32(7); } -void +void CPUCALL JMP_Ew(UINT32 op) { UINT32 madr; @@ -81,7 +79,7 @@ JMP_Ew(UINT32 op) CPU_EIP = new_ip; } -void +void CPUCALL JMP_Ed(UINT32 op) { UINT32 madr; @@ -153,7 +151,7 @@ JMP32_Ap(void) } } -void +void CPUCALL JMP16_Ep(UINT32 op) { descriptor_t sd; @@ -185,7 +183,7 @@ JMP16_Ep(UINT32 op) EXCEPTION(UD_EXCEPTION, 0); } -void +void CPUCALL JMP32_Ep(UINT32 op) { descriptor_t sd; @@ -867,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) { @@ -874,6 +873,7 @@ CALL_Aw(void) } PUSH0_16(CPU_IP); CPU_EIP = new_ip; + CPU_CLEAR_PREV_ESP(); } void @@ -883,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) { @@ -890,14 +891,16 @@ CALL_Ad(void) } PUSH0_32(CPU_EIP); CPU_EIP = new_ip; + CPU_CLEAR_PREV_ESP(); } -void +void CPUCALL CALL_Ew(UINT32 op) { UINT32 madr; UINT16 new_ip; + CPU_SET_PREV_ESP(); if (op >= 0xc0) { CPU_WORKCLOCK(7); new_ip = *(reg16_b20[op]); @@ -911,14 +914,16 @@ CALL_Ew(UINT32 op) } PUSH0_16(CPU_IP); CPU_EIP = new_ip; + CPU_CLEAR_PREV_ESP(); } -void +void CPUCALL CALL_Ed(UINT32 op) { UINT32 madr; UINT32 new_ip; + CPU_SET_PREV_ESP(); if (op >= 0xc0) { CPU_WORKCLOCK(7); new_ip = *(reg32_b20[op]); @@ -932,6 +937,7 @@ CALL_Ed(UINT32 op) } PUSH0_32(CPU_EIP); CPU_EIP = new_ip; + CPU_CLEAR_PREV_ESP(); } void @@ -947,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) { @@ -958,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); @@ -977,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) { @@ -988,13 +997,14 @@ 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); } } -void +void CPUCALL CALL16_Ep(UINT32 op) { descriptor_t sd; @@ -1010,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) { @@ -1021,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); @@ -1030,7 +1042,7 @@ CALL16_Ep(UINT32 op) EXCEPTION(UD_EXCEPTION, 0); } -void +void CPUCALL CALL32_Ep(UINT32 op) { descriptor_t sd; @@ -1046,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) { @@ -1057,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); @@ -1074,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); @@ -1089,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); @@ -1105,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) { @@ -1127,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) { @@ -1318,11 +1332,6 @@ IRET(void) /* Protected mode */ IRET_pm(); } -#if defined(IA32_SUPPORT_DEBUG_REGISTER) - if (CPU_EFLAG & RF_FLAG) { - CPU_STAT_BP_EVENT |= CPU_STAT_BP_EVENT_RF; - } -#endif IRQCHECKTERM(); } @@ -1429,6 +1438,8 @@ ENTER16_IwIb(void) UINT16 dimsize; UINT8 level; + CPU_SET_PREV_ESP(); + GET_PCWORD(dimsize); GET_PCBYTE(level); level &= 0x1f; @@ -1490,6 +1501,7 @@ ENTER16_IwIb(void) } } } + CPU_CLEAR_PREV_ESP(); } void @@ -1501,6 +1513,8 @@ ENTER32_IwIb(void) UINT16 dimsize; UINT8 level; + CPU_SET_PREV_ESP(); + GET_PCWORD(dimsize); GET_PCBYTE(level); level &= 0x1f; @@ -1562,6 +1576,7 @@ ENTER32_IwIb(void) } } } + CPU_CLEAR_PREV_ESP(); } void @@ -1571,6 +1586,7 @@ LEAVE(void) CPU_WORKCLOCK(4); + CPU_SET_PREV_ESP(); /* check stack room size */ if (!CPU_INST_OP32) { s = 2; @@ -1589,4 +1605,5 @@ LEAVE(void) } else { POP0_32(CPU_EBP); } + CPU_CLEAR_PREV_ESP(); }