Changeset 99958 in vbox for trunk/src/VBox/VMM
- Timestamp:
- May 24, 2023 2:47:30 PM (21 months ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap2.cpp.h
r99335 r99958 1100 1100 { 1101 1101 IEMOP_MNEMONIC3(VEX_RVM, ANDN, andn, Gy, By, Ey, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO); 1102 if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fBmi1)1103 return iemOp_InvalidNeedRM(pVCpu);1104 1102 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF | X86_EFL_PF); 1105 1103 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); … … 1109 1107 * Register, register. 1110 1108 */ 1111 IEMOP_HLP_DONE_VEX_DECODING_L0 ();1109 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1); 1112 1110 if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W) 1113 1111 { … … 1158 1156 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 1159 1157 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 1160 IEMOP_HLP_DONE_VEX_DECODING_L0 ();1158 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1); 1161 1159 IEM_MC_FETCH_MEM_U64(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 1162 1160 IEM_MC_FETCH_GREG_U64(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); … … 1177 1175 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 1178 1176 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 1179 IEMOP_HLP_DONE_VEX_DECODING_L0 ();1177 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1); 1180 1178 IEM_MC_FETCH_MEM_U32(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 1181 1179 IEM_MC_FETCH_GREG_U32(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); … … 1203 1201 /** Body for the vex group 17 instructions. */ 1204 1202 #define IEMOP_BODY_By_Ey(a_Instr) \ 1205 if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fBmi1) \1206 return iemOp_InvalidWithRM(pVCpu, bRm); /* decode memory variant? */ \1207 1203 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF | X86_EFL_PF); \ 1208 1204 if (IEM_IS_MODRM_REG_MODE(bRm)) \ … … 1211 1207 * Register, register. \ 1212 1208 */ \ 1213 IEMOP_HLP_DONE_VEX_DECODING_L0 (); \1209 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1); \ 1214 1210 if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W) \ 1215 1211 { \ … … 1255 1251 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \ 1256 1252 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \ 1257 IEMOP_HLP_DONE_VEX_DECODING_L0 (); \1253 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1); \ 1258 1254 IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \ 1259 1255 IEM_MC_REF_GREG_U64(pDst, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \ … … 1272 1268 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \ 1273 1269 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \ 1274 IEMOP_HLP_DONE_VEX_DECODING_L0 (); \1270 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1); \ 1275 1271 IEM_MC_FETCH_MEM_U32(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \ 1276 1272 IEM_MC_REF_GREG_U32(pDst, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \ … … 1354 1350 /** Body for BZHI, BEXTR, ++; assumes VEX.L must be 0. */ 1355 1351 #define IEMOP_BODY_Gy_Ey_By(a_Instr, a_fFeatureMember, a_fUndefFlags) \ 1356 if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->a_fFeatureMember) \1357 return iemOp_InvalidNeedRM(pVCpu); \1358 1352 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(a_fUndefFlags); \ 1359 1353 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \ … … 1363 1357 * Register, register. \ 1364 1358 */ \ 1365 IEMOP_HLP_DONE_VEX_DECODING_L0 (); \1359 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \ 1366 1360 if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W) \ 1367 1361 { \ … … 1414 1408 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \ 1415 1409 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \ 1416 IEMOP_HLP_DONE_VEX_DECODING_L0 (); \1410 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \ 1417 1411 IEM_MC_FETCH_MEM_U64(uSrc1, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \ 1418 1412 IEM_MC_FETCH_GREG_U64(uSrc2, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \ … … 1434 1428 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \ 1435 1429 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \ 1436 IEMOP_HLP_DONE_VEX_DECODING_L0 (); \1430 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \ 1437 1431 IEM_MC_FETCH_MEM_U32(uSrc1, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \ 1438 1432 IEM_MC_FETCH_GREG_U32(uSrc2, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \ … … 1451 1445 /** Body for SARX, SHLX, SHRX; assumes VEX.L must be 0. */ 1452 1446 #define IEMOP_BODY_Gy_Ey_By_NoEflags(a_Instr, a_fFeatureMember, a_fUndefFlags) \ 1453 if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->a_fFeatureMember) \1454 return iemOp_InvalidNeedRM(pVCpu); \1455 1447 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(a_fUndefFlags); \ 1456 1448 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \ … … 1460 1452 * Register, register. \ 1461 1453 */ \ 1462 IEMOP_HLP_DONE_VEX_DECODING_L0 (); \1454 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \ 1463 1455 if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W) \ 1464 1456 { \ … … 1504 1496 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \ 1505 1497 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \ 1506 IEMOP_HLP_DONE_VEX_DECODING_L0 (); \1498 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \ 1507 1499 IEM_MC_FETCH_MEM_U64(uSrc1, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \ 1508 1500 IEM_MC_FETCH_GREG_U64(uSrc2, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \ … … 1521 1513 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \ 1522 1514 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \ 1523 IEMOP_HLP_DONE_VEX_DECODING_L0 (); \1515 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \ 1524 1516 IEM_MC_FETCH_MEM_U32(uSrc1, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \ 1525 1517 IEM_MC_FETCH_GREG_U32(uSrc2, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \ … … 1545 1537 /** Body for PDEP and PEXT (similar to ANDN, except no EFLAGS). */ 1546 1538 #define IEMOP_BODY_Gy_By_Ey_NoEflags(a_Instr, a_fFeatureMember) \ 1547 if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->a_fFeatureMember) \1548 return iemOp_InvalidNeedRM(pVCpu); \1549 1539 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \ 1550 1540 if (IEM_IS_MODRM_REG_MODE(bRm)) \ … … 1553 1543 * Register, register. \ 1554 1544 */ \ 1555 IEMOP_HLP_DONE_VEX_DECODING_L0 (); \1545 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \ 1556 1546 if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W) \ 1557 1547 { \ … … 1599 1589 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \ 1600 1590 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \ 1601 IEMOP_HLP_DONE_VEX_DECODING_L0 (); \1591 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \ 1602 1592 IEM_MC_FETCH_MEM_U64(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \ 1603 1593 IEM_MC_FETCH_GREG_U64(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \ … … 1617 1607 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \ 1618 1608 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \ 1619 IEMOP_HLP_DONE_VEX_DECODING_L0 (); \1609 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \ 1620 1610 IEM_MC_FETCH_MEM_U32(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \ 1621 1611 IEM_MC_FETCH_GREG_U32(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \ … … 1657 1647 { 1658 1648 IEMOP_MNEMONIC4(VEX_RVM, MULX, mulx, Gy, By, Ey, rDX, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO); 1659 if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fBmi2)1660 return iemOp_InvalidNeedRM(pVCpu);1661 1649 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 1662 1650 if (IEM_IS_MODRM_REG_MODE(bRm)) … … 1665 1653 * Register, register. 1666 1654 */ 1667 IEMOP_HLP_DONE_VEX_DECODING_L0 ();1655 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi2); 1668 1656 if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W) 1669 1657 { … … 1715 1703 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 1716 1704 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 1717 IEMOP_HLP_DONE_VEX_DECODING_L0 ();1705 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi2); 1718 1706 IEM_MC_FETCH_MEM_U64(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 1719 1707 IEM_MC_FETCH_GREG_U64(uSrc1, X86_GREG_xDX); … … 1734 1722 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 1735 1723 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 1736 IEMOP_HLP_DONE_VEX_DECODING_L0 ();1724 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi2); 1737 1725 IEM_MC_FETCH_MEM_U32(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 1738 1726 IEM_MC_FETCH_GREG_U32(uSrc1, X86_GREG_xDX); -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap3.cpp.h
r99335 r99958 887 887 { 888 888 IEMOP_MNEMONIC3(VEX_RMI, RORX, rorx, Gy, Ey, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO | IEMOPHINT_VEX_V_ZERO); 889 if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fBmi2)890 return iemOp_InvalidNeedRMImm8(pVCpu);891 889 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 892 890 if (IEM_IS_MODRM_REG_MODE(bRm)) … … 896 894 */ 897 895 uint8_t bImm8; IEM_OPCODE_GET_NEXT_U8(&bImm8); 898 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV ();896 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fBmi2); 899 897 if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W) 900 898 { … … 937 935 uint8_t bImm8; IEM_OPCODE_GET_NEXT_U8(&bImm8); 938 936 IEM_MC_ARG_CONST(uint64_t, uSrc2, bImm8, 2); 939 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV ();937 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fBmi2); 940 938 IEM_MC_FETCH_MEM_U64(uSrc1, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 941 939 IEM_MC_REF_GREG_U64(pDst, IEM_GET_MODRM_REG(pVCpu, bRm)); … … 953 951 uint8_t bImm8; IEM_OPCODE_GET_NEXT_U8(&bImm8); 954 952 IEM_MC_ARG_CONST(uint32_t, uSrc2, bImm8, 2); 955 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV ();953 IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fBmi2); 956 954 IEM_MC_FETCH_MEM_U32(uSrc1, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 957 955 IEM_MC_REF_GREG_U32(pDst, IEM_GET_MODRM_REG(pVCpu, bRm)); -
trunk/src/VBox/VMM/include/IEMOpHlp.h
r99686 r99958 453 453 /** 454 454 * Done decoding VEX instruction, raise \#UD exception if any lock, rex, repz, 455 * repnz or size prefixes are present, or if in real or v8086 mode.456 */457 #define IEMOP_HLP_DONE_VEX_DECODING() \458 do \459 { \460 if (RT_LIKELY( !( pVCpu->iem.s.fPrefixes \461 & (IEM_OP_PRF_LOCK | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REX)) \462 && !IEM_IS_REAL_OR_V86_MODE(pVCpu) )) \463 { /* likely */ } \464 else \465 return IEMOP_RAISE_INVALID_OPCODE(); \466 } while (0)467 468 /**469 * Done decoding VEX instruction, raise \#UD exception if any lock, rex, repz,470 455 * repnz or size prefixes are present, if in real or v8086 mode, or if the 471 * a_fFeature is present in the guest CPU.456 * a_fFeature is not present in the guest CPU. 472 457 */ 473 458 #define IEMOP_HLP_DONE_VEX_DECODING_EX(a_fFeature) \ … … 485 470 /** 486 471 * Done decoding VEX instruction, raise \#UD exception if any lock, rex, repz, 487 * repnz or size prefixes are present, or if in real or v8086 mode. 488 */ 489 #define IEMOP_HLP_DONE_VEX_DECODING_L0() \ 490 do \ 491 { \ 492 if (RT_LIKELY( !( pVCpu->iem.s.fPrefixes \ 493 & (IEM_OP_PRF_LOCK | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REX)) \ 494 && !IEM_IS_REAL_OR_V86_MODE(pVCpu) \ 495 && pVCpu->iem.s.uVexLength == 0)) \ 496 { /* likely */ } \ 497 else \ 498 return IEMOP_RAISE_INVALID_OPCODE(); \ 499 } while (0) 500 501 /** 502 * Done decoding VEX instruction, raise \#UD exception if any lock, rex, repz, 503 * repnz or size prefixes are present, or if in real or v8086 mode. 472 * repnz or size prefixes are present, or if in real or v8086 mode, or if the 473 * a_fFeature is not present in the guest CPU. 504 474 */ 505 475 #define IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeature) \ … … 516 486 } while (0) 517 487 518 519 /**520 * Done decoding VEX instruction, raise \#UD exception if any lock, rex, repz,521 * repnz or size prefixes are present, or if the VEX.VVVV field doesn't indicate522 * register 0, or if in real or v8086 mode.523 */524 #define IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV() \525 do \526 { \527 if (RT_LIKELY( !( pVCpu->iem.s.fPrefixes \528 & (IEM_OP_PRF_LOCK | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REX)) \529 && !pVCpu->iem.s.uVex3rdReg \530 && !IEM_IS_REAL_OR_V86_MODE(pVCpu) )) \531 { /* likely */ } \532 else \533 return IEMOP_RAISE_INVALID_OPCODE(); \534 } while (0)535 536 488 /** 537 489 * Done decoding VEX instruction, raise \#UD exception if any lock, rex, repz, … … 548 500 && !IEM_IS_REAL_OR_V86_MODE(pVCpu) \ 549 501 && IEM_GET_GUEST_CPU_FEATURES(pVCpu)->a_fFeature )) \ 550 { /* likely */ } \551 else \552 return IEMOP_RAISE_INVALID_OPCODE(); \553 } while (0)554 555 /**556 * Done decoding VEX, no V, L=0.557 * Raises \#UD exception if rex, rep, opsize or lock prefixes are present, if558 * we're in real or v8086 mode, if VEX.V!=0xf, or if VEX.L!=0.559 */560 #define IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV() \561 do \562 { \563 if (RT_LIKELY( !( pVCpu->iem.s.fPrefixes \564 & (IEM_OP_PRF_LOCK | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REX)) \565 && pVCpu->iem.s.uVexLength == 0 \566 && pVCpu->iem.s.uVex3rdReg == 0 \567 && !IEM_IS_REAL_OR_V86_MODE(pVCpu))) \568 502 { /* likely */ } \ 569 503 else \
Note:
See TracChangeset
for help on using the changeset viewer.