- Timestamp:
- Jul 11, 2018 2:48:27 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp
r73049 r73050 6383 6383 HMSVM_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pSvmTransient); 6384 6384 6385 hmR0SvmAdvanceRipHwAssist(pVCpu, 1); 6386 int rc = EMShouldContinueAfterHalt(pVCpu, &pVCpu->cpum.GstCtx) ? VINF_SUCCESS : VINF_EM_HALT; 6387 HMSVM_CHECK_SINGLE_STEP(pVCpu, rc); 6388 6389 STAM_COUNTER_INC(&pVCpu->hm.s.StatExitHlt); 6390 if (rc != VINF_SUCCESS) 6391 STAM_COUNTER_INC(&pVCpu->hm.s.StatSwitchHltToR3); 6392 return rc; 6385 VBOXSTRICTRC rcStrict; 6386 bool const fSupportsNextRipSave = hmR0SvmSupportsNextRipSave(pVCpu); 6387 if (fSupportsNextRipSave) 6388 { 6389 HMSVM_CPUMCTX_IMPORT_STATE(pVCpu, IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK); 6390 uint8_t const cbInstr = hmR0SvmGetInstrLength(pVCpu); 6391 rcStrict = IEMExecDecodedHlt(pVCpu, cbInstr); 6392 } 6393 else 6394 { 6395 HMSVM_CPUMCTX_IMPORT_STATE(pVCpu, IEM_CPUMCTX_EXTRN_MUST_MASK); 6396 rcStrict = IEMExecOne(pVCpu); 6397 } 6398 6399 if ( rcStrict == VINF_EM_HALT 6400 || rcStrict == VINF_SUCCESS) 6401 { 6402 rcStrict = EMShouldContinueAfterHalt(pVCpu, &pVCpu->cpum.GstCtx) ? VINF_SUCCESS : VINF_EM_HALT; 6403 } 6404 else if (rcStrict == VINF_IEM_RAISED_XCPT) 6405 { 6406 rcStrict = VINF_SUCCESS; 6407 ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_RAISED_XCPT_MASK); 6408 } 6409 HMSVM_CHECK_SINGLE_STEP(pVCpu, rcStrict); 6410 if (rcStrict != VINF_SUCCESS) 6411 STAM_COUNTER_INC(&pVCpu->hm.s.StatSwitchHltToR3); 6412 return VBOXSTRICTRC_VAL(rcStrict);; 6393 6413 } 6394 6414
Note:
See TracChangeset
for help on using the changeset viewer.