VirtualBox

Changeset 87522 in vbox for trunk/src/VBox/VMM/VMMR3


Ignore:
Timestamp:
Feb 1, 2021 10:32:33 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
142547
Message:

VMM/HM: Moved CPUMCTX::fWorldSwitcher to HMR0PERVCPU::fWorldSwitcher. bugref:9453 bugref:9087

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/HM.cpp

    r87521 r87522  
    663663    }
    664664
     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     */
    665698#ifdef VBOX_WITH_STATISTICS
    666699    STAM_REG(pVM, &pVM->hm.s.StatTprPatchSuccess,      STAMTYPE_COUNTER, "/HM/TPR/Patch/Success",      STAMUNIT_OCCURENCES, "Number of times an instruction was successfully patched.");
     
    671704#endif
    672705
    673     /*
    674      * Statistics.
    675      */
    676706#ifdef VBOX_WITH_STATISTICS
    677707    bool const fCpuSupportsVmx = ASMIsIntelCpu() || ASMIsViaCentaurCpu() || ASMIsShanghaiCpu();
     
    10921122    }
    10931123
    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));
    11501127
    11511128    /*
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette