VirtualBox

Changeset 73051 in vbox


Ignore:
Timestamp:
Jul 11, 2018 2:52:45 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
123611
Message:

VMM/HMSVMR0: bugref:9204 Fix monitor.

File:
1 edited

Legend:

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

    r73050 r73051  
    64206420{
    64216421    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);
    64306438    }
    64316439    else
    64326440    {
    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);
    64366451    STAM_COUNTER_INC(&pVCpu->hm.s.StatExitMonitor);
    6437     return rc;
     6452    return VBOXSTRICTRC_TODO(rcStrict);
    64386453}
    64396454
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