--- np2/i386c/ia32/instructions/ctrl_trans.c 2004/02/20 16:09:05 1.12 +++ np2/i386c/ia32/instructions/ctrl_trans.c 2008/01/25 17:49:46 1.21 @@ -1,4 +1,4 @@ -/* $Id: ctrl_trans.c,v 1.12 2004/02/20 16:09:05 monaka Exp $ */ +/* $Id: ctrl_trans.c,v 1.21 2008/01/25 17:49:46 monaka Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -12,8 +12,6 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -34,6 +32,10 @@ #include "ctrl_trans.h" +#if defined(ENABLE_TRAP) +#include "inttrap.h" +#endif + /* * JMP @@ -46,6 +48,7 @@ JMP_Jb(void) CPU_WORKCLOCK(7); GET_PCBYTESD(ip); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void @@ -56,6 +59,7 @@ JMP_Jw(void) CPU_WORKCLOCK(7); GET_PCWORDS(ip); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void @@ -66,6 +70,7 @@ JMP_Jd(void) CPU_WORKCLOCK(7); GET_PCDWORD(ip); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void @@ -197,7 +202,7 @@ void JO_Jb(void) { - if (!CPU_OV) { + if (CC_NO) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -208,7 +213,7 @@ void JO_Jw(void) { - if (!CPU_OV) { + if (CC_NO) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -219,7 +224,7 @@ void JO_Jd(void) { - if (!CPU_OV) { + if (CC_NO) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -231,7 +236,7 @@ void JNO_Jb(void) { - if (CPU_OV) { + if (CC_O) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -242,7 +247,7 @@ void JNO_Jw(void) { - if (CPU_OV) { + if (CC_O) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -253,7 +258,7 @@ void JNO_Jd(void) { - if (CPU_OV) { + if (CC_O) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -265,7 +270,7 @@ void JC_Jb(void) { - if (!(CPU_FLAGL & C_FLAG)) { + if (CC_NC) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -276,7 +281,7 @@ void JC_Jw(void) { - if (!(CPU_FLAGL & C_FLAG)) { + if (CC_NC) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -287,7 +292,7 @@ void JC_Jd(void) { - if (!(CPU_FLAGL & C_FLAG)) { + if (CC_NC) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -299,7 +304,7 @@ void JNC_Jb(void) { - if (CPU_FLAGL & C_FLAG) { + if (CC_C) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -309,7 +314,7 @@ void JNC_Jw(void) { - if (CPU_FLAGL & C_FLAG) { + if (CC_C) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -319,7 +324,7 @@ void JNC_Jd(void) { - if (CPU_FLAGL & C_FLAG) { + if (CC_C) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -331,7 +336,7 @@ void JZ_Jb(void) { - if (!(CPU_FLAGL & Z_FLAG)) { + if (CC_NZ) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -342,7 +347,7 @@ void JZ_Jw(void) { - if (!(CPU_FLAGL & Z_FLAG)) { + if (CC_NZ) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -353,7 +358,7 @@ void JZ_Jd(void) { - if (!(CPU_FLAGL & Z_FLAG)) { + if (CC_NZ) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -365,7 +370,7 @@ void JNZ_Jb(void) { - if (CPU_FLAGL & Z_FLAG) { + if (CC_Z) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -376,7 +381,7 @@ void JNZ_Jw(void) { - if (CPU_FLAGL & Z_FLAG) { + if (CC_Z) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -387,7 +392,7 @@ void JNZ_Jd(void) { - if (CPU_FLAGL & Z_FLAG) { + if (CC_Z) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -399,7 +404,7 @@ void JNA_Jb(void) { - if (!(CPU_FLAGL & (Z_FLAG | C_FLAG))) { + if (CC_A) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -410,7 +415,7 @@ void JNA_Jw(void) { - if (!(CPU_FLAGL & (Z_FLAG | C_FLAG))) { + if (CC_A) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -421,7 +426,7 @@ void JNA_Jd(void) { - if (!(CPU_FLAGL & (Z_FLAG | C_FLAG))) { + if (CC_A) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -433,7 +438,7 @@ void JA_Jb(void) { - if (CPU_FLAGL & (Z_FLAG | C_FLAG)) { + if (CC_NA) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -444,7 +449,7 @@ void JA_Jw(void) { - if (CPU_FLAGL & (Z_FLAG | C_FLAG)) { + if (CC_NA) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -455,7 +460,7 @@ void JA_Jd(void) { - if (CPU_FLAGL & (Z_FLAG | C_FLAG)) { + if (CC_NA) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -467,7 +472,7 @@ void JS_Jb(void) { - if (!(CPU_FLAGL & S_FLAG)) { + if (CC_NS) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -478,7 +483,7 @@ void JS_Jw(void) { - if (!(CPU_FLAGL & S_FLAG)) { + if (CC_NS) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -489,7 +494,7 @@ void JS_Jd(void) { - if (!(CPU_FLAGL & S_FLAG)) { + if (CC_NS) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -501,7 +506,7 @@ void JNS_Jb(void) { - if (CPU_FLAGL & S_FLAG) { + if (CC_S) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -512,7 +517,7 @@ void JNS_Jw(void) { - if (CPU_FLAGL & S_FLAG) { + if (CC_S) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -523,7 +528,7 @@ void JNS_Jd(void) { - if (CPU_FLAGL & S_FLAG) { + if (CC_S) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -535,7 +540,7 @@ void JP_Jb(void) { - if (!(CPU_FLAGL & P_FLAG)) { + if (CC_NP) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -546,7 +551,7 @@ void JP_Jw(void) { - if (!(CPU_FLAGL & P_FLAG)) { + if (CC_NP) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -557,7 +562,7 @@ void JP_Jd(void) { - if (!(CPU_FLAGL & P_FLAG)) { + if (CC_NP) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -569,7 +574,7 @@ void JNP_Jb(void) { - if (CPU_FLAGL & P_FLAG) { + if (CC_P) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -580,7 +585,7 @@ void JNP_Jw(void) { - if (CPU_FLAGL & P_FLAG) { + if (CC_P) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -591,7 +596,7 @@ void JNP_Jd(void) { - if (CPU_FLAGL & P_FLAG) { + if (CC_P) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -603,7 +608,7 @@ void JL_Jb(void) { - if ((!(CPU_FLAGL & S_FLAG)) == (!CPU_OV)) { + if (CC_NL) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -614,7 +619,7 @@ void JL_Jw(void) { - if ((!(CPU_FLAGL & S_FLAG)) == (!CPU_OV)) { + if (CC_NL) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -625,7 +630,7 @@ void JL_Jd(void) { - if ((!(CPU_FLAGL & S_FLAG)) == (!CPU_OV)) { + if (CC_NL) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -637,7 +642,7 @@ void JNL_Jb(void) { - if ((!(CPU_FLAGL & S_FLAG)) != (!CPU_OV)) { + if (CC_L) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -648,7 +653,7 @@ void JNL_Jw(void) { - if ((!(CPU_FLAGL & S_FLAG)) != (!CPU_OV)) { + if (CC_L) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -659,7 +664,7 @@ void JNL_Jd(void) { - if ((!(CPU_FLAGL & S_FLAG)) != (!CPU_OV)) { + if (CC_L) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -671,7 +676,7 @@ void JLE_Jb(void) { - if ((!(CPU_FLAGL & Z_FLAG)) && ((!(CPU_FLAGL & S_FLAG)) == (!CPU_OV))) { + if (CC_NLE) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -682,7 +687,7 @@ void JLE_Jw(void) { - if ((!(CPU_FLAGL & Z_FLAG)) && ((!(CPU_FLAGL & S_FLAG)) == (!CPU_OV))) { + if (CC_NLE) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -693,7 +698,7 @@ void JLE_Jd(void) { - if ((!(CPU_FLAGL & Z_FLAG)) && ((!(CPU_FLAGL & S_FLAG)) == (!CPU_OV))) { + if (CC_NLE) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -705,7 +710,7 @@ void JNLE_Jb(void) { - if ((CPU_FLAGL & Z_FLAG) || ((!(CPU_FLAGL & S_FLAG)) != (!CPU_OV))) { + if (CC_LE) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -716,7 +721,7 @@ void JNLE_Jw(void) { - if ((CPU_FLAGL & Z_FLAG) || ((!(CPU_FLAGL & S_FLAG)) != (!CPU_OV))) { + if (CC_LE) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -727,7 +732,7 @@ void JNLE_Jd(void) { - if ((CPU_FLAGL & Z_FLAG) || ((!(CPU_FLAGL & S_FLAG)) != (!CPU_OV))) { + if (CC_LE) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -835,6 +840,7 @@ CALL_Aw(void) GET_PCWORDS(ip); PUSH0_16(CPU_IP); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void @@ -846,6 +852,7 @@ CALL_Ad(void) GET_PCDWORD(ip); PUSH0_32(CPU_EIP); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void @@ -1142,8 +1149,8 @@ IRET(void) { UINT32 new_ip; UINT32 new_flags; - UINT32 mask; UINT32 new_cs; + UINT32 mask; if (!CPU_STAT_PM) { /* Real mode */ @@ -1159,6 +1166,7 @@ IRET(void) POP0_32(new_flags); mask |= RF_FLAG; } + set_eflags(new_flags, mask); CPU_SET_SEGREG(CPU_CS_INDEX, (UINT16)new_cs); @@ -1167,6 +1175,11 @@ 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(); } @@ -1209,6 +1222,9 @@ INT_Ib(void) CPU_WORKCLOCK(37); if (!CPU_STAT_PM || !CPU_STAT_VM86 || (CPU_STAT_IOPL == CPU_IOPL3)) { GET_PCBYTE(vect); +#if defined(ENABLE_TRAP) + softinttrap(CPU_CS, CPU_EIP - 2, vect); +#endif INTERRUPT(vect, -1, 0, 0); return; } @@ -1285,7 +1301,7 @@ ENTER16_IwIb(void) } else { sp = CPU_ESP; } - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), sp, size); + STACK_PUSH_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), sp, size); } PUSH0_16(CPU_BP); @@ -1359,7 +1375,7 @@ ENTER32_IwIb(void) } else { sp = CPU_SP; } - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), sp, size); + STACK_PUSH_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), sp, size); } PUSH0_32(CPU_EBP); @@ -1416,10 +1432,16 @@ void LEAVE(void) { UINT32 sp, bp; + UINT s; CPU_WORKCLOCK(4); if (CPU_STAT_PM) { + if (!CPU_INST_OP32) { + s = 2; + } else { + s = 4; + } if (!CPU_STAT_SS32) { sp = CPU_SP; bp = CPU_BP; @@ -1427,7 +1449,7 @@ LEAVE(void) sp = CPU_ESP; bp = CPU_EBP; } - CHECK_STACK_POP(&CPU_STAT_SREG(CPU_SS_INDEX), sp, (bp-sp) + 2); + STACK_POP_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), sp, (bp - sp) + s); } if (!CPU_STAT_SS32) {