VirtualBox

Changeset 90000 in vbox for trunk/src


Ignore:
Timestamp:
Jul 2, 2021 2:26:30 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
145478
Message:

VMM/HMVMX: Only go to ring-3 for split-lock #AC emulation for SMP VMs. bugref:10052

File:
1 edited

Legend:

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

    r89993 r90000  
    1415714157         */
    1415814158        STAM_REL_COUNTER_INC(&pVCpu->hm.s.StatExitGuestACSplitLock);
    14159         PVM pVM = pVCpu->pVMR0;
     14159        PVMCC pVM = pVCpu->pVMR0;
    1416014160        if (   !DBGF_IS_EVENT_ENABLED(pVM, DBGFEVENT_VMX_SPLIT_LOCK)
    1416114161            && !VBOXVMM_VMX_SPLIT_LOCK_ENABLED())
    1416214162        {
     14163            if (pVM->cCpus == 1)
     14164            {
    1416314165#if 0 /** @todo r=bird: This is potentially wrong.  Might have to just do a whole state sync above and mark everything changed to be safe... */
    14164             rc = hmR0VmxImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK);
     14166                rc = hmR0VmxImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK);
    1416514167#else
    14166             rc = hmR0VmxImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, HMVMX_CPUMCTX_EXTRN_ALL);
     14168                rc = hmR0VmxImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, HMVMX_CPUMCTX_EXTRN_ALL);
    1416714169#endif
    14168             AssertRCReturn(rc, rc);
     14170                AssertRCReturn(rc, rc);
     14171            }
    1416914172        }
    1417014173        else
     
    1418914192         * detection on the host.  This isn't all that satisfactory, though...
    1419014193         */
    14191 #if 0
    14192         Log8Func(("cs:rip=%#04x:%#RX64 rflags=%#RX64 cr0=%#RX64 split-lock #AC\n", pVCpu->cpum.GstCtx.cs.Sel,
    14193                   pVCpu->cpum.GstCtx.rip, pVCpu->cpum.GstCtx.rflags, pVCpu->cpum.GstCtx.cr0));
    14194 
    14195         /** @todo For SMP configs we should do a rendezvous here. */
    14196         VBOXSTRICTRC rcStrict = IEMExecOneIgnoreLock(pVCpu);
    14197         if (rcStrict == VINF_SUCCESS)
     14194        if (pVM->cCpus == 1)
     14195        {
     14196            Log8Func(("cs:rip=%#04x:%#RX64 rflags=%#RX64 cr0=%#RX64 split-lock #AC\n", pVCpu->cpum.GstCtx.cs.Sel,
     14197                      pVCpu->cpum.GstCtx.rip, pVCpu->cpum.GstCtx.rflags, pVCpu->cpum.GstCtx.cr0));
     14198
     14199            /** @todo For SMP configs we should do a rendezvous here. */
     14200            VBOXSTRICTRC rcStrict = IEMExecOneIgnoreLock(pVCpu);
     14201            if (rcStrict == VINF_SUCCESS)
    1419814202#if 0 /** @todo r=bird: This is potentially wrong.  Might have to just do a whole state sync above and mark everything changed to be safe... */
    14199             ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged,
    14200                                HM_CHANGED_GUEST_RIP
    14201                              | HM_CHANGED_GUEST_RFLAGS
    14202                              | HM_CHANGED_GUEST_GPRS_MASK
    14203                              | HM_CHANGED_GUEST_CS
    14204                              | HM_CHANGED_GUEST_SS);
     14203                ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged,
     14204                                   HM_CHANGED_GUEST_RIP
     14205                                 | HM_CHANGED_GUEST_RFLAGS
     14206                                 | HM_CHANGED_GUEST_GPRS_MASK
     14207                                 | HM_CHANGED_GUEST_CS
     14208                                 | HM_CHANGED_GUEST_SS);
    1420514209#else
    14206             ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_ALL_GUEST);
     14210                ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_ALL_GUEST);
    1420714211#endif
    14208         else if (rcStrict == VINF_IEM_RAISED_XCPT)
    14209         {
    14210             ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_RAISED_XCPT_MASK);
    14211             rcStrict = VINF_SUCCESS;
    14212         }
    14213         return rcStrict;
    14214 #else
     14212            else if (rcStrict == VINF_IEM_RAISED_XCPT)
     14213            {
     14214                ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_RAISED_XCPT_MASK);
     14215                rcStrict = VINF_SUCCESS;
     14216            }
     14217            return rcStrict;
     14218        }
    1421514219        Log8Func(("cs:rip=%#04x:%#RX64 rflags=%#RX64 cr0=%#RX64 split-lock #AC -> VINF_EM_EMULATE_SPLIT_LOCK\n",
    1421614220                  pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.rip, pVCpu->cpum.GstCtx.rflags, pVCpu->cpum.GstCtx.cr0));
    1421714221        return VINF_EM_EMULATE_SPLIT_LOCK;
    14218 #endif
    1421914222    }
    1422014223
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