Changeset 40266 in vbox
- Timestamp:
- Feb 27, 2012 10:09:01 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 76486
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/src/VBox/VMM/VMMAll/IEMAll.cpp ¶
r40256 r40266 2597 2597 NOREF(a_Name0); \ 2598 2598 return VERR_IEM_INSTR_NOT_IMPLEMENTED; \ 2599 } \ 2600 typedef int ignore_semicolon 2601 2602 /** Stubs an opcode which currently should raise \#UD. */ 2603 #define FNIEMOP_UD_STUB(a_Name) \ 2604 FNIEMOP_DEF(a_Name) \ 2605 { \ 2606 Log(("Unsupported instruction %Rfn\n", __FUNCTION__)); \ 2607 return IEMOP_RAISE_INVALID_OPCODE(); \ 2608 } \ 2609 typedef int ignore_semicolon 2610 2611 /** Stubs an opcode which currently should raise \#UD. */ 2612 #define FNIEMOP_UD_STUB_1(a_Name, a_Type0, a_Name0) \ 2613 FNIEMOP_DEF_1(a_Name, a_Type0, a_Name0) \ 2614 { \ 2615 NOREF(a_Name0); \ 2616 Log(("Unsupported instruction %Rfn\n", __FUNCTION__)); \ 2617 return IEMOP_RAISE_INVALID_OPCODE(); \ 2599 2618 } \ 2600 2619 typedef int ignore_semicolon -
TabularUnified trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h ¶
r40256 r40266 739 739 740 740 741 /** Opcode 0x0f 0x01 0xd8. */ 742 FNIEMOP_UD_STUB(iemOp_Grp7_Amd_vmrun); 743 744 /** Opcode 0x0f 0x01 0xd9. */ 745 FNIEMOP_UD_STUB(iemOp_Grp7_Amd_vmmcall); 746 747 /** Opcode 0x0f 0x01 0xda. */ 748 FNIEMOP_UD_STUB(iemOp_Grp7_Amd_vmload); 749 750 /** Opcode 0x0f 0x01 0xdb. */ 751 FNIEMOP_UD_STUB(iemOp_Grp7_Amd_vmsave); 752 753 /** Opcode 0x0f 0x01 0xdc. */ 754 FNIEMOP_UD_STUB(iemOp_Grp7_Amd_stgi); 755 756 /** Opcode 0x0f 0x01 0xdd. */ 757 FNIEMOP_UD_STUB(iemOp_Grp7_Amd_clgi); 758 759 /** Opcode 0x0f 0x01 0xde. */ 760 FNIEMOP_UD_STUB(iemOp_Grp7_Amd_skinit); 761 762 /** Opcode 0x0f 0x01 0xdf. */ 763 FNIEMOP_UD_STUB(iemOp_Grp7_Amd_invlpga); 764 741 765 /** Opcode 0x0f 0x01 /4. */ 742 766 FNIEMOP_DEF_1(iemOp_Grp7_smsw, uint8_t, bRm) … … 891 915 if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT)) 892 916 return FNIEMOP_CALL_1(iemOp_Grp7_lidt, bRm); 893 return IEMOP_RAISE_INVALID_OPCODE(); 917 switch (bRm & X86_MODRM_RM_MASK) 918 { 919 case 0: return FNIEMOP_CALL(iemOp_Grp7_Amd_vmrun); 920 case 1: return FNIEMOP_CALL(iemOp_Grp7_Amd_vmmcall); 921 case 2: return FNIEMOP_CALL(iemOp_Grp7_Amd_vmload); 922 case 3: return FNIEMOP_CALL(iemOp_Grp7_Amd_vmsave); 923 case 4: return FNIEMOP_CALL(iemOp_Grp7_Amd_stgi); 924 case 5: return FNIEMOP_CALL(iemOp_Grp7_Amd_clgi); 925 case 6: return FNIEMOP_CALL(iemOp_Grp7_Amd_skinit); 926 case 7: return FNIEMOP_CALL(iemOp_Grp7_Amd_invlpga); 927 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 928 } 894 929 895 930 case 4: … … 987 1022 /** Opcode 0x0f 0x0e. */ 988 1023 FNIEMOP_STUB(iemOp_femms); 1024 1025 1026 /** Opcode 0x0f 0x0f 0x0c. */ 1027 FNIEMOP_STUB(iemOp_3Dnow_pi2fw_Pq_Qq); 1028 1029 /** Opcode 0x0f 0x0f 0x0d. */ 1030 FNIEMOP_STUB(iemOp_3Dnow_pi2fd_Pq_Qq); 1031 1032 /** Opcode 0x0f 0x0f 0x1c. */ 1033 FNIEMOP_STUB(iemOp_3Dnow_pf2fw_Pq_Qq); 1034 1035 /** Opcode 0x0f 0x0f 0x1d. */ 1036 FNIEMOP_STUB(iemOp_3Dnow_pf2fd_Pq_Qq); 1037 1038 /** Opcode 0x0f 0x0f 0x8a. */ 1039 FNIEMOP_STUB(iemOp_3Dnow_pfnacc_Pq_Qq); 1040 1041 /** Opcode 0x0f 0x0f 0x8e. */ 1042 FNIEMOP_STUB(iemOp_3Dnow_pfpnacc_Pq_Qq); 1043 1044 /** Opcode 0x0f 0x0f 0x90. */ 1045 FNIEMOP_STUB(iemOp_3Dnow_pfcmpge_Pq_Qq); 1046 1047 /** Opcode 0x0f 0x0f 0x94. */ 1048 FNIEMOP_STUB(iemOp_3Dnow_pfmin_Pq_Qq); 1049 1050 /** Opcode 0x0f 0x0f 0x96. */ 1051 FNIEMOP_STUB(iemOp_3Dnow_pfrcp_Pq_Qq); 1052 1053 /** Opcode 0x0f 0x0f 0x97. */ 1054 FNIEMOP_STUB(iemOp_3Dnow_pfrsqrt_Pq_Qq); 1055 1056 /** Opcode 0x0f 0x0f 0x9a. */ 1057 FNIEMOP_STUB(iemOp_3Dnow_pfsub_Pq_Qq); 1058 1059 /** Opcode 0x0f 0x0f 0x9e. */ 1060 FNIEMOP_STUB(iemOp_3Dnow_pfadd_PQ_Qq); 1061 1062 /** Opcode 0x0f 0x0f 0xa0. */ 1063 FNIEMOP_STUB(iemOp_3Dnow_pfcmpgt_Pq_Qq); 1064 1065 /** Opcode 0x0f 0x0f 0xa4. */ 1066 FNIEMOP_STUB(iemOp_3Dnow_pfmax_Pq_Qq); 1067 1068 /** Opcode 0x0f 0x0f 0xa6. */ 1069 FNIEMOP_STUB(iemOp_3Dnow_pfrcpit1_Pq_Qq); 1070 1071 /** Opcode 0x0f 0x0f 0xa7. */ 1072 FNIEMOP_STUB(iemOp_3Dnow_pfrsqit1_Pq_Qq); 1073 1074 /** Opcode 0x0f 0x0f 0xaa. */ 1075 FNIEMOP_STUB(iemOp_3Dnow_pfsubr_Pq_Qq); 1076 1077 /** Opcode 0x0f 0x0f 0xae. */ 1078 FNIEMOP_STUB(iemOp_3Dnow_pfacc_PQ_Qq); 1079 1080 /** Opcode 0x0f 0x0f 0xb0. */ 1081 FNIEMOP_STUB(iemOp_3Dnow_pfcmpeq_Pq_Qq); 1082 1083 /** Opcode 0x0f 0x0f 0xb4. */ 1084 FNIEMOP_STUB(iemOp_3Dnow_pfmul_Pq_Qq); 1085 1086 /** Opcode 0x0f 0x0f 0xb6. */ 1087 FNIEMOP_STUB(iemOp_3Dnow_pfrcpit2_Pq_Qq); 1088 1089 /** Opcode 0x0f 0x0f 0xb7. */ 1090 FNIEMOP_STUB(iemOp_3Dnow_pmulhrw_Pq_Qq); 1091 1092 /** Opcode 0x0f 0x0f 0xbb. */ 1093 FNIEMOP_STUB(iemOp_3Dnow_pswapd_Pq_Qq); 1094 1095 /** Opcode 0x0f 0x0f 0xbf. */ 1096 FNIEMOP_STUB(iemOp_3Dnow_pavgusb_PQ_Qq); 1097 1098 989 1099 /** Opcode 0x0f 0x0f. */ 990 FNIEMOP_STUB(iemOp_3Dnow); 1100 FNIEMOP_DEF(iemOp_3Dnow) 1101 { 1102 if (!IEM_IS_AMD_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_AMD_FEATURE_EDX_3DNOW)) 1103 { 1104 IEMOP_MNEMONIC("3Dnow"); 1105 return IEMOP_RAISE_INVALID_OPCODE(); 1106 } 1107 1108 /* This is pretty sparse, use switch instead of table. */ 1109 uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b); 1110 switch (b) 1111 { 1112 case 0x0c: return FNIEMOP_CALL(iemOp_3Dnow_pi2fw_Pq_Qq); 1113 case 0x0d: return FNIEMOP_CALL(iemOp_3Dnow_pi2fd_Pq_Qq); 1114 case 0x1c: return FNIEMOP_CALL(iemOp_3Dnow_pf2fw_Pq_Qq); 1115 case 0x1d: return FNIEMOP_CALL(iemOp_3Dnow_pf2fd_Pq_Qq); 1116 case 0x8a: return FNIEMOP_CALL(iemOp_3Dnow_pfnacc_Pq_Qq); 1117 case 0x8e: return FNIEMOP_CALL(iemOp_3Dnow_pfpnacc_Pq_Qq); 1118 case 0x90: return FNIEMOP_CALL(iemOp_3Dnow_pfcmpge_Pq_Qq); 1119 case 0x94: return FNIEMOP_CALL(iemOp_3Dnow_pfmin_Pq_Qq); 1120 case 0x96: return FNIEMOP_CALL(iemOp_3Dnow_pfrcp_Pq_Qq); 1121 case 0x97: return FNIEMOP_CALL(iemOp_3Dnow_pfrsqrt_Pq_Qq); 1122 case 0x9a: return FNIEMOP_CALL(iemOp_3Dnow_pfsub_Pq_Qq); 1123 case 0x9e: return FNIEMOP_CALL(iemOp_3Dnow_pfadd_PQ_Qq); 1124 case 0xa0: return FNIEMOP_CALL(iemOp_3Dnow_pfcmpgt_Pq_Qq); 1125 case 0xa4: return FNIEMOP_CALL(iemOp_3Dnow_pfmax_Pq_Qq); 1126 case 0xa6: return FNIEMOP_CALL(iemOp_3Dnow_pfrcpit1_Pq_Qq); 1127 case 0xa7: return FNIEMOP_CALL(iemOp_3Dnow_pfrsqit1_Pq_Qq); 1128 case 0xaa: return FNIEMOP_CALL(iemOp_3Dnow_pfsubr_Pq_Qq); 1129 case 0xae: return FNIEMOP_CALL(iemOp_3Dnow_pfacc_PQ_Qq); 1130 case 0xb0: return FNIEMOP_CALL(iemOp_3Dnow_pfcmpeq_Pq_Qq); 1131 case 0xb4: return FNIEMOP_CALL(iemOp_3Dnow_pfmul_Pq_Qq); 1132 case 0xb6: return FNIEMOP_CALL(iemOp_3Dnow_pfrcpit2_Pq_Qq); 1133 case 0xb7: return FNIEMOP_CALL(iemOp_3Dnow_pmulhrw_Pq_Qq); 1134 case 0xbb: return FNIEMOP_CALL(iemOp_3Dnow_pswapd_Pq_Qq); 1135 case 0xbf: return FNIEMOP_CALL(iemOp_3Dnow_pavgusb_PQ_Qq); 1136 default: 1137 return IEMOP_RAISE_INVALID_OPCODE(); 1138 } 1139 } 1140 1141 991 1142 /** Opcode 0x0f 0x10. */ 992 1143 FNIEMOP_STUB(iemOp_movups_Vps_Wps__movupd_Vpd_Wpd__movss_Vss_Wss__movsd_Vsd_Wsd); … … 1221 1372 FNIEMOP_STUB(iemOp_getsec); 1222 1373 /** Opcode 0x0f 0x38. */ 1223 FNIEMOP_ STUB(iemOp_3byte_Esc_A4);1224 /** Opcode 0x0f 0x3 9. */1225 FNIEMOP_ STUB(iemOp_3byte_Esc_A5);1374 FNIEMOP_UD_STUB(iemOp_3byte_Esc_A4); /* Here there be dragons... */ 1375 /** Opcode 0x0f 0x3a. */ 1376 FNIEMOP_UD_STUB(iemOp_3byte_Esc_A5); /* Here there be dragons... */ 1226 1377 /** Opcode 0x0f 0x3c (?). */ 1227 1378 FNIEMOP_STUB(iemOp_movnti_Gv_Ev); … … 1525 1676 /** Opcode 0x0f 0x70. */ 1526 1677 FNIEMOP_STUB(iemOp_pshufw_Pq_Qq_Ib__pshufd_Vdq_Wdq_Ib__pshufhw_Vdq_Wdq_Ib__pshuflq_Vdq_Wdq_Ib); 1678 1679 /** Opcode 0x0f 0x71 11/2. */ 1680 FNIEMOP_STUB_1(iemOp_Grp12_psrlw_Nq_Ib, uint8_t, bRm); 1681 1682 /** Opcode 0x66 0x0f 0x71 11/2. */ 1683 FNIEMOP_STUB_1(iemOp_Grp12_psrlw_Udq_Ib, uint8_t, bRm); 1684 1685 /** Opcode 0x0f 0x71 11/4. */ 1686 FNIEMOP_STUB_1(iemOp_Grp12_psraw_Nq_Ib, uint8_t, bRm); 1687 1688 /** Opcode 0x66 0x0f 0x71 11/4. */ 1689 FNIEMOP_STUB_1(iemOp_Grp12_psraw_Udq_Ib, uint8_t, bRm); 1690 1691 /** Opcode 0x0f 0x71 11/6. */ 1692 FNIEMOP_STUB_1(iemOp_Grp12_psllw_Nq_Ib, uint8_t, bRm); 1693 1694 /** Opcode 0x66 0x0f 0x71 11/6. */ 1695 FNIEMOP_STUB_1(iemOp_Grp12_psllw_Udq_Ib, uint8_t, bRm); 1696 1697 1527 1698 /** Opcode 0x0f 0x71. */ 1528 FNIEMOP_STUB(iemOp_Grp12); 1699 FNIEMOP_DEF(iemOp_Grp12) 1700 { 1701 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 1702 if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT)) 1703 return IEMOP_RAISE_INVALID_OPCODE(); 1704 switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) 1705 { 1706 case 0: case 1: case 3: case 5: case 7: 1707 return IEMOP_RAISE_INVALID_OPCODE(); 1708 case 2: 1709 switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ)) 1710 { 1711 case 0: return FNIEMOP_CALL_1(iemOp_Grp12_psrlw_Nq_Ib, bRm); 1712 case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp12_psrlw_Udq_Ib, bRm); 1713 default: return IEMOP_RAISE_INVALID_OPCODE(); 1714 } 1715 case 4: 1716 switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ)) 1717 { 1718 case 0: return FNIEMOP_CALL_1(iemOp_Grp12_psraw_Nq_Ib, bRm); 1719 case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp12_psraw_Udq_Ib, bRm); 1720 default: return IEMOP_RAISE_INVALID_OPCODE(); 1721 } 1722 case 6: 1723 switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ)) 1724 { 1725 case 0: return FNIEMOP_CALL_1(iemOp_Grp12_psllw_Nq_Ib, bRm); 1726 case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp12_psllw_Udq_Ib, bRm); 1727 default: return IEMOP_RAISE_INVALID_OPCODE(); 1728 } 1729 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 1730 } 1731 } 1732 1733 1734 /** Opcode 0x0f 0x72 11/2. */ 1735 FNIEMOP_STUB_1(iemOp_Grp13_psrld_Nq_Ib, uint8_t, bRm); 1736 1737 /** Opcode 0x66 0x0f 0x72 11/2. */ 1738 FNIEMOP_STUB_1(iemOp_Grp13_psrld_Udq_Ib, uint8_t, bRm); 1739 1740 /** Opcode 0x0f 0x72 11/4. */ 1741 FNIEMOP_STUB_1(iemOp_Grp13_psrad_Nq_Ib, uint8_t, bRm); 1742 1743 /** Opcode 0x66 0x0f 0x72 11/4. */ 1744 FNIEMOP_STUB_1(iemOp_Grp13_psrad_Udq_Ib, uint8_t, bRm); 1745 1746 /** Opcode 0x0f 0x72 11/6. */ 1747 FNIEMOP_STUB_1(iemOp_Grp13_pslld_Nq_Ib, uint8_t, bRm); 1748 1749 /** Opcode 0x66 0x0f 0x72 11/6. */ 1750 FNIEMOP_STUB_1(iemOp_Grp13_pslld_Udq_Ib, uint8_t, bRm); 1751 1752 1529 1753 /** Opcode 0x0f 0x72. */ 1530 FNIEMOP_STUB(iemOp_Grp13); 1754 FNIEMOP_DEF(iemOp_Grp13) 1755 { 1756 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 1757 if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT)) 1758 return IEMOP_RAISE_INVALID_OPCODE(); 1759 switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) 1760 { 1761 case 0: case 1: case 3: case 5: case 7: 1762 return IEMOP_RAISE_INVALID_OPCODE(); 1763 case 2: 1764 switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ)) 1765 { 1766 case 0: return FNIEMOP_CALL_1(iemOp_Grp13_psrld_Nq_Ib, bRm); 1767 case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp13_psrld_Udq_Ib, bRm); 1768 default: return IEMOP_RAISE_INVALID_OPCODE(); 1769 } 1770 case 4: 1771 switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ)) 1772 { 1773 case 0: return FNIEMOP_CALL_1(iemOp_Grp13_psrad_Nq_Ib, bRm); 1774 case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp13_psrad_Udq_Ib, bRm); 1775 default: return IEMOP_RAISE_INVALID_OPCODE(); 1776 } 1777 case 6: 1778 switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ)) 1779 { 1780 case 0: return FNIEMOP_CALL_1(iemOp_Grp13_pslld_Nq_Ib, bRm); 1781 case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp13_pslld_Udq_Ib, bRm); 1782 default: return IEMOP_RAISE_INVALID_OPCODE(); 1783 } 1784 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 1785 } 1786 } 1787 1788 1789 /** Opcode 0x0f 0x73 11/2. */ 1790 FNIEMOP_STUB_1(iemOp_Grp14_psrlq_Nq_Ib, uint8_t, bRm); 1791 1792 /** Opcode 0x66 0x0f 0x73 11/2. */ 1793 FNIEMOP_STUB_1(iemOp_Grp14_psrlq_Udq_Ib, uint8_t, bRm); 1794 1795 /** Opcode 0x66 0x0f 0x73 11/3. */ 1796 FNIEMOP_STUB_1(iemOp_Grp14_psrldq_Udq_Ib, uint8_t, bRm); 1797 1798 /** Opcode 0x0f 0x73 11/6. */ 1799 FNIEMOP_STUB_1(iemOp_Grp14_psllq_Nq_Ib, uint8_t, bRm); 1800 1801 /** Opcode 0x66 0x0f 0x73 11/6. */ 1802 FNIEMOP_STUB_1(iemOp_Grp14_psllq_Udq_Ib, uint8_t, bRm); 1803 1804 /** Opcode 0x66 0x0f 0x73 11/7. */ 1805 FNIEMOP_STUB_1(iemOp_Grp14_pslldq_Udq_Ib, uint8_t, bRm); 1806 1807 1531 1808 /** Opcode 0x0f 0x73. */ 1532 FNIEMOP_STUB(iemOp_Grp14); 1809 FNIEMOP_DEF(iemOp_Grp14) 1810 { 1811 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 1812 if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT)) 1813 return IEMOP_RAISE_INVALID_OPCODE(); 1814 switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) 1815 { 1816 case 0: case 1: case 4: case 5: 1817 return IEMOP_RAISE_INVALID_OPCODE(); 1818 case 2: 1819 switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ)) 1820 { 1821 case 0: return FNIEMOP_CALL_1(iemOp_Grp14_psrlq_Nq_Ib, bRm); 1822 case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp14_psrlq_Udq_Ib, bRm); 1823 default: return IEMOP_RAISE_INVALID_OPCODE(); 1824 } 1825 case 3: 1826 switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ)) 1827 { 1828 case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp14_psrldq_Udq_Ib, bRm); 1829 default: return IEMOP_RAISE_INVALID_OPCODE(); 1830 } 1831 case 6: 1832 switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ)) 1833 { 1834 case 0: return FNIEMOP_CALL_1(iemOp_Grp14_psllq_Nq_Ib, bRm); 1835 case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp14_psllq_Udq_Ib, bRm); 1836 default: return IEMOP_RAISE_INVALID_OPCODE(); 1837 } 1838 case 7: 1839 switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ)) 1840 { 1841 case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp14_pslldq_Udq_Ib, bRm); 1842 default: return IEMOP_RAISE_INVALID_OPCODE(); 1843 } 1844 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 1845 } 1846 } 1847 1848 1533 1849 /** Opcode 0x0f 0x74. */ 1534 1850 FNIEMOP_STUB(iemOp_pcmpeqb_Pq_Qq__pcmpeqb_Vdq_Wdq); … … 1540 1856 FNIEMOP_STUB(iemOp_emms); 1541 1857 /** Opcode 0x0f 0x78. */ 1542 FNIEMOP_ STUB(iemOp_vmread);1858 FNIEMOP_UD_STUB(iemOp_vmread_AmdGrp17); 1543 1859 /** Opcode 0x0f 0x79. */ 1544 FNIEMOP_ STUB(iemOp_vmwrite);1860 FNIEMOP_UD_STUB(iemOp_vmwrite); 1545 1861 /** Opcode 0x0f 0x7c. */ 1546 1862 FNIEMOP_STUB(iemOp_haddpd_Vdp_Wpd__haddps_Vps_Wps); … … 3404 3720 3405 3721 /** Opcode 0x0f 0xae mem/4. */ 3406 FNIEMOP_ STUB_1(iemOp_Grp15_xsave, uint8_t, bRm);3722 FNIEMOP_UD_STUB_1(iemOp_Grp15_xsave, uint8_t, bRm); 3407 3723 3408 3724 /** Opcode 0x0f 0xae mem/5. */ 3409 FNIEMOP_ STUB_1(iemOp_Grp15_xrstor, uint8_t, bRm);3725 FNIEMOP_UD_STUB_1(iemOp_Grp15_xrstor, uint8_t, bRm); 3410 3726 3411 3727 /** Opcode 0x0f 0xae mem/6. */ 3412 FNIEMOP_ STUB_1(iemOp_Grp15_xsaveopt, uint8_t, bRm);3728 FNIEMOP_UD_STUB_1(iemOp_Grp15_xsaveopt, uint8_t, bRm); 3413 3729 3414 3730 /** Opcode 0x0f 0xae mem/7. */ … … 3425 3741 3426 3742 /** Opcode 0xf3 0x0f 0xae 11b/0. */ 3427 FNIEMOP_ STUB_1(iemOp_Grp15_rdfsbase, uint8_t, bRm);3743 FNIEMOP_UD_STUB_1(iemOp_Grp15_rdfsbase, uint8_t, bRm); 3428 3744 3429 3745 /** Opcode 0xf3 0x0f 0xae 11b/1. */ 3430 FNIEMOP_ STUB_1(iemOp_Grp15_rdgsbase, uint8_t, bRm);3746 FNIEMOP_UD_STUB_1(iemOp_Grp15_rdgsbase, uint8_t, bRm); 3431 3747 3432 3748 /** Opcode 0xf3 0x0f 0xae 11b/2. */ 3433 FNIEMOP_ STUB_1(iemOp_Grp15_wrfsbase, uint8_t, bRm);3749 FNIEMOP_UD_STUB_1(iemOp_Grp15_wrfsbase, uint8_t, bRm); 3434 3750 3435 3751 /** Opcode 0xf3 0x0f 0xae 11b/3. */ 3436 FNIEMOP_ STUB_1(iemOp_Grp15_wrgsbase, uint8_t, bRm);3752 FNIEMOP_UD_STUB_1(iemOp_Grp15_wrgsbase, uint8_t, bRm); 3437 3753 3438 3754 … … 3766 4082 /** Opcode 0x0f 0xb8. */ 3767 4083 FNIEMOP_STUB(iemOp_popcnt_Gv_Ev_jmpe); 4084 4085 3768 4086 /** Opcode 0x0f 0xb9. */ 3769 FNIEMOP_STUB(iemOp_Grp10); 4087 FNIEMOP_DEF(iemOp_Grp10) 4088 { 4089 Log(("iemOp_Grp10 -> #UD\n")); 4090 return IEMOP_RAISE_INVALID_OPCODE(); 4091 } 3770 4092 3771 4093 … … 4327 4649 /** Opcode 0x0f 0xc2. */ 4328 4650 FNIEMOP_STUB(iemOp_cmpps_Vps_Wps_Ib__cmppd_Vpd_Wpd_Ib__cmpss_Vss_Wss_Ib__cmpsd_Vsd_Wsd_Ib); 4651 4329 4652 /** Opcode 0x0f 0xc3. */ 4330 4653 FNIEMOP_STUB(iemOp_movnti_My_Gy); 4654 4331 4655 /** Opcode 0x0f 0xc4. */ 4332 4656 FNIEMOP_STUB(iemOp_pinsrw_Pq_Ry_Mw_Ib__pinsrw_Vdq_Ry_Mw_Ib); 4657 4333 4658 /** Opcode 0x0f 0xc5. */ 4334 4659 FNIEMOP_STUB(iemOp_pextrw_Gd_Nq_Ib__pextrw_Gd_Udq_Ib); 4660 4335 4661 /** Opcode 0x0f 0xc6. */ 4336 4662 FNIEMOP_STUB(iemOp_shufps_Vps_Wps_Ib__shufdp_Vpd_Wpd_Ib); 4663 4664 /** Opcode 0x0f 0xc7 !11/1. */ 4665 FNIEMOP_STUB_1(iemOp_Grp9_cmpxchg8b_Mq, uint8_t, bRm); 4666 4667 /** Opcode REX.W 0x0f 0xc7 !11/1. */ 4668 FNIEMOP_UD_STUB_1(iemOp_Grp9_cmpxchg16b_Mdq, uint8_t, bRm); 4669 4670 /** Opcode 0x0f 0xc7 11/6. */ 4671 FNIEMOP_UD_STUB_1(iemOp_Grp9_rdrand_Rv, uint8_t, bRm); 4672 4673 /** Opcode 0x0f 0xc7 !11/6. */ 4674 FNIEMOP_UD_STUB_1(iemOp_Grp9_vmptrld_Mq, uint8_t, bRm); 4675 4676 /** Opcode 0x66 0x0f 0xc7 !11/6. */ 4677 FNIEMOP_UD_STUB_1(iemOp_Grp9_vmclear_Mq, uint8_t, bRm); 4678 4679 /** Opcode 0xf3 0x0f 0xc7 !11/6. */ 4680 FNIEMOP_UD_STUB_1(iemOp_Grp9_vmxon_Mq, uint8_t, bRm); 4681 4682 /** Opcode [0xf3] 0x0f 0xc7 !11/7. */ 4683 FNIEMOP_UD_STUB_1(iemOp_Grp9_vmptrst_Mq, uint8_t, bRm); 4684 4685 4337 4686 /** Opcode 0x0f 0xc7. */ 4338 FNIEMOP_STUB(iemOp_Grp9); 4687 FNIEMOP_DEF(iemOp_Grp9) 4688 { 4689 /** @todo Testcase: Check mixing 0x66 and 0xf3. Check the effect of 0xf2. */ 4690 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 4691 switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) 4692 { 4693 case 0: case 2: case 3: case 4: case 5: 4694 return IEMOP_RAISE_INVALID_OPCODE(); 4695 case 1: 4696 /** @todo Testcase: Check prefix effects on cmpxchg8b/16b. */ 4697 if ( (bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT) 4698 || (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ))) /** @todo Testcase: AMD seems to express a different idea here wrt prefixes. */ 4699 return IEMOP_RAISE_INVALID_OPCODE(); 4700 if (bRm & IEM_OP_PRF_SIZE_REX_W) 4701 return FNIEMOP_CALL_1(iemOp_Grp9_cmpxchg16b_Mdq, bRm); 4702 return FNIEMOP_CALL_1(iemOp_Grp9_cmpxchg8b_Mq, bRm); 4703 case 6: 4704 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 4705 return FNIEMOP_CALL_1(iemOp_Grp9_rdrand_Rv, bRm); 4706 switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ)) 4707 { 4708 case 0: 4709 return FNIEMOP_CALL_1(iemOp_Grp9_vmptrld_Mq, bRm); 4710 case IEM_OP_PRF_SIZE_OP: 4711 return FNIEMOP_CALL_1(iemOp_Grp9_vmclear_Mq, bRm); 4712 case IEM_OP_PRF_REPZ: 4713 return FNIEMOP_CALL_1(iemOp_Grp9_vmxon_Mq, bRm); 4714 default: 4715 return IEMOP_RAISE_INVALID_OPCODE(); 4716 } 4717 case 7: 4718 switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ)) 4719 { 4720 case 0: 4721 case IEM_OP_PRF_REPZ: 4722 return FNIEMOP_CALL_1(iemOp_Grp9_vmptrst_Mq, bRm); 4723 default: 4724 return IEMOP_RAISE_INVALID_OPCODE(); 4725 } 4726 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 4727 } 4728 } 4339 4729 4340 4730 … … 4543 4933 const PFNIEMOP g_apfnTwoByteMap[256] = 4544 4934 { 4545 /* 0x00 */ iemOp_Grp6, iemOp_Grp7, iemOp_lar_Gv_Ew, iemOp_lsl_Gv_Ew, 4546 /* 0x04 */ iemOp_Invalid, iemOp_syscall, iemOp_clts, iemOp_sysret, 4547 /* 0x08 */ iemOp_invd, iemOp_wbinvd, iemOp_Invalid, iemOp_ud2, 4548 /* 0x0c */ iemOp_Invalid, iemOp_nop_Ev_GrpP, iemOp_femms, iemOp_3Dnow, 4935 /* 0x00 */ iemOp_Grp6, 4936 /* 0x01 */ iemOp_Grp7, 4937 /* 0x02 */ iemOp_lar_Gv_Ew, 4938 /* 0x03 */ iemOp_lsl_Gv_Ew, 4939 /* 0x04 */ iemOp_Invalid, 4940 /* 0x05 */ iemOp_syscall, 4941 /* 0x06 */ iemOp_clts, 4942 /* 0x07 */ iemOp_sysret, 4943 /* 0x08 */ iemOp_invd, 4944 /* 0x09 */ iemOp_wbinvd, 4945 /* 0x0a */ iemOp_Invalid, 4946 /* 0x0b */ iemOp_ud2, 4947 /* 0x0c */ iemOp_Invalid, 4948 /* 0x0d */ iemOp_nop_Ev_GrpP, 4949 /* 0x0e */ iemOp_femms, 4950 /* 0x0f */ iemOp_3Dnow, 4549 4951 /* 0x10 */ iemOp_movups_Vps_Wps__movupd_Vpd_Wpd__movss_Vss_Wss__movsd_Vsd_Wsd, 4550 4952 /* 0x11 */ iemOp_movups_Wps_Vps__movupd_Wpd_Vpd__movss_Wss_Vss__movsd_Vsd_Wsd, … … 4555 4957 /* 0x16 */ iemOp_movhps_Vq_Mq__movlhps_Vq_Uq__movhpd_Vq_Mq__movshdup_Vq_Wq, 4556 4958 /* 0x17 */ iemOp_movhps_Mq_Vq__movhpd_Mq_Vq, 4557 /* 0x18 */ iemOp_prefetch_Grp16, iemOp_nop_Ev, iemOp_nop_Ev, iemOp_nop_Ev, 4558 /* 0x1c */ iemOp_nop_Ev, iemOp_nop_Ev, iemOp_nop_Ev, iemOp_nop_Ev, 4559 /* 0x20 */ iemOp_mov_Rd_Cd, iemOp_mov_Rd_Dd, iemOp_mov_Cd_Rd, iemOp_mov_Dd_Rd, 4560 /* 0x24 */ iemOp_mov_Rd_Td, iemOp_Invalid, iemOp_mov_Td_Rd, iemOp_Invalid, 4959 /* 0x18 */ iemOp_prefetch_Grp16, 4960 /* 0x19 */ iemOp_nop_Ev, 4961 /* 0x1a */ iemOp_nop_Ev, 4962 /* 0x1b */ iemOp_nop_Ev, 4963 /* 0x1c */ iemOp_nop_Ev, 4964 /* 0x1d */ iemOp_nop_Ev, 4965 /* 0x1e */ iemOp_nop_Ev, 4966 /* 0x1f */ iemOp_nop_Ev, 4967 /* 0x20 */ iemOp_mov_Rd_Cd, 4968 /* 0x21 */ iemOp_mov_Rd_Dd, 4969 /* 0x22 */ iemOp_mov_Cd_Rd, 4970 /* 0x23 */ iemOp_mov_Dd_Rd, 4971 /* 0x24 */ iemOp_mov_Rd_Td, 4972 /* 0x25 */ iemOp_Invalid, 4973 /* 0x26 */ iemOp_mov_Td_Rd, 4974 /* 0x27 */ iemOp_Invalid, 4561 4975 /* 0x28 */ iemOp_movaps_Vps_Wps__movapd_Vpd_Wpd, 4562 4976 /* 0x29 */ iemOp_movaps_Wps_Vps__movapd_Wpd_Vpd, … … 4567 4981 /* 0x2e */ iemOp_ucomiss_Vss_Wss__ucomisd_Vsd_Wsd, 4568 4982 /* 0x2f */ iemOp_comiss_Vss_Wss__comisd_Vsd_Wsd, 4569 /* 0x30 */ iemOp_wrmsr, iemOp_rdtsc, iemOp_rdmsr, iemOp_rdpmc, 4570 /* 0x34 */ iemOp_sysenter, iemOp_sysexit, iemOp_Invalid, iemOp_getsec, 4571 /* 0x38 */ iemOp_3byte_Esc_A4, iemOp_Invalid, iemOp_3byte_Esc_A5, iemOp_Invalid, 4572 /* 0x3c */ iemOp_movnti_Gv_Ev/*?*/,iemOp_Invalid, iemOp_Invalid, iemOp_Invalid, 4573 /* 0x40 */ iemOp_cmovo_Gv_Ev, iemOp_cmovno_Gv_Ev, iemOp_cmovc_Gv_Ev, iemOp_cmovnc_Gv_Ev, 4574 /* 0x44 */ iemOp_cmove_Gv_Ev, iemOp_cmovne_Gv_Ev, iemOp_cmovbe_Gv_Ev, iemOp_cmovnbe_Gv_Ev, 4575 /* 0x48 */ iemOp_cmovs_Gv_Ev, iemOp_cmovns_Gv_Ev, iemOp_cmovp_Gv_Ev, iemOp_cmovnp_Gv_Ev, 4576 /* 0x4c */ iemOp_cmovl_Gv_Ev, iemOp_cmovnl_Gv_Ev, iemOp_cmovle_Gv_Ev, iemOp_cmovnle_Gv_Ev, 4983 /* 0x30 */ iemOp_wrmsr, 4984 /* 0x31 */ iemOp_rdtsc, 4985 /* 0x32 */ iemOp_rdmsr, 4986 /* 0x33 */ iemOp_rdpmc, 4987 /* 0x34 */ iemOp_sysenter, 4988 /* 0x35 */ iemOp_sysexit, 4989 /* 0x36 */ iemOp_Invalid, 4990 /* 0x37 */ iemOp_getsec, 4991 /* 0x38 */ iemOp_3byte_Esc_A4, 4992 /* 0x39 */ iemOp_Invalid, 4993 /* 0x3a */ iemOp_3byte_Esc_A5, 4994 /* 0x3b */ iemOp_Invalid, 4995 /* 0x3c */ iemOp_movnti_Gv_Ev/*??*/, 4996 /* 0x3d */ iemOp_Invalid, 4997 /* 0x3e */ iemOp_Invalid, 4998 /* 0x3f */ iemOp_Invalid, 4999 /* 0x40 */ iemOp_cmovo_Gv_Ev, 5000 /* 0x41 */ iemOp_cmovno_Gv_Ev, 5001 /* 0x42 */ iemOp_cmovc_Gv_Ev, 5002 /* 0x43 */ iemOp_cmovnc_Gv_Ev, 5003 /* 0x44 */ iemOp_cmove_Gv_Ev, 5004 /* 0x45 */ iemOp_cmovne_Gv_Ev, 5005 /* 0x46 */ iemOp_cmovbe_Gv_Ev, 5006 /* 0x47 */ iemOp_cmovnbe_Gv_Ev, 5007 /* 0x48 */ iemOp_cmovs_Gv_Ev, 5008 /* 0x49 */ iemOp_cmovns_Gv_Ev, 5009 /* 0x4a */ iemOp_cmovp_Gv_Ev, 5010 /* 0x4b */ iemOp_cmovnp_Gv_Ev, 5011 /* 0x4c */ iemOp_cmovl_Gv_Ev, 5012 /* 0x4d */ iemOp_cmovnl_Gv_Ev, 5013 /* 0x4e */ iemOp_cmovle_Gv_Ev, 5014 /* 0x4f */ iemOp_cmovnle_Gv_Ev, 4577 5015 /* 0x50 */ iemOp_movmskps_Gy_Ups__movmskpd_Gy_Upd, 4578 5016 /* 0x51 */ iemOp_sqrtps_Wps_Vps__sqrtpd_Wpd_Vpd__sqrtss_Vss_Wss__sqrtsd_Vsd_Wsd, … … 4615 5053 /* 0x76 */ iemOp_pcmped_Pq_Qq__pcmpeqd_Vdq_Wdq, 4616 5054 /* 0x77 */ iemOp_emms, 4617 /* 0x78 */ iemOp_vmread, iemOp_vmwrite, iemOp_Invalid, iemOp_Invalid, 5055 /* 0x78 */ iemOp_vmread_AmdGrp17, 5056 /* 0x79 */ iemOp_vmwrite, 5057 /* 0x7a */ iemOp_Invalid, 5058 /* 0x7b */ iemOp_Invalid, 4618 5059 /* 0x7c */ iemOp_haddpd_Vdp_Wpd__haddps_Vps_Wps, 4619 5060 /* 0x7d */ iemOp_hsubpd_Vpd_Wpd__hsubps_Vps_Wps, 4620 5061 /* 0x7e */ iemOp_movd_q_Ey_Pd__movd_q_Ey_Vy__movq_Vq_Wq, 4621 5062 /* 0x7f */ iemOp_movq_Qq_Pq__movq_movdqa_Wdq_Vdq__movdqu_Wdq_Vdq, 4622 /* 0x80 */ iemOp_jo_Jv, iemOp_jno_Jv, iemOp_jc_Jv, iemOp_jnc_Jv, 4623 /* 0x84 */ iemOp_je_Jv, iemOp_jne_Jv, iemOp_jbe_Jv, iemOp_jnbe_Jv, 4624 /* 0x88 */ iemOp_js_Jv, iemOp_jns_Jv, iemOp_jp_Jv, iemOp_jnp_Jv, 4625 /* 0x8c */ iemOp_jl_Jv, iemOp_jnl_Jv, iemOp_jle_Jv, iemOp_jnle_Jv, 4626 /* 0x90 */ iemOp_seto_Eb, iemOp_setno_Eb, iemOp_setc_Eb, iemOp_setnc_Eb, 4627 /* 0x94 */ iemOp_sete_Eb, iemOp_setne_Eb, iemOp_setbe_Eb, iemOp_setnbe_Eb, 4628 /* 0x98 */ iemOp_sets_Eb, iemOp_setns_Eb, iemOp_setp_Eb, iemOp_setnp_Eb, 4629 /* 0x9c */ iemOp_setl_Eb, iemOp_setnl_Eb, iemOp_setle_Eb, iemOp_setnle_Eb, 4630 /* 0xa0 */ iemOp_push_fs, iemOp_pop_fs, iemOp_cpuid, iemOp_bt_Ev_Gv, 4631 /* 0xa4 */ iemOp_shld_Ev_Gv_Ib, iemOp_shld_Ev_Gv_CL, iemOp_Invalid, iemOp_Invalid, 4632 /* 0xa8 */ iemOp_push_gs, iemOp_pop_gs, iemOp_rsm, iemOp_bts_Ev_Gv, 4633 /* 0xac */ iemOp_shrd_Ev_Gv_Ib, iemOp_shrd_Ev_Gv_CL, iemOp_Grp15, iemOp_imul_Gv_Ev, 4634 /* 0xb0 */ iemOp_cmpxchg_Eb_Gb, iemOp_cmpxchg_Ev_Gv, iemOp_lss_Gv_Mp, iemOp_btr_Ev_Gv, 4635 /* 0xb4 */ iemOp_lfs_Gv_Mp, iemOp_lgs_Gv_Mp, iemOp_movzx_Gv_Eb, iemOp_movzx_Gv_Ew, 4636 /* 0xb8 */ iemOp_popcnt_Gv_Ev_jmpe,iemOp_Grp10, iemOp_Grp8, iemOp_btc_Ev_Gv, 4637 /* 0xbc */ iemOp_bsf_Gv_Ev, iemOp_bsr_Gv_Ev, iemOp_movsx_Gv_Eb, iemOp_movsx_Gv_Ew, 5063 /* 0x80 */ iemOp_jo_Jv, 5064 /* 0x81 */ iemOp_jno_Jv, 5065 /* 0x82 */ iemOp_jc_Jv, 5066 /* 0x83 */ iemOp_jnc_Jv, 5067 /* 0x84 */ iemOp_je_Jv, 5068 /* 0x85 */ iemOp_jne_Jv, 5069 /* 0x86 */ iemOp_jbe_Jv, 5070 /* 0x87 */ iemOp_jnbe_Jv, 5071 /* 0x88 */ iemOp_js_Jv, 5072 /* 0x89 */ iemOp_jns_Jv, 5073 /* 0x8a */ iemOp_jp_Jv, 5074 /* 0x8b */ iemOp_jnp_Jv, 5075 /* 0x8c */ iemOp_jl_Jv, 5076 /* 0x8d */ iemOp_jnl_Jv, 5077 /* 0x8e */ iemOp_jle_Jv, 5078 /* 0x8f */ iemOp_jnle_Jv, 5079 /* 0x90 */ iemOp_seto_Eb, 5080 /* 0x91 */ iemOp_setno_Eb, 5081 /* 0x92 */ iemOp_setc_Eb, 5082 /* 0x93 */ iemOp_setnc_Eb, 5083 /* 0x94 */ iemOp_sete_Eb, 5084 /* 0x95 */ iemOp_setne_Eb, 5085 /* 0x96 */ iemOp_setbe_Eb, 5086 /* 0x97 */ iemOp_setnbe_Eb, 5087 /* 0x98 */ iemOp_sets_Eb, 5088 /* 0x99 */ iemOp_setns_Eb, 5089 /* 0x9a */ iemOp_setp_Eb, 5090 /* 0x9b */ iemOp_setnp_Eb, 5091 /* 0x9c */ iemOp_setl_Eb, 5092 /* 0x9d */ iemOp_setnl_Eb, 5093 /* 0x9e */ iemOp_setle_Eb, 5094 /* 0x9f */ iemOp_setnle_Eb, 5095 /* 0xa0 */ iemOp_push_fs, 5096 /* 0xa1 */ iemOp_pop_fs, 5097 /* 0xa2 */ iemOp_cpuid, 5098 /* 0xa3 */ iemOp_bt_Ev_Gv, 5099 /* 0xa4 */ iemOp_shld_Ev_Gv_Ib, 5100 /* 0xa5 */ iemOp_shld_Ev_Gv_CL, 5101 /* 0xa6 */ iemOp_Invalid, 5102 /* 0xa7 */ iemOp_Invalid, 5103 /* 0xa8 */ iemOp_push_gs, 5104 /* 0xa9 */ iemOp_pop_gs, 5105 /* 0xaa */ iemOp_rsm, 5106 /* 0xab */ iemOp_bts_Ev_Gv, 5107 /* 0xac */ iemOp_shrd_Ev_Gv_Ib, 5108 /* 0xad */ iemOp_shrd_Ev_Gv_CL, 5109 /* 0xae */ iemOp_Grp15, 5110 /* 0xaf */ iemOp_imul_Gv_Ev, 5111 /* 0xb0 */ iemOp_cmpxchg_Eb_Gb, 5112 /* 0xb1 */ iemOp_cmpxchg_Ev_Gv, 5113 /* 0xb2 */ iemOp_lss_Gv_Mp, 5114 /* 0xb3 */ iemOp_btr_Ev_Gv, 5115 /* 0xb4 */ iemOp_lfs_Gv_Mp, 5116 /* 0xb5 */ iemOp_lgs_Gv_Mp, 5117 /* 0xb6 */ iemOp_movzx_Gv_Eb, 5118 /* 0xb7 */ iemOp_movzx_Gv_Ew, 5119 /* 0xb8 */ iemOp_popcnt_Gv_Ev_jmpe, 5120 /* 0xb9 */ iemOp_Grp10, 5121 /* 0xba */ iemOp_Grp8, 5122 /* 0xbd */ iemOp_btc_Ev_Gv, 5123 /* 0xbc */ iemOp_bsf_Gv_Ev, 5124 /* 0xbd */ iemOp_bsr_Gv_Ev, 5125 /* 0xbe */ iemOp_movsx_Gv_Eb, 5126 /* 0xbf */ iemOp_movsx_Gv_Ew, 4638 5127 /* 0xc0 */ iemOp_xadd_Eb_Gb, 4639 5128 /* 0xc1 */ iemOp_xadd_Ev_Gv, … … 4644 5133 /* 0xc6 */ iemOp_shufps_Vps_Wps_Ib__shufdp_Vpd_Wpd_Ib, 4645 5134 /* 0xc7 */ iemOp_Grp9, 4646 /* 0xc8 */ iemOp_bswap_rAX_r8, iemOp_bswap_rCX_r9, iemOp_bswap_rDX_r10, iemOp_bswap_rBX_r11, 4647 /* 0xcc */ iemOp_bswap_rSP_r12, iemOp_bswap_rBP_r13, iemOp_bswap_rSI_r14, iemOp_bswap_rDI_r15, 5135 /* 0xc8 */ iemOp_bswap_rAX_r8, 5136 /* 0xc9 */ iemOp_bswap_rCX_r9, 5137 /* 0xca */ iemOp_bswap_rDX_r10, 5138 /* 0xcb */ iemOp_bswap_rBX_r11, 5139 /* 0xcc */ iemOp_bswap_rSP_r12, 5140 /* 0xcd */ iemOp_bswap_rBP_r13, 5141 /* 0xce */ iemOp_bswap_rSI_r14, 5142 /* 0xcf */ iemOp_bswap_rDI_r15, 4648 5143 /* 0xd0 */ iemOp_addsubpd_Vpd_Wpd__addsubps_Vps_Wps, 4649 5144 /* 0xd1 */ iemOp_psrlw_Pp_Qp__psrlw_Vdp_Wdq, … … 7001 7496 7002 7497 /** Opcode 0x82. */ 7003 7498 FNIEMOP_DEF(iemOp_Grp1_Eb_Ib_82) 7004 7499 { 7005 7500 IEMOP_HLP_NO_64BIT(); /** @todo do we need to decode the whole instruction or is this ok? */ … … 7791 8286 7792 8287 7793 /** Opcode 0x8f . */7794 FNIEMOP_DEF (iemOp_pop_Ev)8288 /** Opcode 0x8f /0. */ 8289 FNIEMOP_DEF_1(iemOp_pop_Ev, uint8_t, bRm) 7795 8290 { 7796 8291 /* This bugger is rather annoying as it requires rSP to be updated before … … 7805 8300 * now until tests show it's checked.. */ 7806 8301 IEMOP_MNEMONIC("pop Ev"); 7807 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);7808 8302 IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */ 7809 8303 … … 7817 8311 * Intel says that RSP is incremented before it's used in any effective 7818 8312 * address calcuations. This means some serious extra annoyance here since 7819 * we decode and ca clulate the effective address in one step and like to8313 * we decode and calculate the effective address in one step and like to 7820 8314 * delay committing registers till everything is done. 7821 8315 * … … 7892 8386 return VERR_IEM_IPE_2; 7893 8387 #endif 8388 } 8389 8390 8391 /** Opcode 0x8f. */ 8392 FNIEMOP_DEF(iemOp_Grp1A) 8393 { 8394 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 8395 if ((bRm & X86_MODRM_REG_MASK) != (0 << X86_MODRM_REG_SHIFT)) /* only pop Ev in this group. */ 8396 return IEMOP_RAISE_INVALID_OPCODE(); 8397 return FNIEMOP_CALL_1(iemOp_pop_Ev, bRm); 7894 8398 } 7895 8399 … … 9617 10121 IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */ 9618 10122 if ((bRm & X86_MODRM_REG_MASK) != (0 << X86_MODRM_REG_SHIFT)) /* only mov Eb,Ib in this group. */ 9619 return IEMOP_RAISE_INVALID_ LOCK_PREFIX();10123 return IEMOP_RAISE_INVALID_OPCODE(); 9620 10124 IEMOP_MNEMONIC("mov Eb,Ib"); 9621 10125 … … 9650 10154 IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */ 9651 10155 if ((bRm & X86_MODRM_REG_MASK) != (0 << X86_MODRM_REG_SHIFT)) /* only mov Eb,Ib in this group. */ 9652 return IEMOP_RAISE_INVALID_ LOCK_PREFIX();10156 return IEMOP_RAISE_INVALID_OPCODE(); 9653 10157 IEMOP_MNEMONIC("mov Ev,Iz"); 9654 10158 … … 14143 14647 return FNIEMOP_CALL_1(iemOp_grp3_test_Eb, bRm); 14144 14648 case 1: 14145 return IEMOP_RAISE_INVALID_ LOCK_PREFIX();14649 return IEMOP_RAISE_INVALID_OPCODE(); 14146 14650 case 2: 14147 14651 IEMOP_MNEMONIC("not Eb"); … … 14180 14684 return FNIEMOP_CALL_1(iemOp_grp3_test_Ev, bRm); 14181 14685 case 1: 14182 return IEMOP_RAISE_INVALID_ LOCK_PREFIX();14686 return IEMOP_RAISE_INVALID_OPCODE(); 14183 14687 case 2: 14184 14688 IEMOP_MNEMONIC("not Ev"); … … 14665 15169 /* 0x84 */ iemOp_test_Eb_Gb, iemOp_test_Ev_Gv, iemOp_xchg_Eb_Gb, iemOp_xchg_Ev_Gv, 14666 15170 /* 0x88 */ iemOp_mov_Eb_Gb, iemOp_mov_Ev_Gv, iemOp_mov_Gb_Eb, iemOp_mov_Gv_Ev, 14667 /* 0x8c */ iemOp_mov_Ev_Sw, iemOp_lea_Gv_M, iemOp_mov_Sw_Ev, iemOp_ pop_Ev,15171 /* 0x8c */ iemOp_mov_Ev_Sw, iemOp_lea_Gv_M, iemOp_mov_Sw_Ev, iemOp_Grp1A, 14668 15172 /* 0x90 */ iemOp_nop, iemOp_xchg_eCX_eAX, iemOp_xchg_eDX_eAX, iemOp_xchg_eBX_eAX, 14669 15173 /* 0x94 */ iemOp_xchg_eSP_eAX, iemOp_xchg_eBP_eAX, iemOp_xchg_eSI_eAX, iemOp_xchg_eDI_eAX, -
TabularUnified trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp ¶
r40256 r40266 25 25 #include <VBox/types.h> 26 26 #include <VBox/err.h> 27 #include <VBox/log.h> 27 28 #include "../include/IEMInternal.h" 28 29 … … 103 104 #define FNIEMOP_STUB_1(a_Name, a_Type0, a_Name0) \ 104 105 FNIEMOP_DEF_1(a_Name, a_Type0, a_Name0) { return VERR_NOT_IMPLEMENTED; } \ 106 typedef int ignore_semicolon 107 108 #define FNIEMOP_UD_STUB(a_Name) \ 109 FNIEMOP_DEF(a_Name) { return IEMOP_RAISE_INVALID_OPCODE(); } \ 110 typedef int ignore_semicolon 111 #define FNIEMOP_UD_STUB_1(a_Name, a_Type0, a_Name0) \ 112 FNIEMOP_DEF_1(a_Name, a_Type0, a_Name0) { return IEMOP_RAISE_INVALID_OPCODE(); } \ 105 113 typedef int ignore_semicolon 106 114
Note:
See TracChangeset
for help on using the changeset viewer.