VirtualBox

Changeset 71836 in vbox


Ignore:
Timestamp:
Apr 12, 2018 8:13:03 AM (7 years ago)
Author:
vboxsync
Message:

VMM/HMSVMR0: Clean up.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp

    r71833 r71836  
    11471147 * Flushes the appropriate tagged-TLB entries.
    11481148 *
    1149  * @param   pVCpu   The cross context virtual CPU structure.
    1150  * @param   pCtx    Pointer to the guest-CPU or nested-guest-CPU context.
    1151  * @param   pVmcb   Pointer to the VM control block.
    1152  */
    1153 static void hmR0SvmFlushTaggedTlb(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMVMCB pVmcb)
     1149 * @param   pVCpu       The cross context virtual CPU structure.
     1150 * @param   pCtx        Pointer to the guest-CPU or nested-guest-CPU context.
     1151 * @param   pVmcb       Pointer to the VM control block.
     1152 * @param   pHostCpu    Pointer to the HM host-CPU info.
     1153 */
     1154static void hmR0SvmFlushTaggedTlb(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMVMCB pVmcb, PHMGLOBALCPUINFO pHostCpu)
    11541155{
    11551156#ifndef VBOX_WITH_NESTED_HWVIRT
    11561157    RT_NOREF(pCtx);
    11571158#endif
    1158 
    1159     PVM pVM               = pVCpu->CTX_SUFF(pVM);
    1160     PHMGLOBALCPUINFO pCpu = hmR0GetCurrentCpu();
     1159    PVM pVM = pVCpu->CTX_SUFF(pVM);
    11611160
    11621161    /*
     
    11711170     */
    11721171    bool fNewAsid = false;
    1173     Assert(pCpu->idCpu != NIL_RTCPUID);
    1174     if (   pVCpu->hm.s.idLastCpu   != pCpu->idCpu
    1175         || pVCpu->hm.s.cTlbFlushes != pCpu->cTlbFlushes
     1172    Assert(pHostCpu->idCpu != NIL_RTCPUID);
     1173    if (   pVCpu->hm.s.idLastCpu   != pHostCpu->idCpu
     1174        || pVCpu->hm.s.cTlbFlushes != pHostCpu->cTlbFlushes
    11761175#ifdef VBOX_WITH_NESTED_HWVIRT
    11771176        || CPUMIsGuestInSvmNestedHwVirtMode(pCtx)
     
    12001199    if (pVM->hm.s.svm.fAlwaysFlushTLB)
    12011200    {
    1202         pCpu->uCurrentAsid               = 1;
     1201        pHostCpu->uCurrentAsid           = 1;
    12031202        pVCpu->hm.s.uCurrentAsid         = 1;
    1204         pVCpu->hm.s.cTlbFlushes          = pCpu->cTlbFlushes;
     1203        pVCpu->hm.s.cTlbFlushes          = pHostCpu->cTlbFlushes;
     1204        pVCpu->hm.s.idLastCpu            = pHostCpu->idCpu;
    12051205        pVmcb->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_ENTIRE;
    12061206
    12071207        /* Clear the VMCB Clean Bit for NP while flushing the TLB. See @bugref{7152}. */
    12081208        pVmcb->ctrl.u32VmcbCleanBits    &= ~HMSVM_VMCB_CLEAN_NP;
    1209 
    1210         /* Keep track of last CPU ID even when flushing all the time. */
    1211         if (fNewAsid)
    1212             pVCpu->hm.s.idLastCpu = pCpu->idCpu;
    12131209    }
    12141210    else
     
    12221218            if (fNewAsid)
    12231219            {
    1224                 ++pCpu->uCurrentAsid;
     1220                ++pHostCpu->uCurrentAsid;
    12251221
    12261222                bool fHitASIDLimit = false;
    1227                 if (pCpu->uCurrentAsid >= pVM->hm.s.uMaxAsid)
     1223                if (pHostCpu->uCurrentAsid >= pVM->hm.s.uMaxAsid)
    12281224                {
    1229                     pCpu->uCurrentAsid = 1;      /* Wraparound at 1; host uses 0 */
    1230                     pCpu->cTlbFlushes++;         /* All VCPUs that run on this host CPU must use a new ASID. */
     1225                    pHostCpu->uCurrentAsid = 1;      /* Wraparound at 1; host uses 0 */
     1226                    pHostCpu->cTlbFlushes++;         /* All VCPUs that run on this host CPU must use a new ASID. */
    12311227                    fHitASIDLimit      = true;
    12321228                }
    12331229
    12341230                if (   fHitASIDLimit
    1235                     || pCpu->fFlushAsidBeforeUse)
     1231                    || pHostCpu->fFlushAsidBeforeUse)
    12361232                {
    12371233                    pVmcb->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_ENTIRE;
    1238                     pCpu->fFlushAsidBeforeUse = false;
     1234                    pHostCpu->fFlushAsidBeforeUse = false;
    12391235                }
    12401236
    1241                 pVCpu->hm.s.uCurrentAsid = pCpu->uCurrentAsid;
    1242                 pVCpu->hm.s.idLastCpu    = pCpu->idCpu;
    1243                 pVCpu->hm.s.cTlbFlushes  = pCpu->cTlbFlushes;
     1237                pVCpu->hm.s.uCurrentAsid = pHostCpu->uCurrentAsid;
     1238                pVCpu->hm.s.idLastCpu    = pHostCpu->idCpu;
     1239                pVCpu->hm.s.cTlbFlushes  = pHostCpu->cTlbFlushes;
    12441240            }
    12451241            else
     
    12621258    }
    12631259
    1264     AssertMsg(pVCpu->hm.s.idLastCpu == pCpu->idCpu,
    1265               ("vcpu idLastCpu=%u pcpu idCpu=%u\n", pVCpu->hm.s.idLastCpu, pCpu->idCpu));
    1266     AssertMsg(pVCpu->hm.s.cTlbFlushes == pCpu->cTlbFlushes,
    1267               ("Flush count mismatch for cpu %u (%u vs %u)\n", pCpu->idCpu, pVCpu->hm.s.cTlbFlushes, pCpu->cTlbFlushes));
    1268     AssertMsg(pCpu->uCurrentAsid >= 1 && pCpu->uCurrentAsid < pVM->hm.s.uMaxAsid,
    1269               ("cpu%d uCurrentAsid = %x\n", pCpu->idCpu, pCpu->uCurrentAsid));
     1260    AssertMsg(pVCpu->hm.s.idLastCpu == pHostCpu->idCpu,
     1261              ("vcpu idLastCpu=%u hostcpu idCpu=%u\n", pVCpu->hm.s.idLastCpu, pHostCpu->idCpu));
     1262    AssertMsg(pVCpu->hm.s.cTlbFlushes == pHostCpu->cTlbFlushes,
     1263              ("Flush count mismatch for cpu %u (%u vs %u)\n", pHostCpu->idCpu, pVCpu->hm.s.cTlbFlushes, pHostCpu->cTlbFlushes));
     1264    AssertMsg(pHostCpu->uCurrentAsid >= 1 && pHostCpu->uCurrentAsid < pVM->hm.s.uMaxAsid,
     1265              ("cpu%d uCurrentAsid = %x\n", pHostCpu->idCpu, pHostCpu->uCurrentAsid));
    12701266    AssertMsg(pVCpu->hm.s.uCurrentAsid >= 1 && pVCpu->hm.s.uCurrentAsid < pVM->hm.s.uMaxAsid,
    1271               ("cpu%d VM uCurrentAsid = %x\n", pCpu->idCpu, pVCpu->hm.s.uCurrentAsid));
     1267              ("cpu%d VM uCurrentAsid = %x\n", pHostCpu->idCpu, pVCpu->hm.s.uCurrentAsid));
    12721268
    12731269#ifdef VBOX_WITH_STATISTICS
     
    43554351    AssertMsg(!HMCPU_CF_VALUE(pVCpu), ("fContextUseFlags=%#RX32\n", HMCPU_CF_VALUE(pVCpu)));
    43564352
    4357     PHMGLOBALCPUINFO pHostCpu  = hmR0GetCurrentCpu();
    4358     RTCPUID const idCurrentCpu = pHostCpu->idCpu;
    4359     bool const    fMigratedCpu = idCurrentCpu != pVCpu->hm.s.idLastCpu;
     4353    PHMGLOBALCPUINFO pHostCpu      = hmR0GetCurrentCpu();
     4354    RTCPUID const idHostCpu        = pHostCpu->idCpu;
     4355    bool const    fMigratedHostCpu = idHostCpu != pVCpu->hm.s.idLastCpu;
    43604356
    43614357    /* Setup TSC offsetting. */
    43624358    if (   pSvmTransient->fUpdateTscOffsetting
    4363         || fMigratedCpu)
     4359        || fMigratedHostCpu)
    43644360    {
    43654361        hmR0SvmUpdateTscOffsettingNested(pVM, pVCpu, pCtx, pVmcbNstGst);
     
    43684364
    43694365    /* If we've migrating CPUs, mark the VMCB Clean bits as dirty. */
    4370     if (fMigratedCpu)
     4366    if (fMigratedHostCpu)
    43714367        pVmcbNstGst->ctrl.u32VmcbCleanBits = 0;
    43724368
     
    43944390    /* The TLB flushing would've already been setup by the nested-hypervisor. */
    43954391    ASMAtomicWriteBool(&pVCpu->hm.s.fCheckedTLBFlush, true);    /* Used for TLB flushing, set this across the world switch. */
    4396     hmR0SvmFlushTaggedTlb(pVCpu, pCtx, pVmcbNstGst);
    4397     Assert(hmR0GetCurrentCpu()->idCpu == pVCpu->hm.s.idLastCpu);
     4392    hmR0SvmFlushTaggedTlb(pVCpu, pCtx, pVmcbNstGst, pHostCpu);
     4393    Assert(pVCpu->hm.s.idLastCpu == idHostCpu);
    43984394
    43994395    STAM_PROFILE_ADV_STOP_START(&pVCpu->hm.s.StatEntry, &pVCpu->hm.s.StatInGC, x);
     
    44814477    AssertMsg(!HMCPU_CF_VALUE(pVCpu), ("fContextUseFlags=%#RX32\n", HMCPU_CF_VALUE(pVCpu)));
    44824478
     4479    PHMGLOBALCPUINFO pHostCpu      = hmR0GetCurrentCpu();
     4480    RTCPUID const idHostCpu        = pHostCpu->idCpu;
     4481    bool const    fMigratedHostCpu = idHostCpu != pVCpu->hm.s.idLastCpu;
     4482
    44834483    /* Setup TSC offsetting. */
    4484     RTCPUID idCurrentCpu = hmR0GetCurrentCpu()->idCpu;
    44854484    if (   pSvmTransient->fUpdateTscOffsetting
    4486         || idCurrentCpu != pVCpu->hm.s.idLastCpu)
     4485        || fMigratedHostCpu)
    44874486    {
    44884487        hmR0SvmUpdateTscOffsetting(pVM, pVCpu, pVmcb);
     
    44914490
    44924491    /* If we've migrating CPUs, mark the VMCB Clean bits as dirty. */
    4493     if (idCurrentCpu != pVCpu->hm.s.idLastCpu)
     4492    if (fMigratedHostCpu)
    44944493        pVmcb->ctrl.u32VmcbCleanBits = 0;
    44954494
     
    45114510    /* Flush the appropriate tagged-TLB entries. */
    45124511    ASMAtomicWriteBool(&pVCpu->hm.s.fCheckedTLBFlush, true);    /* Used for TLB flushing, set this across the world switch. */
    4513     hmR0SvmFlushTaggedTlb(pVCpu, pCtx, pVmcb);
    4514     Assert(hmR0GetCurrentCpu()->idCpu == pVCpu->hm.s.idLastCpu);
     4512    hmR0SvmFlushTaggedTlb(pVCpu, pCtx, pVmcb, pHostCpu);
     4513    Assert(pVCpu->hm.s.idLastCpu == idHostCpu);
    45154514
    45164515    STAM_PROFILE_ADV_STOP_START(&pVCpu->hm.s.StatEntry, &pVCpu->hm.s.StatInGC, x);
Note: See TracChangeset for help on using the changeset viewer.

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