--- np2/i386c/ia32/instructions/ctrl_trans.c 2008/03/22 04:03:08 1.24 +++ np2/i386c/ia32/instructions/ctrl_trans.c 2012/01/31 22:06:24 1.30 @@ -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,7 +953,7 @@ CALL16_Ap(void) GET_PCWORD(new_cs); if (!CPU_STAT_PM || CPU_STAT_VM86) { /* Real mode or VM86 mode */ - SS_PUSH_CHECK(CPU_STAT_SS32 ? CPU_ESP : CPU_SP, 4); + CPU_SET_PREV_ESP(); load_segreg(CPU_CS_INDEX, new_cs, &sreg, &sd, GP_EXCEPTION); if (new_ip > sd.u.seg.limit) { EXCEPTION(GP_EXCEPTION, 0); @@ -958,6 +964,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,7 +984,7 @@ CALL32_Ap(void) GET_PCWORD(new_cs); if (!CPU_STAT_PM || CPU_STAT_VM86) { /* Real mode or VM86 mode */ - SS_PUSH_CHECK(CPU_STAT_SS32 ? CPU_ESP : CPU_SP, 8); + CPU_SET_PREV_ESP(); load_segreg(CPU_CS_INDEX, new_cs, &sreg, &sd, GP_EXCEPTION); if (new_ip > sd.u.seg.limit) { EXCEPTION(GP_EXCEPTION, 0); @@ -988,13 +995,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,7 +1018,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 */ - SS_PUSH_CHECK(CPU_STAT_SS32 ? CPU_ESP : CPU_SP, 4); + CPU_SET_PREV_ESP(); load_segreg(CPU_CS_INDEX, new_cs, &sreg, &sd, GP_EXCEPTION); if (new_ip > sd.u.seg.limit) { EXCEPTION(GP_EXCEPTION, 0); @@ -1021,6 +1029,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 +1039,7 @@ CALL16_Ep(UINT32 op) EXCEPTION(UD_EXCEPTION, 0); } -void +void CPUCALL CALL32_Ep(UINT32 op) { descriptor_t sd; @@ -1046,7 +1055,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 */ - SS_PUSH_CHECK(CPU_STAT_SS32 ? CPU_ESP : CPU_SP, 8); + CPU_SET_PREV_ESP(); load_segreg(CPU_CS_INDEX, new_cs, &sreg, &sd, GP_EXCEPTION); if (new_ip > sd.u.seg.limit) { EXCEPTION(GP_EXCEPTION, 0); @@ -1057,6 +1066,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 +1084,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 +1099,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 +1115,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 +1137,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 +1328,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(); } @@ -1424,24 +1429,16 @@ void ENTER16_IwIb(void) { UINT32 sp, bp; - UINT32 size; UINT32 val; UINT16 dimsize; + UINT16 new_bp; UINT8 level; GET_PCWORD(dimsize); GET_PCBYTE(level); level &= 0x1f; - /* check stack room size */ - size = dimsize + (level + 1) * 2; - if (!CPU_STAT_SS32) { - sp = CPU_SP; - } else { - sp = CPU_ESP; - } - SS_PUSH_CHECK(sp, size); - + CPU_SET_PREV_ESP(); PUSH0_16(CPU_BP); if (level == 0) { /* enter level=0 */ CPU_WORKCLOCK(11); @@ -1467,36 +1464,39 @@ ENTER16_IwIb(void) CPU_WORKCLOCK(12 + level * 4); if (!CPU_STAT_SS32) { bp = CPU_BP; - CPU_BP = CPU_SP; + new_bp = CPU_SP; while (level--) { bp -= 2; CPU_SP -= 2; val = cpu_vmemoryread_w(CPU_SS_INDEX, bp); cpu_vmemorywrite_w(CPU_SS_INDEX, CPU_SP, (UINT16)val); } - REGPUSH0(CPU_BP); + REGPUSH0(new_bp); + CPU_BP = new_bp; CPU_SP -= dimsize; } else { bp = CPU_EBP; - CPU_BP = CPU_SP; + new_bp = CPU_SP; while (level--) { bp -= 2; CPU_ESP -= 2; val = cpu_vmemoryread_w(CPU_SS_INDEX, bp); cpu_vmemorywrite_w(CPU_SS_INDEX, CPU_ESP, (UINT16)val); } - REGPUSH0_16_32(CPU_BP); + REGPUSH0_16_32(new_bp); + CPU_BP = new_bp; CPU_ESP -= dimsize; } } } + CPU_CLEAR_PREV_ESP(); } void ENTER32_IwIb(void) { UINT32 sp, bp; - UINT32 size; + UINT32 new_bp; UINT32 val; UINT16 dimsize; UINT8 level; @@ -1505,15 +1505,7 @@ ENTER32_IwIb(void) GET_PCBYTE(level); level &= 0x1f; - /* check stack room size */ - size = dimsize + (level + 1) * 4; - if (CPU_STAT_SS32) { - sp = CPU_ESP; - } else { - sp = CPU_SP; - } - SS_PUSH_CHECK(sp, size); - + CPU_SET_PREV_ESP(); PUSH0_32(CPU_EBP); if (level == 0) { /* enter level=0 */ CPU_WORKCLOCK(11); @@ -1539,54 +1531,50 @@ ENTER32_IwIb(void) CPU_WORKCLOCK(12 + level * 4); if (CPU_STAT_SS32) { bp = CPU_EBP; - CPU_EBP = CPU_ESP; + new_bp = CPU_ESP; while (level--) { bp -= 4; CPU_ESP -= 4; val = cpu_vmemoryread_d(CPU_SS_INDEX, bp); cpu_vmemorywrite_d(CPU_SS_INDEX, CPU_ESP, val); } - REGPUSH0_32(CPU_EBP); + REGPUSH0_32(new_bp); + CPU_EBP = new_bp; CPU_ESP -= dimsize; } else { bp = CPU_BP; - CPU_EBP = CPU_ESP; + new_bp = CPU_ESP; while (level--) { bp -= 4; CPU_SP -= 4; val = cpu_vmemoryread_d(CPU_SS_INDEX, bp); cpu_vmemorywrite_d(CPU_SS_INDEX, CPU_SP, val); } - REGPUSH0_32_16(CPU_EBP); + REGPUSH0_32_16(new_bp); + CPU_EBP = new_bp; CPU_SP -= dimsize; } } } + CPU_CLEAR_PREV_ESP(); } void LEAVE(void) { - UINT s; CPU_WORKCLOCK(4); - /* check stack room size */ - if (!CPU_INST_OP32) { - s = 2; - } else { - s = 4; - } + CPU_SET_PREV_ESP(); if (!CPU_STAT_SS32) { - SS_POP_CHECK(CPU_SP, (CPU_BP - CPU_SP) + s); CPU_SP = CPU_BP; } else { - SS_POP_CHECK(CPU_ESP, (CPU_EBP - CPU_ESP) + s); CPU_ESP = CPU_EBP; } if (!CPU_INST_OP32) { - REGPOP0(CPU_BP); + POP0_16(CPU_BP); } else { POP0_32(CPU_EBP); } + CPU_CLEAR_PREV_ESP(); }