VirtualBox

Changeset 45546 in vbox for trunk/src


Ignore:
Timestamp:
Apr 14, 2013 8:32:40 PM (12 years ago)
Author:
vboxsync
Message:

VMM/VMMR0: More vectoring event handling.

File:
1 edited

Legend:

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

    r45545 r45546  
    47384738        typedef enum
    47394739        {
    4740             VMXREFLECTXCPT_XCPT,    /* Reflect Idt-vectoring exception. */
    4741             VMXREFLECTXCPT_DF,      /* Reflect a double-fault to the guest. */
    4742             VMXREFLECTXCPT_TF,      /* Reflect a triple fault state to the VMM. */
     4740            VMXREFLECTXCPT_XCPT,    /* Reflect the exception to the guest or for further evaluation by VMM. */
     4741            VMXREFLECTXCPT_DF,      /* Reflect the exception as a double-fault to the guest. */
     4742            VMXREFLECTXCPT_TF,      /* Indicate a triple faulted state to the VMM. */
    47434743            VMXREFLECTXCPT_NONE     /* Nothing to reflect. */
    47444744        } VMXREFLECTXCPT;
     
    47544754            }
    47554755            else if (   uExitVector == X86_XCPT_PF
    4756                      && (   hmR0VmxIsContributoryXcpt(uIdtVector)
    4757                          || uIdtVector == X86_XCPT_PF))
     4756                     && uIdtVector == X86_XCPT_PF)
    47584757            {
    47594758                pVmxTransient->fVectoringPF = true;
     4759                enmReflect = VMXREFLECTXCPT_XCPT;
    47604760            }
    47614761            else if (   hmR0VmxIsContributoryXcpt(uIdtVector)
     
    47854785        }
    47864786
    4787         Assert(pVmxTransient->fVectoringPF == false || enmReflect == VMXREFLECTXCPT_NONE);
    47884787        switch (enmReflect)
    47894788        {
     
    88268825            /* A guest page-fault occurred during delivery of a page-fault. Inject #DF. */
    88278826            Log(("Pending #DF due to vectoring #PF.\n"));
     8827            pVCpu->hm.s.Event.fPending = false;
    88288828            rc = hmR0VmxSetPendingXcptDF(pVCpu, pMixedCtx);
    88298829        }
     
    88668866#endif
    88678867
     8868    Assert(!pVmxTransient->fVectoringPF || pVCpu->hm.s.Event.fPending);
     8869
    88688870    rc = hmR0VmxSaveGuestState(pVCpu, pMixedCtx);
    88698871    AssertRCReturn(rc, rc);
     
    88988900            pMixedCtx->cr2 = pVmxTransient->uExitQualification;
    88998901            hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntrInfo),
    8900                                    pVmxTransient->cbInstr, uGstErrorCode, pMixedCtx->cr2);
     8902                                   0 /* cbInstr */, uGstErrorCode, pMixedCtx->cr2);
    89018903        }
    89028904        else
     
    89048906            /* A guest page-fault occurred during delivery of a page-fault. Inject #DF. */
    89058907            TRPMResetTrap(pVCpu);
     8908            pVCpu->hm.s.Event.fPending = false;
    89068909            hmR0VmxSetPendingXcptDF(pVCpu, pMixedCtx);
    89078910            Log(("#PF: Pending #DF due to vectoring #PF\n"));
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette