Changeset 78710 in vbox
- Timestamp:
- May 24, 2019 7:57:33 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 130788
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r78708 r78710 13730 13730 } 13731 13731 else 13732 AssertMsgFailed(("Unexpected IEMExecDecodedInvlpg(%#RX64) st tus: %Rrc\n", pVmxTransient->uExitQual,13732 AssertMsgFailed(("Unexpected IEMExecDecodedInvlpg(%#RX64) status: %Rrc\n", pVmxTransient->uExitQual, 13733 13733 VBOXSTRICTRC_VAL(rcStrict))); 13734 13734 return rcStrict; … … 13744 13744 13745 13745 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); 13747 13748 AssertRCReturn(rc, rc); 13748 13749 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 else13754 {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; 13759 13760 } 13760 13761 … … 13768 13769 13769 13770 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); 13771 13772 AssertRCReturn(rc, rc); 13772 13773 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; 13794 13783 } 13795 13784
Note:
See TracChangeset
for help on using the changeset viewer.