Changeset 55229 in vbox for trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
- Timestamp:
- Apr 14, 2015 6:35:43 AM (10 years ago)
- svn:sync-xref-src-repo-rev:
- 99536
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
r55062 r55229 49 49 # pragma optimize("y", off) 50 50 #endif 51 52 AssertCompile2MemberOffsets(VM, cpum.s.HostFeatures, cpum.ro.HostFeatures); 53 AssertCompile2MemberOffsets(VM, cpum.s.GuestFeatures, cpum.ro.GuestFeatures); 51 54 52 55 … … 742 745 VMMDECL(int) CPUMSetGuestCR4(PVMCPU pVCpu, uint64_t cr4) 743 746 { 744 if ( (cr4 & (X86_CR4_PGE | X86_CR4_PAE | X86_CR4_PSE)) 745 != (pVCpu->cpum.s.Guest.cr4 & (X86_CR4_PGE | X86_CR4_PAE | X86_CR4_PSE))) 747 /* 748 * The CR4.OSXSAVE bit is reflected in CPUID(1).ECX[27]. 749 */ 750 if ( (cr4 & X86_CR4_OSXSAVE) 751 != (pVCpu->cpum.s.Guest.cr4 & X86_CR4_OSXSAVE) ) 752 { 753 PVM pVM = pVCpu->CTX_SUFF(pVM); 754 if (cr4 & X86_CR4_OSXSAVE) 755 CPUMSetGuestCpuIdFeature(pVM, CPUMCPUIDFEATURE_OSXSAVE); 756 else 757 CPUMClearGuestCpuIdFeature(pVM, CPUMCPUIDFEATURE_OSXSAVE); 758 } 759 760 if ( (cr4 & (X86_CR4_PGE | X86_CR4_PAE | X86_CR4_PSE)) 761 != (pVCpu->cpum.s.Guest.cr4 & (X86_CR4_PGE | X86_CR4_PAE | X86_CR4_PSE))) 746 762 pVCpu->cpum.s.fChanged |= CPUM_CHANGED_GLOBAL_TLB_FLUSH; 763 747 764 pVCpu->cpum.s.fChanged |= CPUM_CHANGED_CR4; 748 765 pVCpu->cpum.s.Guest.cr4 = cr4; … … 1284 1301 * Deal with CPU specific information (currently only APIC ID). 1285 1302 */ 1286 if (pLeaf->fFlags & CPUMCPUIDLEAF_F_CONTAINS_APIC_ID)1303 if (pLeaf->fFlags & (CPUMCPUIDLEAF_F_CONTAINS_APIC_ID | CPUMCPUIDLEAF_F_CONTAINS_OSXSAVE)) 1287 1304 { 1288 1305 if (uLeaf == 1) 1289 1306 { 1290 /* Bits 31-24: Initial APIC ID*/1307 /* EBX: Bits 31-24: Initial APIC ID. */ 1291 1308 Assert(pVCpu->idCpu <= 255); 1292 1309 AssertMsg((pLeaf->uEbx >> 24) == 0, ("%#x\n", pLeaf->uEbx)); /* raw-mode assumption */ 1293 1310 *pEbx = (pLeaf->uEbx & UINT32_C(0x00ffffff)) | (pVCpu->idCpu << 24); 1311 1312 /* ECX: Bit 27: CR4.OSXSAVE mirror. */ 1313 *pEcx = (pLeaf->uEcx & ~X86_CPUID_FEATURE_ECX_OSXSAVE) 1314 | (pVCpu->cpum.s.Guest.cr4 & X86_CR4_OSXSAVE ? X86_CPUID_FEATURE_ECX_OSXSAVE : 0); 1294 1315 } 1295 1316 else if (uLeaf == 0xb) … … 1589 1610 break; 1590 1611 1612 /* 1613 * OSXSAVE - only used from CPUMSetGuestCR4. 1614 */ 1615 case CPUMCPUIDFEATURE_OSXSAVE: 1616 AssertLogRelReturnVoid(pVM->cpum.s.HostFeatures.fXSaveRstor && pVM->cpum.s.HostFeatures.fOpSysXSaveRstor); 1617 1618 pLeaf = cpumCpuIdGetLeaf(pVM, UINT32_C(0x00000001)); 1619 AssertLogRelReturnVoid(pLeaf); 1620 1621 /* UNI: Special case for single CPU to make life simple for CPUMPatchHlpCpuId. */ 1622 if (pVM->cCpus == 1) 1623 pVM->cpum.s.aGuestCpuIdPatmStd[1].uEcx = pLeaf->uEcx |= X86_CPUID_FEATURE_ECX_OSXSAVE; 1624 /* SMP: Set flag indicating OSXSAVE updating (superfluous because of the APIC ID, but that's fine). */ 1625 else 1626 ASMAtomicOrU32(&pLeaf->fFlags, CPUMCPUIDLEAF_F_CONTAINS_OSXSAVE); 1627 break; 1628 1591 1629 default: 1592 1630 AssertMsgFailed(("enmFeature=%d\n", enmFeature)); … … 1626 1664 case CPUMCPUIDFEATURE_MWAIT_EXTS: return pVM->cpum.s.GuestFeatures.fMWaitExtensions; 1627 1665 1666 case CPUMCPUIDFEATURE_OSXSAVE: 1628 1667 case CPUMCPUIDFEATURE_INVALID: 1629 1668 case CPUMCPUIDFEATURE_32BIT_HACK: … … 1732 1771 Log(("CPUM: ClearGuestCpuIdFeature: Disabled MWAIT Extensions!\n")); 1733 1772 break; 1773 1774 /* 1775 * OSXSAVE - only used from CPUMSetGuestCR4. 1776 */ 1777 case CPUMCPUIDFEATURE_OSXSAVE: 1778 AssertLogRelReturnVoid(pVM->cpum.s.HostFeatures.fXSaveRstor && pVM->cpum.s.HostFeatures.fOpSysXSaveRstor); 1779 1780 pLeaf = cpumCpuIdGetLeaf(pVM, UINT32_C(0x00000001)); 1781 AssertLogRelReturnVoid(pLeaf); 1782 1783 /* UNI: Special case for single CPU to make life easy for CPUMPatchHlpCpuId. */ 1784 if (pVM->cCpus == 1) 1785 pVM->cpum.s.aGuestCpuIdPatmStd[1].uEcx = pLeaf->uEcx &= ~X86_CPUID_FEATURE_ECX_OSXSAVE; 1786 /* else: SMP: We never set the OSXSAVE bit and leaving the CONTAINS_OSXSAVE flag is fine. */ 1787 break; 1788 1734 1789 1735 1790 default:
Note:
See TracChangeset
for help on using the changeset viewer.