Changeset 55114 in vbox
- Timestamp:
- Apr 7, 2015 1:30:16 PM (9 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
-
VMMR3/CPUM.cpp (modified) (2 diffs)
-
VMMR3/CPUMR3CpuId.cpp (modified) (4 diffs)
-
include/CPUMInternal.h (modified) (3 diffs)
-
include/CPUMInternal.mac (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/CPUM.cpp
r55063 r55114 647 647 648 648 /* 649 * Allocate memory for the extended CPU state. 649 * Figure out which XSAVE/XRSTOR features are available on the host. 650 */ 651 uint64_t fXStateHostMask = 0; 652 if ( pVM->cpum.s.HostFeatures.fXSaveRstor 653 && pVM->cpum.s.HostFeatures.fOpSysXSaveRstor) 654 { 655 fXStateHostMask = ASMGetXcr0() & ( XSAVE_C_X87 | XSAVE_C_SSE | XSAVE_C_YMM | XSAVE_C_OPMASK 656 | XSAVE_C_ZMM_HI256 | XSAVE_C_ZMM_16HI); 657 AssertLogRelMsgStmt((fXStateHostMask & (XSAVE_C_X87 | XSAVE_C_SSE)) == (XSAVE_C_X87 | XSAVE_C_SSE), 658 ("%#llx\n", fXStateHostMask), fXStateHostMask = 0); 659 } 660 pVM->cpum.s.fXStateHostMask = fXStateHostMask; 661 if (!HMIsEnabled(pVM)) /* For raw-mode, we only use XSAVE/XRSTOR when the guest starts using it (CPUID/CR4 visibility). */ 662 fXStateHostMask = 0; 663 LogRel(("CPUML: fXStateHostMask=%#llx; initial: %#llx\n", pVM->cpum.s.fXStateHostMask, fXStateHostMask)); 664 665 /* 666 * Allocate memory for the extended CPU state and initialize the host XSAVE/XRSTOR mask. 650 667 */ 651 668 uint32_t cbMaxXState = pVM->cpum.s.HostFeatures.cbMaxExtendedState; … … 676 693 pVCpu->cpum.s.Hyper.pXStateRC = MMHyperR3ToR0(pVM, pbXStates); 677 694 pbXStates += cbMaxXState; 695 696 pVCpu->cpum.s.Host.fXStateMask = fXStateHostMask; 678 697 } 679 698 -
trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp
r55062 r55114 1509 1509 1510 1510 /* Linear sub-leaf search. Lazy as usual. */ 1511 cLeaves = pLeaf - paLeaves;1511 cLeaves -= pLeaf - paLeaves; 1512 1512 while ( cLeaves-- > 0 1513 1513 && pLeaf->uLeaf == uLeaf) … … 1529 1529 AssertLogRelReturn(paLeaves[0].uLeaf == 0, VERR_CPUM_IPE_1); 1530 1530 AssertLogRelReturn(paLeaves[1].uLeaf == 1, VERR_CPUM_IPE_1); 1531 1532 pFeatures->enmCpuVendor = CPUMR3CpuIdDetectVendorEx(paLeaves[0].uEax, 1533 paLeaves[0].uEbx, 1534 paLeaves[0].uEcx, 1535 paLeaves[0].uEdx); 1536 pFeatures->uFamily = ASMGetCpuFamily(paLeaves[1].uEax); 1537 pFeatures->uModel = ASMGetCpuModel(paLeaves[1].uEax, pFeatures->enmCpuVendor == CPUMCPUVENDOR_INTEL); 1538 pFeatures->uStepping = ASMGetCpuStepping(paLeaves[1].uEax); 1531 PCCPUMCPUIDLEAF const pStd0Leaf = cpumR3CpuIdFindLeafEx(paLeaves, cLeaves, 0, 0); 1532 AssertLogRelReturn(pStd0Leaf, VERR_CPUM_IPE_1); 1533 PCCPUMCPUIDLEAF const pStd1Leaf = cpumR3CpuIdFindLeafEx(paLeaves, cLeaves, 1, 0); 1534 AssertLogRelReturn(pStd1Leaf, VERR_CPUM_IPE_1); 1535 1536 pFeatures->enmCpuVendor = CPUMR3CpuIdDetectVendorEx(pStd0Leaf->uEax, 1537 pStd0Leaf->uEbx, 1538 pStd0Leaf->uEcx, 1539 pStd0Leaf->uEdx); 1540 pFeatures->uFamily = ASMGetCpuFamily(pStd1Leaf->uEax); 1541 pFeatures->uModel = ASMGetCpuModel(pStd1Leaf->uEax, pFeatures->enmCpuVendor == CPUMCPUVENDOR_INTEL); 1542 pFeatures->uStepping = ASMGetCpuStepping(pStd1Leaf->uEax); 1539 1543 pFeatures->enmMicroarch = CPUMR3CpuIdDetermineMicroarchEx((CPUMCPUVENDOR)pFeatures->enmCpuVendor, 1540 1544 pFeatures->uFamily, … … 1545 1549 if (pLeaf) 1546 1550 pFeatures->cMaxPhysAddrWidth = pLeaf->uEax & 0xff; 1547 else if (p aLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_PSE36)1551 else if (pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_PSE36) 1548 1552 pFeatures->cMaxPhysAddrWidth = 36; 1549 1553 else … … 1551 1555 1552 1556 /* Standard features. */ 1553 pFeatures->fMsr = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_MSR); 1554 pFeatures->fApic = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_APIC); 1555 pFeatures->fX2Apic = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_X2APIC); 1556 pFeatures->fPse = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_PSE); 1557 pFeatures->fPse36 = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_PSE36); 1558 pFeatures->fPae = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_PAE); 1559 pFeatures->fPat = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_PAT); 1560 pFeatures->fFxSaveRstor = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_FXSR); 1561 pFeatures->fXSaveRstor = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_XSAVE); 1562 pFeatures->fMmx = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_MMX); 1563 pFeatures->fSse = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_SSE); 1564 pFeatures->fSse2 = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_SSE2); 1565 pFeatures->fSse3 = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_SSE3); 1566 pFeatures->fSsse3 = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_SSSE3); 1567 pFeatures->fSse41 = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_SSE4_1); 1568 pFeatures->fSse42 = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_SSE4_2); 1569 pFeatures->fAvx = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_AVX); 1570 pFeatures->fTsc = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_TSC); 1571 pFeatures->fSysEnter = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_SEP); 1572 pFeatures->fHypervisorPresent = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_HVP); 1573 pFeatures->fMonitorMWait = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_MONITOR); 1557 pFeatures->fMsr = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_MSR); 1558 pFeatures->fApic = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_APIC); 1559 pFeatures->fX2Apic = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_X2APIC); 1560 pFeatures->fPse = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_PSE); 1561 pFeatures->fPse36 = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_PSE36); 1562 pFeatures->fPae = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_PAE); 1563 pFeatures->fPat = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_PAT); 1564 pFeatures->fFxSaveRstor = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_FXSR); 1565 pFeatures->fXSaveRstor = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_XSAVE); 1566 pFeatures->fOpSysXSaveRstor = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_OSXSAVE); 1567 pFeatures->fMmx = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_MMX); 1568 pFeatures->fSse = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_SSE); 1569 pFeatures->fSse2 = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_SSE2); 1570 pFeatures->fSse3 = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_SSE3); 1571 pFeatures->fSsse3 = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_SSSE3); 1572 pFeatures->fSse41 = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_SSE4_1); 1573 pFeatures->fSse42 = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_SSE4_2); 1574 pFeatures->fAvx = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_AVX); 1575 pFeatures->fTsc = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_TSC); 1576 pFeatures->fSysEnter = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_SEP); 1577 pFeatures->fHypervisorPresent = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_HVP); 1578 pFeatures->fMonitorMWait = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_MONITOR); 1574 1579 1575 1580 /* Structured extended features. */ -
trunk/src/VBox/VMM/include/CPUMInternal.h
r55106 r55114 191 191 /** Supports the XSAVE and XRSTOR instructions. */ 192 192 uint32_t fXSaveRstor : 1; 193 /** The XSAVE/XRSTOR bit in CR4 has been set (only applicable for host!). */ 194 uint32_t fOpSysXSaveRstor : 1; 193 195 /** Supports MMX. */ 194 196 uint32_t fMmx : 1; … … 243 245 244 246 /** Alignment padding / reserved for future use. */ 245 uint32_t fPadding : 2;247 uint32_t fPadding : 1; 246 248 uint64_t auPadding[2]; 247 249 } CPUMFEATURES; … … 526 528 /** Host CPU feature information. */ 527 529 CPUMFEATURES HostFeatures; 530 /** XSAVE/XRSTOR host mask. Only state components in this mask can be exposed 531 * to the guest. This is 0 if no XSAVE/XRSTOR bits can be exposed. */ 532 uint64_t fXStateHostMask; 528 533 529 534 /** @name MSR statistics. -
trunk/src/VBox/VMM/include/CPUMInternal.mac
r55106 r55114 103 103 .GuestFeatures resb 32 104 104 .HostFeatures resb 32 105 .fXStateHostMask resq 1 105 106 106 107 .cMsrWrites resq 1
Note:
See TracChangeset
for help on using the changeset viewer.

