VirtualBox

Changeset 79843 in vbox


Ignore:
Timestamp:
Jul 17, 2019 5:42:11 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
132230
Message:

VMM/EM: Nested VMX: bugref:9180 Nested SVM: bugref:7243 Fix missing CPUMIsGuestPhysIntrEnabled for the VMX case and re-factored the code to be far more readable.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/EM.cpp

    r79831 r79843  
    17171717 *
    17181718 * @returns VBox status code.
     1719 * @retval  VINF_NO_CHANGE if the VMX external interrupt intercept was not active.
    17191720 * @param   pVCpu       The cross context virtual CPU structure.
    17201721 */
     
    17221723{
    17231724#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
    1724     Assert(CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx));
    1725 
    17261725    /* Handle the "external interrupt" VM-exit intercept. */
    17271726    if (    CPUMIsGuestVmxPinCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PIN_CTLS_EXT_INT_EXIT)
     
    17461745 *
    17471746 * @returns VBox status code.
     1747 * @retval  VINF_NO_CHANGE if the SVM external interrupt intercept was not active.
    17481748 * @param   pVCpu       The cross context virtual CPU structure.
    17491749 */
     
    17511751{
    17521752#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
    1753     Assert(CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx));
    1754 
    17551753    /* Handle the physical interrupt intercept (can be masked by the guest hypervisor). */
    1756     if (   CPUMIsGuestPhysIntrEnabled(pVCpu)
    1757         && CPUMIsGuestSvmCtrlInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, SVM_CTRL_INTERCEPT_INTR))
     1754    if (CPUMIsGuestSvmCtrlInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, SVM_CTRL_INTERCEPT_INTR))
    17581755    {
    17591756        CPUM_ASSERT_NOT_EXTRN(pVCpu, IEM_CPUMCTX_EXTRN_SVM_VMEXIT_MASK);
     
    17811778 *
    17821779 * @returns VBox status code.
     1780 * @retval  VINF_NO_CHANGE if the SVM virtual interrupt intercept was not active.
    17831781 * @param   pVCpu       The cross context virtual CPU structure.
    17841782 */
     
    21662164            && !TRPMHasTrap(pVCpu))                                  /* An event could already be scheduled for dispatching. */
    21672165        {
     2166            bool fInVmxNonRootMode;
     2167            bool fInSvmHwvirtMode;
     2168            bool const fInNestedGuest = CPUMIsGuestInNestedHwvirtMode(&pVCpu->cpum.GstCtx);
     2169            if (fInNestedGuest)
     2170            {
     2171                fInVmxNonRootMode = CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx);
     2172                fInSvmHwvirtMode  = CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx);
     2173            }
     2174            else
     2175            {
     2176                fInVmxNonRootMode = false;
     2177                fInSvmHwvirtMode  = false;
     2178            }
     2179
    21682180            bool fGif = CPUMGetGuestGif(&pVCpu->cpum.GstCtx);
    21692181#ifdef VBOX_WITH_RAW_MODE
     
    22022214                {
    22032215#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
    2204                     if (   CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx)
     2216                    if (   fInVmxNonRootMode
    22052217                        && CPUMIsGuestVmxPinCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PIN_CTLS_NMI_EXIT))
    22062218                    {
     
    22122224#endif
    22132225#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
    2214                     if (   CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx)
     2226                    if (   fInSvmHwvirtMode
    22152227                        && CPUMIsGuestSvmCtrlInterceptSet(pVCpu, &pVCpu->cpum.GstCtx, SVM_CTRL_INTERCEPT_NMI))
    22162228                    {
     
    22712283                     * SVM: physical interrupts takes priority over virtual interrupts.
    22722284                     */
    2273                     if (   VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_NESTED_GUEST)
    2274                         && CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx)
     2285                    if (   fInVmxNonRootMode
     2286                        && VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_NESTED_GUEST)
    22752287                        && CPUMIsGuestVmxVirtIntrEnabled(pVCpu, &pVCpu->cpum.GstCtx))
    22762288                    {
    22772289                        /** @todo NSTVMX: virtual-interrupt delivery. */
    2278                         rc2 = VINF_NO_CHANGE;
     2290                        rc2 = VINF_SUCCESS;
    22792291                    }
    2280                     else if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC))
     2292                    else if (   VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC)
     2293                             && CPUMIsGuestPhysIntrEnabled(pVCpu))
    22812294                    {
    2282                         bool fInjected = false;
    22832295                        Assert(pVCpu->em.s.enmState != EMSTATE_WAIT_SIPI);
    2284 
    2285                         if (!CPUMIsGuestInNestedHwvirtMode(&pVCpu->cpum.GstCtx))
    2286                         {
    2287                             if (CPUMIsGuestPhysIntrEnabled(pVCpu))
    2288                                 rc2 = VINF_NO_CHANGE;
    2289                             else
    2290                                 rc2 = VINF_SUCCESS;
    2291                         }
    2292                         else if (CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx))
     2296                        if (fInVmxNonRootMode)
    22932297                            rc2 = emR3VmxNstGstIntrIntercept(pVCpu);
     2298                        else if (fInSvmHwvirtMode)
     2299                            rc2 = emR3SvmNstGstIntrIntercept(pVCpu);
    22942300                        else
    2295                         {
    2296                             Assert(CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx));
    2297                             rc2 = emR3SvmNstGstIntrIntercept(pVCpu);
    2298                         }
    2299 
    2300                         /* If no interrupt has been injected so far, do so now. */
     2301                            rc2 = VINF_NO_CHANGE;
     2302
    23012303                        if (rc2 == VINF_NO_CHANGE)
    23022304                        {
     2305                            bool fInjected = false;
    23032306                            CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_XCPT_MASK);
    23042307                            /** @todo this really isn't nice, should properly handle this */
     
    23122315                                rc2 = VINF_EM_RESCHEDULE;
    23132316                            }
     2317#ifdef VBOX_STRICT
     2318                            if (fInjected)
     2319                                rcIrq = rc2;
     2320#endif
    23142321                        }
    2315 #ifdef VBOX_STRICT
    2316                         if (fInjected)
    2317                             rcIrq = rc2;
    2318 #endif
    23192322                        UPDATE_RC();
    23202323                    }
    2321                     else if (   VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_NESTED_GUEST)
    2322                              && CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx)
     2324                    else if (   fInSvmHwvirtMode
     2325                             && VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_NESTED_GUEST)
    23232326                             && CPUMIsGuestSvmVirtIntrEnabled(pVCpu,  &pVCpu->cpum.GstCtx))
    23242327                    {
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