Changeset 52247 in vbox for trunk/src/VBox/VMM/VMMR3
- Timestamp:
- Jul 31, 2014 1:49:15 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 95328
- Location:
- trunk/src/VBox/VMM/VMMR3
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/CPUM.cpp
r51832 r52247 1686 1686 * Mini CPU selection support for making Mac OS X happy. 1687 1687 */ 1688 /** @todo This should probably be removed, as GIM Minimal provider does this1689 * work. */1690 1688 if (pCPUM->GuestFeatures.enmCpuVendor == CPUMCPUVENDOR_INTEL) 1691 1689 { -
trunk/src/VBox/VMM/VMMR3/GIM.cpp
r52110 r52247 115 115 AssertLogRelRCReturn(rc, rc); 116 116 117 /** @cfgm{GIM/GuestOsId, uint32_t}118 * The guest OS identifier. The default is 0, implying an unknown Guest OS. */119 GIMOSID GuestOsId = GIMOSID_END;120 uint32_t uGuestOsId;121 rc = CFGMR3QueryU32Def(pCfgNode, "GuestOsId", &uGuestOsId, GIMOSID_UNKNOWN);122 AssertLogRelRCReturn(rc, rc);123 if (uGuestOsId < GIMOSID_END)124 {125 GuestOsId = (GIMOSID)uGuestOsId;126 pVM->gim.s.enmGuestOsId = GuestOsId;127 }128 else129 {130 LogRel(("GIM: GuestOsId %u invalid.", uGuestOsId));131 return VERR_GIM_INVALID_GUESTOS_ID;132 }133 134 117 /* 135 118 * Setup the GIM provider for this VM. … … 270 253 rc = SSMR3PutU32(pSSM, pVM->gim.s.u32Version); 271 254 AssertRCReturn(rc, rc); 272 rc = SSMR3PutU32(pSSM, pVM->gim.s.enmGuestOsId);273 AssertRCReturn(rc, rc);274 255 275 256 /* … … 325 306 AssertRCReturn(rc, rc); 326 307 rc = SSMR3GetU32(pSSM, &pVM->gim.s.u32Version); 327 AssertRCReturn(rc, rc);328 rc = SSMR3GetU32(pSSM, (uint32_t *)&pVM->gim.s.enmGuestOsId);329 308 AssertRCReturn(rc, rc); 330 309 … … 608 587 #endif 609 588 610 611 /**612 * Checks if the GIM Guest OS identifier for this VM implies an OS X family of613 * guests.614 *615 * @returns true if it's an OS X guest, false otherwise.616 * @param pVM Pointer to the VM.617 */618 VMMR3_INT_DECL(bool) GIMR3IsOSXGuest(PVM pVM)619 {620 switch (pVM->gim.s.enmGuestOsId)621 {622 case GIMOSID_OSX:623 case GIMOSID_OSX_64:624 case GIMOSID_OSX_106:625 case GIMOSID_OSX_106_64:626 case GIMOSID_OSX_107:627 case GIMOSID_OSX_107_64:628 case GIMOSID_OSX_108:629 case GIMOSID_OSX_108_64:630 case GIMOSID_OSX_109:631 case GIMOSID_OSX_109_64:632 {633 return true;634 }635 636 default: /* shut up gcc */637 break;638 }639 return false;640 }641 -
trunk/src/VBox/VMM/VMMR3/GIMMinimal.cpp
r52110 r52247 43 43 CPUMSetGuestCpuIdFeature(pVM, CPUMCPUIDFEATURE_HVP); 44 44 45 if (GIMR3IsOSXGuest(pVM))46 {47 /*48 * Enable MWAIT Extensions for OS X Guests.49 */50 CPUMSetGuestCpuIdFeature(pVM, CPUMCPUIDFEATURE_MWAIT_EXTS);51 52 /*53 * Fake the CPU family/model so the guest works. This is partly because older54 * Mac releases really doesn't work on newer CPUs, and partly because OS X55 * expects more from systems with newer CPUs (MSRs, power features etc.)56 */57 if (CPUMGetGuestCpuVendor(pVM) == CPUMCPUVENDOR_INTEL)58 {59 uint32_t uMaxIntelFamilyModelStep = UINT32_MAX;60 switch (pVM->gim.s.enmGuestOsId)61 {62 case GIMOSID_OSX:63 case GIMOSID_OSX_64:64 uMaxIntelFamilyModelStep = RT_MAKE_U32_FROM_U8(1, 23, 6, 7); /* Penryn / X5482. */65 break;66 67 case GIMOSID_OSX_106:68 case GIMOSID_OSX_106_64:69 uMaxIntelFamilyModelStep = RT_MAKE_U32_FROM_U8(1, 23, 6, 7); /* Penryn / X5482 */70 break;71 72 case GIMOSID_OSX_107:73 case GIMOSID_OSX_107_64:74 /** @todo Figure out what is required here. */75 uMaxIntelFamilyModelStep = RT_MAKE_U32_FROM_U8(1, 23, 6, 7); /* Penryn / X5482 */76 break;77 78 case GIMOSID_OSX_108:79 case GIMOSID_OSX_108_64:80 /** @todo Figure out what is required here. */81 uMaxIntelFamilyModelStep = RT_MAKE_U32_FROM_U8(1, 23, 6, 7); /* Penryn / X5482 */82 break;83 84 case GIMOSID_OSX_109:85 case GIMOSID_OSX_109_64:86 /** @todo Figure out what is required here. */87 uMaxIntelFamilyModelStep = RT_MAKE_U32_FROM_U8(1, 23, 6, 7); /* Penryn / X5482 */88 break;89 90 default: /* shut up gcc */91 break;92 }93 94 if (uMaxIntelFamilyModelStep != UINT32_MAX)95 {96 CPUMCPUIDLEAF Leaf;97 int rc = CPUMR3CpuIdGetLeaf(pVM, &Leaf, 1, 0 /* uSubLeaf */);98 if (RT_SUCCESS(rc))99 {100 uint32_t uCurIntelFamilyModelStep = RT_MAKE_U32_FROM_U8(ASMGetCpuStepping(Leaf.uEax),101 ASMGetCpuModelIntel(Leaf.uEax),102 ASMGetCpuFamily(Leaf.uEax),103 0);104 if (uMaxIntelFamilyModelStep < uCurIntelFamilyModelStep)105 {106 uint32_t uNew = Leaf.uEax & UINT32_C(0xf0003000);107 uNew |= RT_BYTE1(uMaxIntelFamilyModelStep) & 0xf; /* stepping */108 uNew |= (RT_BYTE2(uMaxIntelFamilyModelStep) & 0xf) << 4; /* 4 low model bits */109 uNew |= (RT_BYTE2(uMaxIntelFamilyModelStep) >> 4) << 16; /* 4 high model bits */110 uNew |= (RT_BYTE3(uMaxIntelFamilyModelStep) & 0xf) << 8; /* 4 low family bits */111 /* 8 high family bits, Intel's suggested calculation. */112 if (RT_BYTE3(uMaxIntelFamilyModelStep) > 0xf)113 {114 uNew |= ( (RT_BYTE3(uMaxIntelFamilyModelStep)115 - (RT_BYTE3(uMaxIntelFamilyModelStep) & 0xf)) & 0xff ) << 20;116 }117 118 LogRel(("GIM: Minimal: CPUID(0).EAX %#x -> %#x (uMaxIntelFamilyModelStep=%#x, uCurIntelFamilyModelStep=%#x\n",119 Leaf.uEax, uNew, uMaxIntelFamilyModelStep, uCurIntelFamilyModelStep));120 Leaf.uEax = uNew;121 }122 123 rc = CPUMR3CpuIdInsert(pVM, &Leaf);124 if (RT_FAILURE(rc))125 {126 LogRel(("GIM: Minimal: Failed to insert CPUID leaf for OS X guest. rc=%Rrc\n", rc));127 return rc;128 }129 }130 else131 {132 LogRel(("GIM: Minimal: Failed to retreive std. CPUID leaf. rc=%Rrc\n", rc));133 return rc;134 }135 }136 }137 }138 139 45 return VINF_SUCCESS; 140 46 }
Note:
See TracChangeset
for help on using the changeset viewer.