VirtualBox

Changeset 81790 in vbox for trunk/src/VBox/VMM/VMMR0


Ignore:
Timestamp:
Nov 12, 2019 5:36:24 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
134581
Message:

VMM/HMVMXR0: Propagate guest-interruptibility state from the VMCS to ring-3 and log it during VERR_VMX_INVALID_GUEST_STATE gurus.

File:
1 edited

Legend:

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

    r81786 r81790  
    25512551 * @param   fIsNstGstVmcs   Whether this is a nested-guest VMCS.
    25522552 */
    2553 static int hmR0VmxCheckVmcsCtls(PVMCPUCC pVCpu, PCVMXVMCSINFO pVmcsInfo, bool fIsNstGstVmcs)
     2553static int hmR0VmxCheckCachedVmcsCtls(PVMCPUCC pVCpu, PCVMXVMCSINFO pVmcsInfo, bool fIsNstGstVmcs)
    25542554{
    25552555    const char * const pcszVmcs = fIsNstGstVmcs ? "Nested-guest VMCS" : "VMCS";
     
    92299229                                            } while (0)
    92309230
    9231     int        rc;
    9232     PVMCC        pVM    = pVCpu->CTX_SUFF(pVM);
     9231    PVMCC      pVM    = pVCpu->CTX_SUFF(pVM);
    92339232    PCPUMCTX   pCtx   = &pVCpu->cpum.GstCtx;
    92349233    uint32_t   uError = VMX_IGS_ERROR;
    9235     uint32_t   u32Val;
     9234    uint32_t   u32IntrState = 0;
    92369235    bool const fUnrestrictedGuest = pVM->hm.s.vmx.fUnrestrictedGuest;
    9237 
    92389236    do
    92399237    {
     9238        int rc;
     9239
     9240        /*
     9241         * Guest-interruptibility state.
     9242         * Read this first so as to record its value for ring-3 propagation.
     9243         */
     9244        rc = VMXReadVmcs32(VMX_VMCS32_GUEST_INT_STATE, &u32IntrState);
     9245        AssertRC(rc);
     9246
     9247        uint32_t u32Val;
     9248        uint64_t u64Val;
     9249
    92409250        /*
    92419251         * CR0.
     
    92759285         * IA32_DEBUGCTL MSR.
    92769286         */
    9277         uint64_t u64Val;
    92789287        rc = VMXReadVmcs64(VMX_VMCS64_GUEST_DEBUGCTL_FULL, &u64Val);
    92799288        AssertRC(rc);
     
    96429651        HMVMX_CHECK_BREAK(   !(pCtx->ss.Attr.n.u2Dpl)
    96439652                          || u32ActivityState != VMX_VMCS_GUEST_ACTIVITY_HLT, VMX_IGS_ACTIVITY_STATE_HLT_INVALID);
    9644         uint32_t u32IntrState;
    9645         rc = VMXReadVmcs32(VMX_VMCS32_GUEST_INT_STATE, &u32IntrState);
    9646         AssertRC(rc);
     9653
    96479654        if (   u32IntrState == VMX_VMCS_GUEST_INT_STATE_BLOCK_MOVSS
    96489655            || u32IntrState == VMX_VMCS_GUEST_INT_STATE_BLOCK_STI)
     
    97589765
    97599766    pVCpu->hm.s.u32HMError = uError;
     9767    pVCpu->hm.s.vmx.LastError.u32GuestIntrState = u32IntrState;
    97609768    return uError;
    97619769
     
    1063410642    hmR0VmxCheckAutoLoadStoreMsrs(pVCpu, pVmcsInfo, pVmxTransient->fIsNestedGuest);
    1063510643    hmR0VmxCheckHostEferMsr(pVCpu, pVmcsInfo);
    10636     AssertRC(hmR0VmxCheckVmcsCtls(pVCpu, pVmcsInfo, pVmxTransient->fIsNestedGuest));
     10644    AssertRC(hmR0VmxCheckCachedVmcsCtls(pVCpu, pVmcsInfo, pVmxTransient->fIsNestedGuest));
    1063710645#endif
    1063810646
     
    1462414632    AssertRCReturn(rc, rc);
    1462514633
    14626     rc = hmR0VmxCheckVmcsCtls(pVCpu, pVmcsInfo, pVmxTransient->fIsNestedGuest);
     14634    rc = hmR0VmxCheckCachedVmcsCtls(pVCpu, pVmcsInfo, pVmxTransient->fIsNestedGuest);
    1462714635    if (RT_FAILURE(rc))
    1462814636        return rc;
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