- Timestamp:
- Nov 5, 2014 11:16:48 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 96804
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r53202 r53246 11970 11970 11971 11971 /** Opcode 0xc4. */ 11972 FNIEMOP_DEF(iemOp_les_Gv_Mp )11972 FNIEMOP_DEF(iemOp_les_Gv_Mp_vex2) 11973 11973 { 11974 11974 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); … … 11992 11992 11993 11993 /** Opcode 0xc5. */ 11994 FNIEMOP_DEF(iemOp_lds_Gv_Mp) 11995 { 11994 FNIEMOP_DEF(iemOp_lds_Gv_Mp_vex3) 11995 { 11996 /* The LDS instruction is invalid 64-bit mode. In legacy and 11997 compatability mode it is invalid with MOD=3. 11998 The use as a VEX prefix is made possible by assigning the inverted 11999 REX.R and REX.X to the two MOD bits, since the REX bits are ignored 12000 outside of 64-bit mode. VEX is not available in real or v86 mode. */ 11996 12001 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 11997 if ( pIemCpu->enmCpuMode == IEMMODE_64BIT 11998 || (bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 11999 { 12000 IEMOP_MNEMONIC("3-byte-vex"); 12001 /* The LDS instruction is invalid 64-bit mode. In legacy and 12002 compatability mode it is invalid with MOD=3. 12003 The use as a VEX prefix is made possible by assigning the inverted 12004 REX.R and REX.X to the two MOD bits, since the REX bits are ignored 12005 outside of 64-bit mode. */ 12006 /** @todo VEX: Just use new tables for it. */ 12007 return IEMOP_RAISE_INVALID_OPCODE(); 12008 } 12009 IEMOP_MNEMONIC("lds Gv,Mp"); 12010 return FNIEMOP_CALL_2(iemOpCommonLoadSRegAndGreg, X86_SREG_DS, bRm); 12002 if (pIemCpu->enmCpuMode != IEMMODE_64BIT) 12003 { 12004 if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT)) 12005 { 12006 IEMOP_MNEMONIC("lds Gv,Mp"); 12007 return FNIEMOP_CALL_2(iemOpCommonLoadSRegAndGreg, X86_SREG_DS, bRm); 12008 } 12009 IEMOP_HLP_NO_REAL_OR_V86_MODE(); 12010 } 12011 12012 IEMOP_MNEMONIC("3-byte-vex"); 12013 /** @todo Test when exctly the VEX conformance checks kick in during 12014 * instruction decoding and fetching (using \#PF). */ 12015 uint8_t bVex1; IEM_OPCODE_GET_NEXT_U8(&bVex1); 12016 uint8_t bVex2; IEM_OPCODE_GET_NEXT_U8(&bVex2); 12017 uint8_t bOpcode; IEM_OPCODE_GET_NEXT_U8(&bOpcode); 12018 #if 0 /* will make sense of this next week... */ 12019 if ( !(pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPZ | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REX)) 12020 && 12021 ) 12022 { 12023 12024 } 12025 #endif 12026 12027 /** @todo VEX: Just use new tables for it. */ 12028 return IEMOP_RAISE_INVALID_OPCODE(); 12011 12029 } 12012 12030 … … 12616 12634 IEMOP_HLP_NO_64BIT(); 12617 12635 return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_aad, bImm); 12636 } 12637 12638 12639 /** Opcode 0xd6. */ 12640 FNIEMOP_DEF(iemOp_salc) 12641 { 12642 IEMOP_MNEMONIC("salc"); 12643 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 12644 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 12645 IEMOP_HLP_NO_64BIT(); 12646 12647 IEM_MC_BEGIN(0, 0); 12648 IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) { 12649 IEM_MC_STORE_GREG_U8(X86_GREG_xAX, 0xff); 12650 } IEM_MC_ELSE() { 12651 IEM_MC_STORE_GREG_U8(X86_GREG_xAX, 0x00); 12652 } IEM_MC_ENDIF(); 12653 IEM_MC_ADVANCE_RIP(); 12654 IEM_MC_END(); 12655 return VINF_SUCCESS; 12618 12656 } 12619 12657 … … 17306 17344 /* 0xbc */ iemOp_eSP_Iv, iemOp_eBP_Iv, iemOp_eSI_Iv, iemOp_eDI_Iv, 17307 17345 /* 0xc0 */ iemOp_Grp2_Eb_Ib, iemOp_Grp2_Ev_Ib, iemOp_retn_Iw, iemOp_retn, 17308 /* 0xc4 */ iemOp_les_Gv_Mp , iemOp_lds_Gv_Mp,iemOp_Grp11_Eb_Ib, iemOp_Grp11_Ev_Iz,17346 /* 0xc4 */ iemOp_les_Gv_Mp_vex2, iemOp_lds_Gv_Mp_vex3, iemOp_Grp11_Eb_Ib, iemOp_Grp11_Ev_Iz, 17309 17347 /* 0xc8 */ iemOp_enter_Iw_Ib, iemOp_leave, iemOp_retf_Iw, iemOp_retf, 17310 17348 /* 0xcc */ iemOp_int_3, iemOp_int_Ib, iemOp_into, iemOp_iret, 17311 17349 /* 0xd0 */ iemOp_Grp2_Eb_1, iemOp_Grp2_Ev_1, iemOp_Grp2_Eb_CL, iemOp_Grp2_Ev_CL, 17312 /* 0xd4 */ iemOp_aam_Ib, iemOp_aad_Ib, iemOp_ Invalid,iemOp_xlat,17350 /* 0xd4 */ iemOp_aam_Ib, iemOp_aad_Ib, iemOp_salc, iemOp_xlat, 17313 17351 /* 0xd8 */ iemOp_EscF0, iemOp_EscF1, iemOp_EscF2, iemOp_EscF3, 17314 17352 /* 0xdc */ iemOp_EscF4, iemOp_EscF5, iemOp_EscF6, iemOp_EscF7,
Note:
See TracChangeset
for help on using the changeset viewer.