Changeset 66403 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Apr 3, 2017 3:21:26 PM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 114356
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
r66227 r66403 2528 2528 } 2529 2529 2530 2531 /** 2532 * Gets the guest MXCSR_MASK value. 2533 * 2534 * This does not access the x87 state, but the value we determined at VM 2535 * initialization. 2536 * 2537 * @returns MXCSR mask. 2538 * @param pVM The cross context VM structure. 2539 */ 2540 VMMDECL(uint32_t) CPUMGetGuestMxCsrMask(PVM pVM) 2541 { 2542 return pVM->cpum.s.GuestInfo.fMxCsrMask; 2543 } 2544 -
trunk/src/VBox/VMM/VMMR3/CPUM.cpp
r66276 r66403 884 884 } 885 885 886 pVM->cpum.s.fHostMxCsrMask = CPUMR3DeterminHostMxCsrMask(); 887 886 888 PCPUMCPUIDLEAF paLeaves; 887 889 uint32_t cLeaves; -
trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp
r66331 r66403 550 550 551 551 552 /** 553 * Determins the host CPU MXCSR mask. 554 * 555 * @returns MXCSR mask. 556 */ 557 VMMR3DECL(uint32_t) CPUMR3DeterminHostMxCsrMask(void) 558 { 559 if ( ASMHasCpuId() 560 && ASMIsValidStdRange(ASMCpuId_EAX(0)) 561 && ASMCpuId_EDX(1) & X86_CPUID_FEATURE_EDX_FXSR) 562 { 563 uint8_t volatile abBuf[sizeof(X86FXSTATE) + 64]; 564 PX86FXSTATE pState = (PX86FXSTATE)&abBuf[64 - ((uintptr_t)&abBuf[0] & 63)]; 565 RT_ZERO(*pState); 566 ASMFxSave(pState); 567 if (pState->MXCSR_MASK == 0) 568 return 0xffbf; 569 return pState->MXCSR_MASK; 570 } 571 return 0; 572 } 573 552 574 553 575 /** … … 3982 4004 : rc; 3983 4005 4006 if (pCpum->GuestInfo.fMxCsrMask & ~pVM->cpum.s.fHostMxCsrMask) 4007 { 4008 LogRel(("Stripping unsupported MXCSR bits from guest mask: %#x -> %#x (host: %#x)\n", pCpum->GuestInfo.fMxCsrMask, 4009 pCpum->GuestInfo.fMxCsrMask & pVM->cpum.s.fHostMxCsrMask, pVM->cpum.s.fHostMxCsrMask)); 4010 pCpum->GuestInfo.fMxCsrMask &= pVM->cpum.s.fHostMxCsrMask; 4011 } 4012 LogRel(("CPUM: MXCSR_MASK=%#x (host: %#x)\n", pCpum->GuestInfo.fMxCsrMask, pVM->cpum.s.fHostMxCsrMask)); 4013 3984 4014 /** @cfgm{/CPUM/MSRs/[Name]/[First|Last|Type|Value|...],} 3985 4015 * Overrides the guest MSRs. -
trunk/src/VBox/VMM/VMMR3/CPUMR3Db.cpp
r63820 r66403 58 58 * the value in CPUID leaf 0x80000008 when present. */ 59 59 uint8_t cMaxPhysAddrWidth; 60 /** The MXCSR mask. */ 61 uint32_t fMxCsrMask; 60 62 /** Pointer to an array of CPUID leaves. */ 61 63 PCCPUMCPUIDLEAF paCpuIdLeaves; … … 67 69 CPUMCPUID DefUnknownCpuId; 68 70 69 /** MSR mask. Several microarchitectures ignore higher bits of the */ 71 /** MSR mask. Several microarchitectures ignore the higher bits of ECX in 72 * the RDMSR and WRMSR instructions. */ 70 73 uint32_t fMsrMask; 71 74 … … 800 803 if (RT_FAILURE(rc)) 801 804 return rc; 805 pInfo->fMxCsrMask = CPUMR3DeterminHostMxCsrMask(); 802 806 803 807 /* Lookup database entry for MSRs. */ … … 917 921 918 922 pInfo->enmUnknownCpuIdMethod = pEntry->enmUnknownCpuId; 919 pInfo->DefCpuId = pEntry->DefUnknownCpuId; 923 pInfo->DefCpuId = pEntry->DefUnknownCpuId; 924 pInfo->fMxCsrMask = pEntry->fMxCsrMask; 920 925 921 926 LogRel(("CPUM: Using CPU DB entry '%s' (%s %#x/%#x/%#x %s)\n", … … 926 931 pInfo->fMsrMask = pEntry->fMsrMask; 927 932 pInfo->iFirstExtCpuIdLeaf = 0; /* Set by caller. */ 928 pInfo->uPadding = 0;929 933 pInfo->uScalableBusFreq = pEntry->uScalableBusFreq; 930 934 pInfo->paCpuIdLeavesR0 = NIL_RTR0PTR; -
trunk/src/VBox/VMM/VMMR3/cpus/AMD_Athlon_64_3200.h
r62478 r66403 208 208 /*.fFlags = */ 0, 209 209 /*.cMaxPhysAddrWidth= */ 40, 210 /*.fMxCsrMask = */ 0xffff, ///< @todo check. 210 211 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_AMD_Athlon_64_3200), 211 212 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_AMD_Athlon_64_3200)), -
trunk/src/VBox/VMM/VMMR3/cpus/AMD_Athlon_64_X2_Dual_Core_4200.h
r62478 r66403 216 216 /*.fFlags = */ 0, 217 217 /*.cMaxPhysAddrWidth= */ 40, 218 /*.fMxCsrMask = */ 0xffff, 218 219 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_AMD_Athlon_64_X2_Dual_Core_4200), 219 220 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_AMD_Athlon_64_X2_Dual_Core_4200)), -
trunk/src/VBox/VMM/VMMR3/cpus/AMD_FX_8150_Eight_Core.h
r62478 r66403 367 367 /*.fFlags = */ 0, 368 368 /*.cMaxPhysAddrWidth= */ 48, 369 /*.fMxCsrMask = */ 0x2ffff, 369 370 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_AMD_FX_8150_Eight_Core), 370 371 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_AMD_FX_8150_Eight_Core)), -
trunk/src/VBox/VMM/VMMR3/cpus/AMD_Phenom_II_X6_1100T.h
r62478 r66403 256 256 /*.fFlags = */ 0, 257 257 /*.cMaxPhysAddrWidth= */ 48, 258 /*.fMxCsrMask = */ 0x2ffff, 258 259 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_AMD_Phenom_II_X6_1100T), 259 260 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_AMD_Phenom_II_X6_1100T)), -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_80186.h
r60411 r66403 59 59 /*.fFlags = */ CPUDB_F_EXECUTE_ALL_IN_IEM, 60 60 /*.cMaxPhysAddrWidth= */ 20, 61 /*.fMxCsrMask = */ 0, 61 62 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_80186), 62 63 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_80186)), -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_80286.h
r60411 r66403 59 59 /*.fFlags = */ CPUDB_F_EXECUTE_ALL_IN_IEM, 60 60 /*.cMaxPhysAddrWidth= */ 24, 61 /*.fMxCsrMask = */ 0, 61 62 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_80286), 62 63 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_80286)), -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_80386.h
r60664 r66403 59 59 /*.fFlags = */ CPUDB_F_EXECUTE_ALL_IN_IEM, 60 60 /*.cMaxPhysAddrWidth= */ 24, 61 /*.fMxCsrMask = */ 0, 61 62 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_80386), 62 63 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_80386)), -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_8086.h
r60411 r66403 59 59 /*.fFlags = */ CPUDB_F_EXECUTE_ALL_IN_IEM, 60 60 /*.cMaxPhysAddrWidth= */ 20, 61 /*.fMxCsrMask = */ 0, 61 62 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_8086), 62 63 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_8086)), -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_Atom_330_1_60GHz.h
r62478 r66403 194 194 /*.fFlags = */ 0, 195 195 /*.cMaxPhysAddrWidth= */ 32, 196 /*.fMxCsrMask = */ 0xffff, 196 197 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Atom_330_1_60GHz), 197 198 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Atom_330_1_60GHz)), -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_Core_i5_3570.h
r62478 r66403 323 323 /*.fFlags = */ 0, 324 324 /*.cMaxPhysAddrWidth= */ 36, 325 /*.fMxCsrMask = */ 0xffff, 325 326 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Core_i5_3570), 326 327 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Core_i5_3570)), -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_2635QM.h
r62478 r66403 316 316 /*.fFlags = */ 0, 317 317 /*.cMaxPhysAddrWidth= */ 36, 318 /*.fMxCsrMask = */ 0xffff, 318 319 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Core_i7_2635QM), 319 320 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Core_i7_2635QM)), -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_3960X.h
r62478 r66403 353 353 /*.fFlags = */ 0, 354 354 /*.cMaxPhysAddrWidth= */ 46, 355 /*.fMxCsrMask = */ 0xffff, 355 356 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Core_i7_3960X), 356 357 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Core_i7_3960X)), -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_5600U.h
r62478 r66403 352 352 /*.fFlags = */ 0, 353 353 /*.cMaxPhysAddrWidth= */ 39, 354 /*.fMxCsrMask = */ 0xffff, 354 355 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Core_i7_5600U), 355 356 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Core_i7_5600U)), -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_6700K.h
r62478 r66403 494 494 /*.fFlags = */ 0, 495 495 /*.cMaxPhysAddrWidth= */ 39, 496 /*.fMxCsrMask = */ 0xffff, 496 497 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Core_i7_6700K), 497 498 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Core_i7_6700K)), -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_Pentium_4_3_00GHz.h
r62478 r66403 261 261 /*.fFlags = */ 0, 262 262 /*.cMaxPhysAddrWidth= */ 36, 263 /*.fMxCsrMask = */ 0xffff, 263 264 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Pentium_4_3_00GHz), 264 265 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Pentium_4_3_00GHz)), -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_Pentium_M_processor_2_00GHz.h
r62478 r66403 200 200 /*.fFlags = */ 0, 201 201 /*.cMaxPhysAddrWidth= */ 32, 202 /*.fMxCsrMask = */ 0xffbf, ///< @todo check this 202 203 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Pentium_M_processor_2_00GHz), 203 204 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Pentium_M_processor_2_00GHz)), -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_Pentium_N3530_2_16GHz.h
r62478 r66403 249 249 /*.fFlags = */ 0, 250 250 /*.cMaxPhysAddrWidth= */ 36, 251 /*.fMxCsrMask = */ 0xffff, 251 252 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Pentium_N3530_2_16GHz), 252 253 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Pentium_N3530_2_16GHz)), -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_Xeon_X5482_3_20GHz.h
r62478 r66403 229 229 /*.fFlags = */ 0, 230 230 /*.cMaxPhysAddrWidth= */ 38, 231 /*.fMxCsrMask = */ 0xffff, 231 232 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_Xeon_X5482_3_20GHz), 232 233 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_Xeon_X5482_3_20GHz)), -
trunk/src/VBox/VMM/VMMR3/cpus/Quad_Core_AMD_Opteron_2384.h
r62478 r66403 254 254 /*.fFlags = */ 0, 255 255 /*.cMaxPhysAddrWidth= */ 48, 256 /*.fMxCsrMask = */ 0x2ffff, 256 257 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Quad_Core_AMD_Opteron_2384), 257 258 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Quad_Core_AMD_Opteron_2384)), -
trunk/src/VBox/VMM/VMMR3/cpus/VIA_QuadCore_L4700_1_2_GHz.h
r62478 r66403 388 388 /*.fFlags = */ 0, 389 389 /*.cMaxPhysAddrWidth= */ 36, 390 /*.fMxCsrMask = */ 0xffff, 390 391 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_VIA_QuadCore_L4700_1_2_GHz), 391 392 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_VIA_QuadCore_L4700_1_2_GHz)), -
trunk/src/VBox/VMM/include/CPUMInternal.h
r62478 r66403 157 157 uint32_t fMsrMask; 158 158 159 /** MXCSR mask. */ 160 uint32_t fMxCsrMask; 161 159 162 /** The number of CPUID leaves (CPUMCPUIDLEAF) in the array pointed to below. */ 160 163 uint32_t cCpuIdLeaves; … … 162 165 * Set to cCpuIdLeaves if none present. */ 163 166 uint32_t iFirstExtCpuIdLeaf; 164 /** Alignment padding. */165 uint32_t uPadding;166 167 /** How to handle unknown CPUID leaves. */ 167 168 CPUMUNKNOWNCPUID enmUnknownCpuIdMethod; … … 403 404 * to the guest. This is 0 if no XSAVE/XRSTOR bits can be exposed. */ 404 405 uint64_t fXStateHostMask; 405 uint8_t abPadding1[24]; 406 407 /** The host MXCSR mask (determined at init). */ 408 uint32_t fHostMxCsrMask; 409 uint8_t abPadding1[20]; 406 410 407 411 /** Host CPU feature information. … … 499 503 bool fCpuIdApicFeatureVisible; 500 504 501 /** Align the next member on a 64-b itboundrary. */505 /** Align the next member on a 64-byte boundrary. */ 502 506 uint8_t abPadding2[64 - 16 - (HC_ARCH_BITS == 64 ? 8 : 4) - 4 - 1 - 3]; 503 507 -
trunk/src/VBox/VMM/include/CPUMInternal.mac
r66276 r66403 39 39 .cMsrRanges resd 1 ; uint32_t 40 40 .fMsrMask resd 1 ; uint32_t 41 .fMxCsrMask resd 1 ; uint32_t 41 42 .cCpuIdLeaves resd 1 ; uint32_t 42 43 .iFirstExtCpuIdLeaf resd 1 ; uint32_t 43 .uPadding resd 1 ; uint32_t44 44 .enmUnknownCpuIdMethod resd 1 ; CPUMUNKNOWNCPUID 45 45 .DefCpuId resb CPUMCPUID_size ; CPUMCPUID -
trunk/src/VBox/VMM/tools/VBoxCpuReport.cpp
r66104 r66403 71 71 /** The alternative debug stream. */ 72 72 static PRTSTREAM g_pDebugOut; 73 /** Whether to skip MSR collection. */ 74 static bool g_fNoMsrs = false; 73 75 74 76 /** Snooping info storage for vbCpuRepGuessScalableBusFrequencyName. */ … … 163 165 { 164 166 uint8_t cMaxWidth; 165 uint32_t cMaxExt = ASMCpuId_EAX(0x80000000);166 167 if (!ASMHasCpuId()) 167 168 cMaxWidth = 32; 168 else if (ASMIsValidExtRange(cMaxExt)&& cMaxExt >= 0x80000008)169 cMaxWidth = ASMCpuId_EAX(0x80000008) & 0xff;170 else if ( ASMIsValidStdRange(ASMCpuId_EAX(0))171 && (ASMCpuId_EDX(1) & X86_CPUID_FEATURE_EDX_PSE36))172 cMaxWidth = 36;173 169 else 174 cMaxWidth = 32; 170 { 171 uint32_t cMaxExt = ASMCpuId_EAX(0x80000000); 172 if (ASMIsValidExtRange(cMaxExt)&& cMaxExt >= 0x80000008) 173 cMaxWidth = ASMCpuId_EAX(0x80000008) & 0xff; 174 else if ( ASMIsValidStdRange(ASMCpuId_EAX(0)) 175 && (ASMCpuId_EDX(1) & X86_CPUID_FEATURE_EDX_PSE36)) 176 cMaxWidth = 36; 177 else 178 cMaxWidth = 32; 179 } 175 180 return cMaxWidth; 176 181 } … … 4331 4336 return VINF_SUCCESS; 4332 4337 } 4338 if (g_fNoMsrs) 4339 { 4340 vbCpuRepDebug("Skipping MSR probing (--no-msr).\n"); 4341 return VINF_SUCCESS; 4342 } 4333 4343 4334 4344 /* … … 4718 4728 " /*.fFlags = */ 0,\n" 4719 4729 " /*.cMaxPhysAddrWidth= */ %u,\n" 4730 " /*.fMxCsrMask = */ %#010x,\n" 4720 4731 " /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_%s),\n" 4721 4732 " /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_%s)),\n" … … 4740 4751 vbCpuRepGuessScalableBusFrequencyName(), 4741 4752 vbCpuRepGetPhysAddrWidth(), 4753 CPUMR3DeterminHostMxCsrMask(), 4742 4754 szNameC, 4743 4755 szNameC, … … 4770 4782 { "--msrs-only", 'm', RTGETOPT_REQ_NOTHING }, 4771 4783 { "--msrs-dev", 'd', RTGETOPT_REQ_NOTHING }, 4784 { "--no-msrs", 'n', RTGETOPT_REQ_NOTHING }, 4772 4785 { "--output", 'o', RTGETOPT_REQ_STRING }, 4773 4786 { "--log", 'l', RTGETOPT_REQ_STRING }, … … 4801 4814 break; 4802 4815 4816 case 'n': 4817 g_fNoMsrs = true; 4818 break; 4819 4803 4820 case 'o': 4804 4821 pszOutput = ValueUnion.psz; … … 4810 4827 4811 4828 case 'h': 4812 RTPrintf("Usage: VBoxCpuReport [-m|--msrs-only] [-d|--msrs-dev] [- h|--help] [-V|--version] [-o filename.h] [-l debug.log]\n");4829 RTPrintf("Usage: VBoxCpuReport [-m|--msrs-only] [-d|--msrs-dev] [-n|--no-msrs] [-h|--help] [-V|--version] [-o filename.h] [-l debug.log]\n"); 4813 4830 RTPrintf("Internal tool for gathering information to the VMM CPU database.\n"); 4814 4831 return RTEXITCODE_SUCCESS;
Note:
See TracChangeset
for help on using the changeset viewer.