Changeset 73051 in vbox
- Timestamp:
- Jul 11, 2018 2:52:45 AM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 123611
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp
r73050 r73051 6420 6420 { 6421 6421 HMSVM_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pSvmTransient); 6422 HMSVM_CPUMCTX_IMPORT_STATE(pVCpu, CPUMCTX_EXTRN_CR0 | CPUMCTX_EXTRN_SS); 6423 6424 PCPUMCTX pCtx = &pVCpu->cpum.GstCtx; 6425 int rc = EMInterpretMonitor(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pCtx)); 6426 if (RT_LIKELY(rc == VINF_SUCCESS)) 6427 { 6428 hmR0SvmAdvanceRipHwAssist(pVCpu, 3); 6429 HMSVM_CHECK_SINGLE_STEP(pVCpu, rc); 6422 6423 /* 6424 * SVM unfortunately does not provide us with any segment override prefix information. 6425 * 6426 * If the instruction length supplied by the CPU is 3 bytes, we can be certain that no 6427 * segment override prefix is present (and thus use the default segment DS). Otherwise, a 6428 * segment override prefix or other prefixes might be used, in which case we fallback to 6429 * IEMExecOne() to handle it. 6430 */ 6431 VBOXSTRICTRC rcStrict; 6432 bool const fSupportsNextRipSave = hmR0SvmSupportsNextRipSave(pVCpu); 6433 uint8_t const cbInstr = fSupportsNextRipSave ? hmR0SvmGetInstrLength(pVCpu) : 0; 6434 if (cbInstr == 3) 6435 { 6436 HMSVM_CPUMCTX_IMPORT_STATE(pVCpu, IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK | CPUMCTX_EXTRN_DS); 6437 rcStrict = IEMExecDecodedMonitor(pVCpu, cbInstr); 6430 6438 } 6431 6439 else 6432 6440 { 6433 AssertMsg(rc == VERR_EM_INTERPRETER, ("hmR0SvmExitMonitor: EMInterpretMonitor failed with %Rrc\n", rc)); 6434 rc = VERR_EM_INTERPRETER; 6435 } 6441 HMSVM_CPUMCTX_IMPORT_STATE(pVCpu, IEM_CPUMCTX_EXTRN_MUST_MASK); 6442 rcStrict = IEMExecOne(pVCpu); 6443 } 6444 6445 if (rcStrict == VINF_IEM_RAISED_XCPT) 6446 { 6447 rcStrict = VINF_SUCCESS; 6448 ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_RAISED_XCPT_MASK); 6449 } 6450 HMSVM_CHECK_SINGLE_STEP(pVCpu, rcStrict); 6436 6451 STAM_COUNTER_INC(&pVCpu->hm.s.StatExitMonitor); 6437 return rc;6452 return VBOXSTRICTRC_TODO(rcStrict); 6438 6453 } 6439 6454
Note:
See TracChangeset
for help on using the changeset viewer.