VirtualBox

Changeset 78710 in vbox


Ignore:
Timestamp:
May 24, 2019 7:57:33 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
130788
Message:

VMM/HMVMXR0: Nested VMX: bugref:9180 Use IEMExecDecoded[Monitor|Mwait] rather than the older EMInterpret[Monitor|Mwait]. The former is more complete wrt to checks and ability to handle VM-exits.

File:
1 edited

Legend:

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

    r78708 r78710  
    1373013730    }
    1373113731    else
    13732         AssertMsgFailed(("Unexpected IEMExecDecodedInvlpg(%#RX64) sttus: %Rrc\n", pVmxTransient->uExitQual,
     13732        AssertMsgFailed(("Unexpected IEMExecDecodedInvlpg(%#RX64) status: %Rrc\n", pVmxTransient->uExitQual,
    1373313733                         VBOXSTRICTRC_VAL(rcStrict)));
    1373413734    return rcStrict;
     
    1374413744
    1374513745    PCVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo;
    13746     int rc = hmR0VmxImportGuestState(pVCpu, pVmcsInfo, CPUMCTX_EXTRN_CR0 | CPUMCTX_EXTRN_RFLAGS | CPUMCTX_EXTRN_SS);
     13746    int rc = hmR0VmxImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK | CPUMCTX_EXTRN_DS);
     13747    rc    |= hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
    1374713748    AssertRCReturn(rc, rc);
    1374813749
    13749     PCPUMCTX pCtx = &pVCpu->cpum.GstCtx;
    13750     rc = EMInterpretMonitor(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pCtx));
    13751     if (RT_LIKELY(rc == VINF_SUCCESS))
    13752         rc = hmR0VmxAdvanceGuestRip(pVCpu, pVmxTransient);
    13753     else
    13754     {
    13755         AssertMsg(rc == VERR_EM_INTERPRETER, ("hmR0VmxExitMonitor: EMInterpretMonitor failed with %Rrc\n", rc));
    13756         rc = VERR_EM_INTERPRETER;
    13757     }
    13758     return rc;
     13750    VBOXSTRICTRC rcStrict = IEMExecDecodedMonitor(pVCpu, pVmxTransient->cbInstr);
     13751    if (rcStrict == VINF_SUCCESS)
     13752        ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS);
     13753    else if (rcStrict == VINF_IEM_RAISED_XCPT)
     13754    {
     13755        ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_RAISED_XCPT_MASK);
     13756        rcStrict = VINF_SUCCESS;
     13757    }
     13758
     13759    return rcStrict;
    1375913760}
    1376013761
     
    1376813769
    1376913770    PCVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo;
    13770     int rc = hmR0VmxImportGuestState(pVCpu, pVmcsInfo, CPUMCTX_EXTRN_CR0 | CPUMCTX_EXTRN_RFLAGS | CPUMCTX_EXTRN_SS);
     13771    int rc = hmR0VmxImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK);
    1377113772    AssertRCReturn(rc, rc);
    1377213773
    13773     PCPUMCTX pCtx = &pVCpu->cpum.GstCtx;
    13774     VBOXSTRICTRC rc2 = EMInterpretMWait(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pCtx));
    13775     rc = VBOXSTRICTRC_VAL(rc2);
    13776     if (RT_LIKELY(   rc == VINF_SUCCESS
    13777                   || rc == VINF_EM_HALT))
    13778     {
    13779         int rc3 = hmR0VmxAdvanceGuestRip(pVCpu, pVmxTransient);
    13780         AssertRCReturn(rc3, rc3);
    13781 
    13782         if (   rc == VINF_EM_HALT
    13783             && EMMonitorWaitShouldContinue(pVCpu, pCtx))
    13784             rc = VINF_SUCCESS;
    13785     }
    13786     else
    13787     {
    13788         AssertMsg(rc == VERR_EM_INTERPRETER, ("hmR0VmxExitMwait: EMInterpretMWait failed with %Rrc\n", rc));
    13789         rc = VERR_EM_INTERPRETER;
    13790     }
    13791     AssertMsg(rc == VINF_SUCCESS || rc == VINF_EM_HALT || rc == VERR_EM_INTERPRETER,
    13792               ("hmR0VmxExitMwait: failed, invalid error code %Rrc\n", rc));
    13793     return rc;
     13774    VBOXSTRICTRC rcStrict = IEMExecDecodedMwait(pVCpu, pVmxTransient->cbInstr);
     13775    if (RT_SUCCESS(rcStrict))
     13776    {
     13777        ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS);
     13778        if (EMMonitorWaitShouldContinue(pVCpu, &pVCpu->cpum.GstCtx))
     13779            rcStrict = VINF_SUCCESS;
     13780    }
     13781
     13782    return rcStrict;
    1379413783}
    1379513784
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