Changeset 87522 in vbox for trunk/src/VBox/VMM/VMMR3
- Timestamp:
- Feb 1, 2021 10:32:33 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 142547
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/HM.cpp
r87521 r87522 663 663 } 664 664 665 /* 666 * Check if L1D flush is needed/possible. 667 */ 668 if ( !pVM->cpum.ro.HostFeatures.fFlushCmd 669 || pVM->cpum.ro.HostFeatures.enmMicroarch < kCpumMicroarch_Intel_Core7_Nehalem 670 || pVM->cpum.ro.HostFeatures.enmMicroarch >= kCpumMicroarch_Intel_Core7_End 671 || pVM->cpum.ro.HostFeatures.fArchVmmNeedNotFlushL1d 672 || pVM->cpum.ro.HostFeatures.fArchRdclNo) 673 pVM->hm.s.fL1dFlushOnSched = pVM->hm.s.fL1dFlushOnVmEntry = false; 674 675 /* 676 * Check if MDS flush is needed/possible. 677 * On atoms and knight family CPUs, we will only allow clearing on scheduling. 678 */ 679 if ( !pVM->cpum.ro.HostFeatures.fMdsClear 680 || pVM->cpum.ro.HostFeatures.fArchMdsNo) 681 pVM->hm.s.fMdsClearOnSched = pVM->hm.s.fMdsClearOnVmEntry = false; 682 else if ( ( pVM->cpum.ro.HostFeatures.enmMicroarch >= kCpumMicroarch_Intel_Atom_Airmount 683 && pVM->cpum.ro.HostFeatures.enmMicroarch < kCpumMicroarch_Intel_Atom_End) 684 || ( pVM->cpum.ro.HostFeatures.enmMicroarch >= kCpumMicroarch_Intel_Phi_KnightsLanding 685 && pVM->cpum.ro.HostFeatures.enmMicroarch < kCpumMicroarch_Intel_Phi_End)) 686 { 687 if (!pVM->hm.s.fMdsClearOnSched) 688 pVM->hm.s.fMdsClearOnSched = pVM->hm.s.fMdsClearOnVmEntry; 689 pVM->hm.s.fMdsClearOnVmEntry = false; 690 } 691 else if ( pVM->cpum.ro.HostFeatures.enmMicroarch < kCpumMicroarch_Intel_Core7_Nehalem 692 || pVM->cpum.ro.HostFeatures.enmMicroarch >= kCpumMicroarch_Intel_Core7_End) 693 pVM->hm.s.fMdsClearOnSched = pVM->hm.s.fMdsClearOnVmEntry = false; 694 695 /* 696 * Statistics. 697 */ 665 698 #ifdef VBOX_WITH_STATISTICS 666 699 STAM_REG(pVM, &pVM->hm.s.StatTprPatchSuccess, STAMTYPE_COUNTER, "/HM/TPR/Patch/Success", STAMUNIT_OCCURENCES, "Number of times an instruction was successfully patched."); … … 671 704 #endif 672 705 673 /*674 * Statistics.675 */676 706 #ifdef VBOX_WITH_STATISTICS 677 707 bool const fCpuSupportsVmx = ASMIsIntelCpu() || ASMIsViaCentaurCpu() || ASMIsShanghaiCpu(); … … 1092 1122 } 1093 1123 1094 /* 1095 * Check if L1D flush is needed/possible. 1096 */ 1097 if ( !pVM->cpum.ro.HostFeatures.fFlushCmd 1098 || pVM->cpum.ro.HostFeatures.enmMicroarch < kCpumMicroarch_Intel_Core7_Nehalem 1099 || pVM->cpum.ro.HostFeatures.enmMicroarch >= kCpumMicroarch_Intel_Core7_End 1100 || pVM->cpum.ro.HostFeatures.fArchVmmNeedNotFlushL1d 1101 || pVM->cpum.ro.HostFeatures.fArchRdclNo) 1102 pVM->hm.s.fL1dFlushOnSched = pVM->hm.s.fL1dFlushOnVmEntry = false; 1103 1104 /* 1105 * Check if MDS flush is needed/possible. 1106 * On atoms and knight family CPUs, we will only allow clearing on scheduling. 1107 */ 1108 if ( !pVM->cpum.ro.HostFeatures.fMdsClear 1109 || pVM->cpum.ro.HostFeatures.fArchMdsNo) 1110 pVM->hm.s.fMdsClearOnSched = pVM->hm.s.fMdsClearOnVmEntry = false; 1111 else if ( ( pVM->cpum.ro.HostFeatures.enmMicroarch >= kCpumMicroarch_Intel_Atom_Airmount 1112 && pVM->cpum.ro.HostFeatures.enmMicroarch < kCpumMicroarch_Intel_Atom_End) 1113 || ( pVM->cpum.ro.HostFeatures.enmMicroarch >= kCpumMicroarch_Intel_Phi_KnightsLanding 1114 && pVM->cpum.ro.HostFeatures.enmMicroarch < kCpumMicroarch_Intel_Phi_End)) 1115 { 1116 if (!pVM->hm.s.fMdsClearOnSched) 1117 pVM->hm.s.fMdsClearOnSched = pVM->hm.s.fMdsClearOnVmEntry; 1118 pVM->hm.s.fMdsClearOnVmEntry = false; 1119 } 1120 else if ( pVM->cpum.ro.HostFeatures.enmMicroarch < kCpumMicroarch_Intel_Core7_Nehalem 1121 || pVM->cpum.ro.HostFeatures.enmMicroarch >= kCpumMicroarch_Intel_Core7_End) 1122 pVM->hm.s.fMdsClearOnSched = pVM->hm.s.fMdsClearOnVmEntry = false; 1123 1124 /* 1125 * Sync options. 1126 */ 1127 /** @todo Move this out of of CPUMCTX and into some ring-0 only HM structure. 1128 * That will require a little bit of work, of course. */ 1129 for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++) 1130 { 1131 PVMCPU pVCpu = pVM->apCpusR3[idCpu]; 1132 PCPUMCTX pCpuCtx = &pVCpu->cpum.GstCtx; 1133 pCpuCtx->fWorldSwitcher &= ~(CPUMCTX_WSF_IBPB_EXIT | CPUMCTX_WSF_IBPB_ENTRY); 1134 if (pVM->cpum.ro.HostFeatures.fIbpb) 1135 { 1136 if (pVM->hm.s.fIbpbOnVmExit) 1137 pCpuCtx->fWorldSwitcher |= CPUMCTX_WSF_IBPB_EXIT; 1138 if (pVM->hm.s.fIbpbOnVmEntry) 1139 pCpuCtx->fWorldSwitcher |= CPUMCTX_WSF_IBPB_ENTRY; 1140 } 1141 if (pVM->cpum.ro.HostFeatures.fFlushCmd && pVM->hm.s.fL1dFlushOnVmEntry) 1142 pCpuCtx->fWorldSwitcher |= CPUMCTX_WSF_L1D_ENTRY; 1143 if (pVM->cpum.ro.HostFeatures.fMdsClear && pVM->hm.s.fMdsClearOnVmEntry) 1144 pCpuCtx->fWorldSwitcher |= CPUMCTX_WSF_MDS_ENTRY; 1145 if (idCpu == 0) 1146 LogRel(("HM: fWorldSwitcher=%#x (fIbpbOnVmExit=%RTbool fIbpbOnVmEntry=%RTbool fL1dFlushOnVmEntry=%RTbool); fL1dFlushOnSched=%RTbool fMdsClearOnVmEntry=%RTbool\n", 1147 pCpuCtx->fWorldSwitcher, pVM->hm.s.fIbpbOnVmExit, pVM->hm.s.fIbpbOnVmEntry, pVM->hm.s.fL1dFlushOnVmEntry, 1148 pVM->hm.s.fL1dFlushOnSched, pVM->hm.s.fMdsClearOnVmEntry)); 1149 } 1124 LogRel(("HM: fWorldSwitcher=%#x (fIbpbOnVmExit=%RTbool fIbpbOnVmEntry=%RTbool fL1dFlushOnVmEntry=%RTbool); fL1dFlushOnSched=%RTbool fMdsClearOnVmEntry=%RTbool\n", 1125 pVM->hm.s.fWorldSwitcherForLog, pVM->hm.s.fIbpbOnVmExit, pVM->hm.s.fIbpbOnVmEntry, pVM->hm.s.fL1dFlushOnVmEntry, 1126 pVM->hm.s.fL1dFlushOnSched, pVM->hm.s.fMdsClearOnVmEntry)); 1150 1127 1151 1128 /*
Note:
See TracChangeset
for help on using the changeset viewer.