Changeset 65764 in vbox
- Timestamp:
- Feb 13, 2017 12:51:38 PM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 113479
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h
r65761 r65764 1282 1282 FNIEMOP_DEF(iemOp_popa) 1283 1283 { 1284 IEMOP_MNEMONIC(popa, "popa"); 1285 IEMOP_HLP_MIN_186(); 1286 IEMOP_HLP_NO_64BIT(); 1287 if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT) 1288 return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_popa_16); 1289 Assert(pVCpu->iem.s.enmEffOpSize == IEMMODE_32BIT); 1290 return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_popa_32); 1284 if (pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT) 1285 { 1286 IEMOP_MNEMONIC(popa, "popa"); 1287 IEMOP_HLP_MIN_186(); 1288 IEMOP_HLP_NO_64BIT(); 1289 if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT) 1290 return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_popa_16); 1291 Assert(pVCpu->iem.s.enmEffOpSize == IEMMODE_32BIT); 1292 return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_popa_32); 1293 } 1294 Log(("mvex is not supported!\n")); 1295 return IEMOP_RAISE_INVALID_OPCODE(); 1291 1296 } 1292 1297 … … 3528 3533 3529 3534 /** Opcode 0x8f. */ 3530 FNIEMOP_DEF(iemOp_Grp1A) 3531 { 3535 FNIEMOP_DEF(iemOp_Grp1A_xop) 3536 { 3537 /* 3538 * AMD has defined /1 thru /7 as XOP prefix. The prefix is similar to the 3539 * three byte VEX prefix, except that the mmmmm field cannot have the values 3540 * 0 thru 7, because it would then be confused with pop Ev (modrm.reg == 0). 3541 */ 3532 3542 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 3533 3543 if ((bRm & X86_MODRM_REG_MASK) == (0 << X86_MODRM_REG_SHIFT)) /* /0 */ 3534 3544 return FNIEMOP_CALL_1(iemOp_pop_Ev, bRm); 3535 3545 3536 /* AMD has defined /1 thru /7 as XOP prefix (similar to three byte VEX). */ 3537 /** @todo XOP decoding. */ 3538 IEMOP_MNEMONIC(xop_amd, "3-byte-xop"); 3546 IEMOP_MNEMONIC(xop, "xop"); 3547 if (IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fXop) 3548 { 3549 /** @todo Test when exctly the XOP conformance checks kick in during 3550 * instruction decoding and fetching (using \#PF). */ 3551 uint8_t bXop2; IEM_OPCODE_GET_NEXT_U8(&bXop2); 3552 uint8_t bOpcode; IEM_OPCODE_GET_NEXT_U8(&bOpcode); 3553 if ( ( pVCpu->iem.s.fPrefixes 3554 & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_LOCK | IEM_OP_PRF_REX)) 3555 == 0) 3556 { 3557 pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_XOP; 3558 if (bXop2 & 0x80 /* VEX.W */) 3559 pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SIZE_REX_W; 3560 pVCpu->iem.s.uRexReg = ~bRm >> (7 - 3); 3561 pVCpu->iem.s.uRexIndex = ~bRm >> (6 - 3); 3562 pVCpu->iem.s.uRexB = ~bRm >> (5 - 3); 3563 pVCpu->iem.s.uVex3rdReg = (~bXop2 >> 3) & 0xf; 3564 pVCpu->iem.s.uVexLength = (bXop2 >> 2) & 1; 3565 pVCpu->iem.s.idxPrefix = bXop2 & 0x3; 3566 3567 /** @todo VEX: Just use new tables and decoders. */ 3568 switch (bRm & 0x1f) 3569 { 3570 case 8: /* xop opcode map 8. */ 3571 IEMOP_BITCH_ABOUT_STUB(); 3572 return VERR_IEM_INSTR_NOT_IMPLEMENTED; 3573 3574 case 9: /* xop opcode map 9. */ 3575 IEMOP_BITCH_ABOUT_STUB(); 3576 return VERR_IEM_INSTR_NOT_IMPLEMENTED; 3577 3578 case 10: /* xop opcode map 10. */ 3579 IEMOP_BITCH_ABOUT_STUB(); 3580 return VERR_IEM_INSTR_NOT_IMPLEMENTED; 3581 3582 default: 3583 Log(("XOP: Invalid vvvv value: %#x!\n", bRm & 0x1f)); 3584 return IEMOP_RAISE_INVALID_OPCODE(); 3585 } 3586 } 3587 else 3588 Log(("XOP: Invalid prefix mix!\n")); 3589 } 3590 else 3591 Log(("XOP: XOP support disabled!\n")); 3539 3592 return IEMOP_RAISE_INVALID_OPCODE(); 3540 3593 } … … 5259 5312 || (bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 5260 5313 { 5261 IEMOP_MNEMONIC(vex2_prefix, " 2-byte-vex");5314 IEMOP_MNEMONIC(vex2_prefix, "vex2"); 5262 5315 if (IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAvx) 5263 5316 { … … 5309 5362 } 5310 5363 5311 IEMOP_MNEMONIC(vex3_prefix, " 3-byte-vex");5364 IEMOP_MNEMONIC(vex3_prefix, "vex3"); 5312 5365 if (IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAvx) 5313 5366 { … … 5331 5384 5332 5385 /** @todo VEX: Just use new tables and decoders. */ 5333 switch (bRm & 0x f)5386 switch (bRm & 0x1f) 5334 5387 { 5335 5388 case 1: /* 0x0f lead opcode byte. */ … … 5346 5399 5347 5400 default: 5348 Log(("VEX3: Invalid vvvv value: %#x!\n", bRm & 0x f));5401 Log(("VEX3: Invalid vvvv value: %#x!\n", bRm & 0x1f)); 5349 5402 return IEMOP_RAISE_INVALID_OPCODE(); 5350 5403 } … … 10716 10769 /* 0x84 */ iemOp_test_Eb_Gb, iemOp_test_Ev_Gv, iemOp_xchg_Eb_Gb, iemOp_xchg_Ev_Gv, 10717 10770 /* 0x88 */ iemOp_mov_Eb_Gb, iemOp_mov_Ev_Gv, iemOp_mov_Gb_Eb, iemOp_mov_Gv_Ev, 10718 /* 0x8c */ iemOp_mov_Ev_Sw, iemOp_lea_Gv_M, iemOp_mov_Sw_Ev, iemOp_Grp1A ,10771 /* 0x8c */ iemOp_mov_Ev_Sw, iemOp_lea_Gv_M, iemOp_mov_Sw_Ev, iemOp_Grp1A_xop, 10719 10772 /* 0x90 */ iemOp_nop, iemOp_xchg_eCX_eAX, iemOp_xchg_eDX_eAX, iemOp_xchg_eBX_eAX, 10720 10773 /* 0x94 */ iemOp_xchg_eSP_eAX, iemOp_xchg_eBP_eAX, iemOp_xchg_eSI_eAX, iemOp_xchg_eDI_eAX, -
trunk/src/VBox/VMM/include/IEMInternal.h
r65761 r65764 516 516 /** Prefix index (VEX.pp) for two byte and three byte tables. */ 517 517 uint8_t idxPrefix; /* 0x30, 0x16 */ 518 /** 3rd (E)VEXregister. */518 /** 3rd VEX/EVEX/XOP register. */ 519 519 uint8_t uVex3rdReg; /* 0x31, 0x17 */ 520 /** The VEX/EVEX length field. */520 /** The VEX/EVEX/XOP length field. */ 521 521 uint8_t uVexLength; /* 0x32, 0x18 */ 522 522 /** Additional EVEX stuff. */ … … 840 840 #define IEM_OP_PRF_VEX RT_BIT_32(28) /**< Indiciates VEX prefix. */ 841 841 #define IEM_OP_PRF_EVEX RT_BIT_32(29) /**< Indiciates EVEX prefix. */ 842 #define IEM_OP_PRF_XOP RT_BIT_32(30) /**< Indiciates XOP prefix. */ 842 843 /** @} */ 843 844
Note:
See TracChangeset
for help on using the changeset viewer.