diff --git a/src/cpu/core_full/load.h b/src/cpu/core_full/load.h index ec63d572..a0c1ca47 100644 --- a/src/cpu/core_full/load.h +++ b/src/cpu/core_full/load.h @@ -6,6 +6,9 @@ switch (inst.code.load) { case L_POPdRM: inst_op1_d = Pop_32(); goto case_L_MODRM; + case L_MODRM_NVM: + if ((reg_flags & FLAG_VM) || !cpu.pmode) goto illegalopcode; + goto case_L_MODRM; case_L_MODRM: case L_MODRM: inst.rm=Fetchb(); diff --git a/src/cpu/core_full/op.h b/src/cpu/core_full/op.h index ed407a3a..67ae2c9a 100644 --- a/src/cpu/core_full/op.h +++ b/src/cpu/core_full/op.h @@ -459,7 +459,6 @@ switch (inst.code.op) { break; case O_LAR: { - if ((reg_flags & FLAG_VM) || (!cpu.pmode)) goto illegalopcode; Bitu ar=inst_op2_d; CPU_LAR(inst_op1_w,ar); inst_op1_d=(Bit32u)ar; @@ -467,7 +466,6 @@ switch (inst.code.op) { break; case O_LSL: { - if ((reg_flags & FLAG_VM) || (!cpu.pmode)) goto illegalopcode; Bitu limit=inst_op2_d; CPU_LSL(inst_op1_w,limit); inst_op1_d=(Bit32u)limit; @@ -475,7 +473,6 @@ switch (inst.code.op) { break; case O_ARPL: { - if ((reg_flags & FLAG_VM) || !cpu.pmode) goto illegalopcode; Bitu new_sel=inst_op1_d; CPU_ARPL(new_sel,inst_op2_d); inst_op1_d=(Bit32u)new_sel; diff --git a/src/cpu/core_full/optable.h b/src/cpu/core_full/optable.h index 93c51057..fcdb1508 100644 --- a/src/cpu/core_full/optable.h +++ b/src/cpu/core_full/optable.h @@ -69,7 +69,7 @@ static OpCode OpCodeTable[1024]={ /* 0x60 - 0x67 */ {D_PUSHAw ,0 ,0 ,0 },{D_POPAw ,0 ,0 ,0 }, -{L_MODRM ,O_BOUNDw ,0 ,M_Gw },{L_MODRM ,O_ARPL ,S_Ew ,M_EwGw }, +{L_MODRM ,O_BOUNDw ,0 ,M_Gw },{L_MODRM_NVM ,O_ARPL ,S_Ew ,M_EwGw }, {L_PRESEG ,0 ,0 ,fs },{L_PRESEG ,0 ,0 ,gs }, {L_PREOP ,0 ,0 ,0 },{L_PREADD ,0 ,0 ,0 }, /* 0x68 - 0x6f */ @@ -183,7 +183,7 @@ static OpCode OpCodeTable[1024]={ /* 0x100 - 0x107 */ {L_MODRM ,O_GRP6w ,S_Ew ,M_Ew },{L_MODRM ,O_GRP7w ,S_Ew ,M_Ew }, -{L_MODRM ,O_LAR ,S_Gw ,M_EwGw },{L_MODRM ,O_LSL ,S_Gw ,M_EwGw }, +{L_MODRM_NVM ,O_LAR ,S_Gw ,M_EwGw },{L_MODRM_NVM ,O_LSL ,S_Gw ,M_EwGw }, {0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 }, {D_CLTS ,0 ,0 ,0 },{0 ,0 ,0 ,0 }, /* 0x108 - 0x10f */ @@ -539,7 +539,7 @@ static OpCode OpCodeTable[1024]={ /* 0x300 - 0x307 */ {L_MODRM ,O_GRP6d ,S_Ew ,M_Ew },{L_MODRM ,O_GRP7d ,S_Ew ,M_Ew }, -{L_MODRM ,O_LAR ,S_Gd ,M_EdGd },{L_MODRM ,O_LSL ,S_Gd ,M_EdGd }, +{L_MODRM_NVM ,O_LAR ,S_Gd ,M_EdGd },{L_MODRM_NVM ,O_LSL ,S_Gd ,M_EdGd }, {0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 }, {D_CLTS ,0 ,0 ,0 },{0 ,0 ,0 ,0 }, /* 0x308 - 0x30f */ diff --git a/src/cpu/core_full/support.h b/src/cpu/core_full/support.h index f7f54b00..cde08ebc 100644 --- a/src/cpu/core_full/support.h +++ b/src/cpu/core_full/support.h @@ -2,7 +2,7 @@ enum { L_N=0, L_SKIP, /* Grouped ones using MOD/RM */ - L_MODRM,L_POPwRM,L_POPdRM, + L_MODRM,L_MODRM_NVM,L_POPwRM,L_POPdRM, L_Ib,L_Iw,L_Id, L_Ibx,L_Iwx,L_Idx, //Sign extend