Changeset 66713 in vbox
- Timestamp:
- Apr 28, 2017 7:30:05 AM (7 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r66706 r66713 5905 5905 enmRaise = IEMEvaluateRecursiveXcpt(pVCpu, fIdtVectorFlags, uIdtVector, fExitVectorFlags, uExitVector, 5906 5906 &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 } 5907 5921 } 5908 5922 else … … 5941 5955 && uIdtVectorType == VMX_IDT_VECTORING_INFO_TYPE_NMI 5942 5956 && ( enmRaise == IEMXCPTRAISE_PREV_EVENT 5943 || fRaiseInfo == IEMXCPTRAISEINFO_NMI_PF)5957 || (fRaiseInfo & IEMXCPTRAISEINFO_NMI_PF)) 5944 5958 && (pVCpu->hm.s.vmx.u32PinCtls & VMX_VMCS_CTRL_PIN_EXEC_VIRTUAL_NMI)) 5945 5959 { … … 5950 5964 { 5951 5965 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: 5966 5967 Assert(rcStrict == VINF_SUCCESS); 5967 5968 break; 5968 }5969 5969 5970 5970 case IEMXCPTRAISE_PREV_EVENT: … … 6000 6000 case IEMXCPTRAISE_DOUBLE_FAULT: 6001 6001 { 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 } 6008 6021 break; 6009 6022 } … … 6023 6036 break; 6024 6037 } 6025 6026 case IEMXCPTRAISE_REEXEC_INSTR:6027 Assert(rcStrict == VINF_SUCCESS);6028 break;6029 6038 6030 6039 default:
Note:
See TracChangeset
for help on using the changeset viewer.

