Changeset 40001 in vbox
- Timestamp:
- Feb 5, 2012 9:30:40 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 76112
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r39971 r40001 208 208 */ 209 209 #define IEM_IS_AMD_CPUID_FEATURE_PRESENT_ECX(a_fEcx) iemRegIsAmdCpuIdFeaturePresent(pIemCpu, 0, (a_fEcx)) 210 211 /** 212 * Tests if an AMD CPUID feature (extended) is marked present - EDX. 213 */ 214 #define IEM_IS_AMD_CPUID_FEATURE_PRESENT_EDX(a_fEdx) iemRegIsAmdCpuIdFeaturePresent(pIemCpu, (a_fEdx), 0) 215 216 /** 217 * Tests if at least on of the specified AMD CPUID features (extended) are 218 * marked present. 219 */ 220 #define IEM_IS_AMD_CPUID_FEATURES_ANY_PRESENT(a_fEdx, a_fEcx) iemRegIsAmdCpuIdFeaturePresent(pIemCpu, (a_fEdx), (a_fEcx)) 210 221 211 222 /** -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r40000 r40001 942 942 /** Opcode 0x0f 0x0b. */ 943 943 FNIEMOP_STUB(iemOp_ud2); 944 944 945 /** Opcode 0x0f 0x0d. */ 945 FNIEMOP_STUB(iemOp_nop_Ev_prefetch); 946 FNIEMOP_DEF(iemOp_nop_Ev_GrpP) 947 { 948 /* AMD prefetch group, Intel implements this as NOP Ev (and so do we). */ 949 if (!IEM_IS_AMD_CPUID_FEATURES_ANY_PRESENT(X86_CPUID_AMD_FEATURE_EDX_LONG_MODE | X86_CPUID_AMD_FEATURE_EDX_3DNOW, 950 X86_CPUID_AMD_FEATURE_ECX_3DNOWPRF)) 951 { 952 IEMOP_MNEMONIC("GrpP"); 953 return IEMOP_RAISE_INVALID_OPCODE(); 954 } 955 956 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 957 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 958 { 959 IEMOP_MNEMONIC("GrpP"); 960 return IEMOP_RAISE_INVALID_OPCODE(); 961 } 962 963 IEMOP_HLP_NO_LOCK_PREFIX(); 964 switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) 965 { 966 case 2: /* Aliased to /0 for the time being. */ 967 case 4: /* Aliased to /0 for the time being. */ 968 case 5: /* Aliased to /0 for the time being. */ 969 case 6: /* Aliased to /0 for the time being. */ 970 case 7: /* Aliased to /0 for the time being. */ 971 case 0: IEMOP_MNEMONIC("prefetch"); break; 972 case 1: IEMOP_MNEMONIC("prefetchw "); break; 973 case 3: IEMOP_MNEMONIC("prefetchw"); break; 974 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 975 } 976 977 IEM_MC_BEGIN(0, 1); 978 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 979 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm); 980 /* Currently a NOP. */ 981 IEM_MC_ADVANCE_RIP(); 982 IEM_MC_END(); 983 return VINF_SUCCESS; 984 } 985 986 946 987 /** Opcode 0x0f 0x0e. */ 947 988 FNIEMOP_STUB(iemOp_femms); … … 964 1005 /** Opcode 0x0f 0x17. */ 965 1006 FNIEMOP_STUB(iemOp_movhps_Mq_Vq__movhpd_Mq_Vq); 1007 1008 966 1009 /** Opcode 0x0f 0x18. */ 967 FNIEMOP_STUB(iemOp_prefetch_Grp16); 1010 FNIEMOP_DEF(iemOp_prefetch_Grp16) 1011 { 1012 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 1013 if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT)) 1014 { 1015 IEMOP_HLP_NO_LOCK_PREFIX(); 1016 switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) 1017 { 1018 case 4: /* Aliased to /0 for the time being according to AMD. */ 1019 case 5: /* Aliased to /0 for the time being according to AMD. */ 1020 case 6: /* Aliased to /0 for the time being according to AMD. */ 1021 case 7: /* Aliased to /0 for the time being according to AMD. */ 1022 case 0: IEMOP_MNEMONIC("prefetchNTA m8"); break; 1023 case 1: IEMOP_MNEMONIC("prefetchT0 m8"); break; 1024 case 2: IEMOP_MNEMONIC("prefetchT1 m8"); break; 1025 case 3: IEMOP_MNEMONIC("prefetchT2 m8"); break; 1026 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 1027 } 1028 1029 IEM_MC_BEGIN(0, 1); 1030 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 1031 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm); 1032 /* Currently a NOP. */ 1033 IEM_MC_ADVANCE_RIP(); 1034 IEM_MC_END(); 1035 return VINF_SUCCESS; 1036 } 1037 1038 return IEMOP_RAISE_INVALID_OPCODE(); 1039 } 1040 1041 1042 /** Opcode 0x0f 0x19..0x1f. */ 1043 FNIEMOP_DEF(iemOp_nop_Ev) 1044 { 1045 IEMOP_HLP_NO_LOCK_PREFIX(); 1046 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 1047 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 1048 { 1049 IEM_MC_BEGIN(0, 0); 1050 IEM_MC_ADVANCE_RIP(); 1051 IEM_MC_END(); 1052 } 1053 else 1054 { 1055 IEM_MC_BEGIN(0, 1); 1056 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 1057 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm); 1058 /* Currently a NOP. */ 1059 IEM_MC_ADVANCE_RIP(); 1060 IEM_MC_END(); 1061 } 1062 return VINF_SUCCESS; 1063 } 968 1064 969 1065 … … 3364 3460 3365 3461 default: 3366 IEMOP_RAISE_INVALID_OPCODE();3462 return IEMOP_RAISE_INVALID_OPCODE(); 3367 3463 } 3368 3464 } 3369 3370 3371 3372 if ((bRm & X86_MODRM_REG_MASK) != (0 << X86_MODRM_REG_SHIFT)) /* only mov Eb,Ib in this group. */3373 return IEMOP_RAISE_INVALID_LOCK_PREFIX();3374 IEMOP_MNEMONIC("mov Eb,Ib");3375 3376 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))3377 {3378 /* register access */3379 uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);3380 IEM_MC_BEGIN(0, 0);3381 IEM_MC_STORE_GREG_U8((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u8Imm);3382 IEM_MC_ADVANCE_RIP();3383 IEM_MC_END();3384 }3385 else3386 {3387 /* memory access. */3388 IEM_MC_BEGIN(0, 1);3389 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);3390 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm);3391 uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);3392 IEM_MC_STORE_MEM_U8(pIemCpu->iEffSeg, GCPtrEffDst, u8Imm);3393 IEM_MC_ADVANCE_RIP();3394 IEM_MC_END();3395 }3396 return VINF_SUCCESS;3397 3465 } 3398 3466 … … 4447 4515 /* 0x04 */ iemOp_Invalid, iemOp_syscall, iemOp_clts, iemOp_sysret, 4448 4516 /* 0x08 */ iemOp_invd, iemOp_wbinvd, iemOp_Invalid, iemOp_ud2, 4449 /* 0x0c */ iemOp_Invalid, iemOp_nop_Ev_ prefetch,iemOp_femms, iemOp_3Dnow,4517 /* 0x0c */ iemOp_Invalid, iemOp_nop_Ev_GrpP, iemOp_femms, iemOp_3Dnow, 4450 4518 /* 0x10 */ iemOp_movups_Vps_Wps__movupd_Vpd_Wpd__movss_Vss_Wss__movsd_Vsd_Wsd, 4451 4519 /* 0x11 */ iemOp_movups_Wps_Vps__movupd_Wpd_Vpd__movss_Wss_Vss__movsd_Vsd_Wsd, … … 4456 4524 /* 0x16 */ iemOp_movhps_Vq_Mq__movlhps_Vq_Uq__movhpd_Vq_Mq__movshdup_Vq_Wq, 4457 4525 /* 0x17 */ iemOp_movhps_Mq_Vq__movhpd_Mq_Vq, 4458 /* 0x18 */ iemOp_prefetch_Grp16, iemOp_ Invalid, iemOp_Invalid, iemOp_Invalid,4459 /* 0x1c */ iemOp_ Invalid, iemOp_Invalid, iemOp_Invalid, iemOp_Invalid,4526 /* 0x18 */ iemOp_prefetch_Grp16, iemOp_nop_Ev, iemOp_nop_Ev, iemOp_nop_Ev, 4527 /* 0x1c */ iemOp_nop_Ev, iemOp_nop_Ev, iemOp_nop_Ev, iemOp_nop_Ev, 4460 4528 /* 0x20 */ iemOp_mov_Rd_Cd, iemOp_mov_Rd_Dd, iemOp_mov_Cd_Rd, iemOp_mov_Dd_Rd, 4461 4529 /* 0x24 */ iemOp_mov_Rd_Td, iemOp_Invalid, iemOp_mov_Td_Rd, iemOp_Invalid, -
trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp
r39970 r40001 112 112 #define IEM_IS_REAL_MODE(a_pIemCpu) (g_fRandom) 113 113 #define IEM_IS_AMD_CPUID_FEATURE_PRESENT_ECX(a_fEcx) (g_fRandom) 114 #define IEM_IS_AMD_CPUID_FEATURE_PRESENT_EDX(a_fEdx) (g_fRandom) 115 #define IEM_IS_AMD_CPUID_FEATURES_ANY_PRESENT(a_fEdx, a_fEcx) (g_fRandom) 114 116 #define IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX(a_fEdx) (g_fRandom) 115 117 -
trunk/src/VBox/VMM/testcase/tstX86-1.cpp
r39999 r40001 69 69 DECLASM(int32_t) x861_Test2(void); 70 70 DECLASM(int32_t) x861_Test3(void); 71 DECLASM(int32_t) x861_Test4(void); 71 72 72 73 … … 227 228 RTTestFailed(hTest, "x861_Test2 -> %d", rc); 228 229 229 #endif230 230 RTTestSub(hTest, "fxsave / fxrstor and #PFs"); 231 231 rc = x861_Test3(); 232 232 if (rc != 0) 233 233 RTTestFailed(hTest, "x861_Test3 -> %d", rc); 234 #endif 235 RTTestSub(hTest, "Multibyte NOPs"); 236 rc = x861_Test4(); 237 if (rc != 0) 238 RTTestFailed(hTest, "x861_Test4 -> %d", rc); 234 239 } 235 240 -
trunk/src/VBox/VMM/testcase/tstX86-1A.asm
r39998 r40001 1219 1219 1220 1220 ;; 1221 ; Tests various multibyte NOP sequences. 1222 ; 1223 BEGINPROC x861_Test4 1224 SAVE_ALL_PROLOGUE 1225 call x861_ClearRegisters 1226 1227 ; Intel recommended sequences. 1228 nop 1229 db 066h, 090h 1230 db 00fh, 01fh, 000h 1231 db 00fh, 01fh, 040h, 000h 1232 db 00fh, 01fh, 044h, 000h, 000h 1233 db 066h, 00fh, 01fh, 044h, 000h, 000h 1234 db 00fh, 01fh, 080h, 000h, 000h, 000h, 000h 1235 db 00fh, 01fh, 084h, 000h, 000h, 000h, 000h, 000h 1236 db 066h, 00fh, 01fh, 084h, 000h, 000h, 000h, 000h, 000h 1237 1238 ; Check that the NOPs are allergic to lock prefixing. 1239 ShouldTrap X86_XCPT_UD, db 0f0h, 090h ; lock prefixed NOP. 1240 ShouldTrap X86_XCPT_UD, db 0f0h, 066h, 090h ; lock prefixed two byte NOP. 1241 ShouldTrap X86_XCPT_UD, db 0f0h, 00fh, 01fh, 000h ; lock prefixed three byte NOP. 1242 1243 ; Check the range of instructions that AMD marks as NOPs. 1244 %macro TST_NOP 1 1245 db 00fh, %1, 000h 1246 db 00fh, %1, 040h, 000h 1247 db 00fh, %1, 044h, 000h, 000h 1248 db 066h, 00fh, %1, 044h, 000h, 000h 1249 db 00fh, %1, 080h, 000h, 000h, 000h, 000h 1250 db 00fh, %1, 084h, 000h, 000h, 000h, 000h, 000h 1251 db 066h, 00fh, %1, 084h, 000h, 000h, 000h, 000h, 000h 1252 ShouldTrap X86_XCPT_UD, db 0f0h, 00fh, %1, 000h 1253 %endmacro 1254 TST_NOP 019h 1255 TST_NOP 01ah 1256 TST_NOP 01bh 1257 TST_NOP 01ch 1258 TST_NOP 01dh 1259 TST_NOP 01eh 1260 TST_NOP 01fh 1261 1262 ; The AMD P group, intel marks this as a NOP. 1263 TST_NOP 00dh 1264 1265 .success: 1266 xor eax, eax 1267 .return: 1268 SAVE_ALL_EPILOGUE 1269 ret 1270 ENDPROC x861_Test4 1271 1272 ;; 1221 1273 ; Terminate the trap info array with a NIL entry. 1222 1274 BEGINDATA
Note:
See TracChangeset
for help on using the changeset viewer.