VirtualBox

Changeset 66713 in vbox for trunk


Ignore:
Timestamp:
Apr 28, 2017 7:30:05 AM (7 years ago)
Author:
vboxsync
Message:

VMM/HMVMXR0: Fixes while using IEM event reflection code.

File:
1 edited

Legend:

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

    r66706 r66713  
    59055905            enmRaise = IEMEvaluateRecursiveXcpt(pVCpu, fIdtVectorFlags, uIdtVector, fExitVectorFlags, uExitVector,
    59065906                                                &fRaiseInfo);
     5907
     5908            if (fRaiseInfo & (IEMXCPTRAISEINFO_EXT_INT_XCPT | IEMXCPTRAISEINFO_NMI_XCPT))
     5909            {
     5910                /*
     5911                 * For some reason we go back to the interpreter if delivery of an external interrupt or
     5912                 * NMI causes an exception, see hmR0VmxExitXcptOrNmi. As long as we go back to the interpret
     5913                 * we need to keep the previous (first) event pending, hence this hack.
     5914                 */
     5915                enmRaise = IEMXCPTRAISE_PREV_EVENT;
     5916
     5917                /* Determine a vectoring #PF condition, see comment in hmR0VmxExitXcptPF(). */
     5918                if (fRaiseInfo & (IEMXCPTRAISEINFO_EXT_INT_PF | IEMXCPTRAISEINFO_NMI_PF))
     5919                    pVmxTransient->fVectoringPF = true;
     5920            }
    59075921        }
    59085922        else
     
    59415955            && uIdtVectorType == VMX_IDT_VECTORING_INFO_TYPE_NMI
    59425956            && (   enmRaise   == IEMXCPTRAISE_PREV_EVENT
    5943                 || fRaiseInfo == IEMXCPTRAISEINFO_NMI_PF)
     5957                || (fRaiseInfo & IEMXCPTRAISEINFO_NMI_PF))
    59445958            && (pVCpu->hm.s.vmx.u32PinCtls & VMX_VMCS_CTRL_PIN_EXEC_VIRTUAL_NMI))
    59455959        {
     
    59505964        {
    59515965            case IEMXCPTRAISE_CURRENT_XCPT:
    5952             {
    5953                 /*
    5954                  * Determine a vectoring #PF condition, see comment in hmR0VmxExitXcptPF().
    5955                  */
    5956                 if (fRaiseInfo & (IEMXCPTRAISEINFO_EXT_INT_PF | IEMXCPTRAISEINFO_NMI_PF))
    5957                     pVmxTransient->fVectoringPF = true;
    5958 
    5959                 /*
    5960                  * Determing a vectoring double #PF condition. Used later, when PGM evaluates the
    5961                  * second #PF as a guest #PF (and not a nested #PF) and needs to be converted into a #DF.
    5962                  */
    5963                 if (fRaiseInfo & IEMXCPTRAISEINFO_PF_PF)
    5964                     pVmxTransient->fVectoringDoublePF = true;
    5965 
     5966            case IEMXCPTRAISE_REEXEC_INSTR:
    59665967                Assert(rcStrict == VINF_SUCCESS);
    59675968                break;
    5968             }
    59695969
    59705970            case IEMXCPTRAISE_PREV_EVENT:
     
    60006000            case IEMXCPTRAISE_DOUBLE_FAULT:
    60016001            {
    6002                 STAM_COUNTER_INC(&pVCpu->hm.s.StatInjectPendingReflect);
    6003                 hmR0VmxSetPendingXcptDF(pVCpu, pMixedCtx);
    6004 
    6005                 Log4(("IDT: vcpu[%RU32] Pending vectoring #DF %#RX64 uIdtVector=%#x uExitVector=%#x\n", pVCpu->idCpu,
    6006                       pVCpu->hm.s.Event.u64IntInfo, uIdtVector, uExitVector));
    6007                 rcStrict = VINF_HM_DOUBLE_FAULT;
     6002                /*
     6003                 * Determing a vectoring double #PF condition. Used later, when PGM evaluates the
     6004                 * second #PF as a guest #PF (and not a nested #PF) and needs to be converted into a #DF.
     6005                 */
     6006                if (fRaiseInfo & IEMXCPTRAISEINFO_PF_PF)
     6007                {
     6008                    pVmxTransient->fVectoringDoublePF = true;
     6009                    Log4(("IDT: vcpu[%RU32] Vectoring double #PF %#RX64 cr2=%#RX64\n", pVCpu->idCpu, pVCpu->hm.s.Event.u64IntInfo,
     6010                          pMixedCtx->cr2));
     6011                    rcStrict = VINF_SUCCESS;
     6012                }
     6013                else
     6014                {
     6015                    STAM_COUNTER_INC(&pVCpu->hm.s.StatInjectPendingReflect);
     6016                    hmR0VmxSetPendingXcptDF(pVCpu, pMixedCtx);
     6017                    Log4(("IDT: vcpu[%RU32] Pending vectoring #DF %#RX64 uIdtVector=%#x uExitVector=%#x\n", pVCpu->idCpu,
     6018                          pVCpu->hm.s.Event.u64IntInfo, uIdtVector, uExitVector));
     6019                    rcStrict = VINF_HM_DOUBLE_FAULT;
     6020                }
    60086021                break;
    60096022            }
     
    60236036                break;
    60246037            }
    6025 
    6026             case IEMXCPTRAISE_REEXEC_INSTR:
    6027                 Assert(rcStrict == VINF_SUCCESS);
    6028                 break;
    60296038
    60306039            default:
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