Changeset 40001 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Feb 5, 2012 9:30:40 PM (13 years ago)
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 2 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,
Note:
See TracChangeset
for help on using the changeset viewer.