VirtualBox

Changeset 77094 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Feb 1, 2019 8:54:35 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
128550
Message:

VMM/IEM: Nested VMX: bugref:9180 ifdef related fixes. Also don't ignore status code while injecting an event in IEMExecLots esp as it can cause VM-exits now.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r76856 r77094  
    11331133}
    11341134
    1135 #ifdef VBOX_WITH_NESTED_HWVIRT_SVM
     1135#if defined(VBOX_WITH_NESTED_HWVIRT_SVM) || defined(VBOX_WITH_NESTED_HWVIRT_VMX)
    11361136/**
    11371137 * Performs a minimal reinitialization of the execution state.
     
    55675567        }
    55685568    }
    5569 #endif /* VBOX_WITH_NESTED_HWVIRT_SVM */
     5569#endif
    55705570
    55715571    /*
     
    1433614336     */
    1433714337    /** @todo Can we centralize this under CPUMCanInjectInterrupt()? */
    14338 #if defined(VBOX_WITH_NESTED_HWVIRT_SVM)
     14338#if defined(VBOX_WITH_NESTED_HWVIRT_SVM) || defined(VBOX_WITH_NESTED_HWVIRT_VMX)
    1433914339    bool fIntrEnabled = CPUMGetGuestGif(&pVCpu->cpum.GstCtx);
    1434014340    if (fIntrEnabled)
    1434114341    {
    14342         if (CPUMIsGuestInSvmNestedHwVirtMode(IEM_GET_CTX(pVCpu)))
     14342        if (!CPUMIsGuestInNestedHwvirtMode(IEM_GET_CTX(pVCpu)))
     14343            fIntrEnabled = pVCpu->cpum.GstCtx.eflags.Bits.u1IF;
     14344        else if (CPUMIsGuestInVmxNonRootMode(IEM_GET_CTX(pVCpu)))
     14345            fIntrEnabled = CPUMIsGuestVmxPhysIntrEnabled(pVCpu, IEM_GET_CTX(pVCpu));
     14346        else
     14347        {
     14348            Assert(CPUMIsGuestInSvmNestedHwVirtMode(IEM_GET_CTX(pVCpu)));
    1434314349            fIntrEnabled = CPUMIsGuestSvmPhysIntrEnabled(pVCpu, IEM_GET_CTX(pVCpu));
    14344         else
    14345             fIntrEnabled = pVCpu->cpum.GstCtx.eflags.Bits.u1IF;
     14350        }
    1434614351    }
    1434714352#else
     
    1435714362        RTGCPTR     uCr2;
    1435814363        int rc2 = TRPMQueryTrapAll(pVCpu, &u8TrapNo, &enmType, &uErrCode, &uCr2, NULL /* pu8InstLen */); AssertRC(rc2);
    14359         IEMInjectTrap(pVCpu, u8TrapNo, enmType, (uint16_t)uErrCode, uCr2, 0 /* cbInstr */);
     14364        VBOXSTRICTRC rcStrict = IEMInjectTrap(pVCpu, u8TrapNo, enmType, (uint16_t)uErrCode, uCr2, 0 /* cbInstr */);
    1436014365        TRPMResetTrap(pVCpu);
     14366#if defined(VBOX_WITH_NESTED_HWVIRT_SVM) || defined(VBOX_WITH_NESTED_HWVIRT_VMX)
     14367        /* Injecting an event may cause a VM-exit. */
     14368        if (   rcStrict != VINF_SUCCESS
     14369            && rcStrict != VINF_IEM_RAISED_XCPT)
     14370            return iemExecStatusCodeFiddling(pVCpu, rcStrict);
     14371#else
     14372        NOREF(rcStrict);
     14373#endif
    1436114374    }
    1436214375
     
    1445614469            iemMemRollback(pVCpu);
    1445714470
    14458 #ifdef VBOX_WITH_NESTED_HWVIRT_SVM
     14471#if defined(VBOX_WITH_NESTED_HWVIRT_SVM) || defined(VBOX_WITH_NESTED_HWVIRT_VMX)
    1445914472        /*
    1446014473         * When a nested-guest causes an exception intercept (e.g. #PF) when fetching
     
    1463314646            iemMemRollback(pVCpu);
    1463414647
    14635 #ifdef VBOX_WITH_NESTED_HWVIRT_SVM
     14648#if defined(VBOX_WITH_NESTED_HWVIRT_SVM) || defined(VBOX_WITH_NESTED_HWVIRT_VMX)
    1463614649        /*
    1463714650         * When a nested-guest causes an exception intercept (e.g. #PF) when fetching
     
    1475014763
    1475114764    VBOXSTRICTRC rcStrict = IEMInjectTrap(pVCpu, u8TrapNo, enmType, uErrCode, uCr2, cbInstr);
    14752 # ifdef VBOX_WITH_NESTED_HWVIRT_SVM
     14765#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
    1475314766    if (rcStrict == VINF_SVM_VMEXIT)
    1475414767        rcStrict = VINF_SUCCESS;
    14755 # endif
    14756 
     14768#endif
     14769#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
     14770    if (rcStrict == VINF_VMX_VMEXIT)
     14771        rcStrict = VINF_SUCCESS;
     14772#endif
    1475714773    /** @todo Are there any other codes that imply the event was successfully
    1475814774     *        delivered to the guest? See @bugref{6607}.  */
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r77091 r77094  
    65696569     */
    65706570    uint64_t uTicks = TMCpuTickGet(pVCpu);
    6571 #ifdef VBOX_WITH_NESTED_HWVIRT_SVM
     6571#if defined(VBOX_WITH_NESTED_HWVIRT_SVM) || defined(VBOX_WITH_NESTED_HWVIRT_VMX)
    65726572    uTicks = CPUMApplyNestedGuestTscOffset(pVCpu, uTicks);
    65736573#endif
     
    66266626
    66276627        uint64_t uTicks = TMCpuTickGet(pVCpu);
    6628 #ifdef VBOX_WITH_NESTED_HWVIRT_SVM
     6628#if defined(VBOX_WITH_NESTED_HWVIRT_SVM) || defined(VBOX_WITH_NESTED_HWVIRT_VMX)
    66296629        uTicks = CPUMApplyNestedGuestTscOffset(pVCpu, uTicks);
    66306630#endif
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h

    r76993 r77094  
    17651765    }
    17661766
    1767     /* Segment attribute bits 31:7 and 11:8 MBZ. */
     1767    /* Segment attribute bits 31:17 and 11:8 MBZ. */
    17681768    uint32_t const fValidAttrMask = X86DESCATTR_TYPE | X86DESCATTR_DT  | X86DESCATTR_DPL | X86DESCATTR_P
    17691769                                  | X86DESCATTR_AVL  | X86DESCATTR_L   | X86DESCATTR_D   | X86DESCATTR_G | X86DESCATTR_UNUSABLE;
     
    33173317    if ((fReadShadow & fGstHostMask) != (*puNewCrX & fGstHostMask))
    33183318    {
     3319        Assert(fGstHostMask != 0);
    33193320        Log2(("mov_Cr_Rd: (CR%u) Guest intercept -> VM-exit\n", iCrReg));
    33203321
     
    39673968     * We are injecting an external interrupt, check if we need to cause a VM-exit now.
    39683969     * If not, the caller will continue delivery of the external interrupt as it would
    3969      * normally.
     3970     * normally. The interrupt is no longer pending in the interrupt controller at this
     3971     * point.
    39703972     */
    39713973    if (fFlags & IEM_XCPT_FLAGS_T_EXT_INT)
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