Changeset 66758 in vbox
- Timestamp:
- May 3, 2017 1:20:36 PM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 115168
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp
r66754 r66758 3944 3944 { 3945 3945 case SVM_EVENT_EXCEPTION: 3946 /* 3947 * Only INT3 and INTO instructions can raise #BP and #OF exceptions. 3948 * See AMD spec. Table 8-1. "Interrupt Vector Source and Cause". 3949 */ 3946 3950 if (pEvent->n.u8Vector == X86_XCPT_BP) 3947 3951 { … … 4038 4042 IEMXCPTRAISE enmRaise; 4039 4043 IEMXCPTRAISEINFO fRaiseInfo; 4040 bool fReflectingNmi = false;4041 4044 bool const fExitIsHwXcpt = pSvmTransient->u64ExitCode - SVM_EXIT_EXCEPTION_0 <= SVM_EXIT_EXCEPTION_31; 4042 4045 if (fExitIsHwXcpt) … … 4047 4050 uint32_t const fExitVectorFlags = IEM_XCPT_FLAGS_T_CPU_XCPT; 4048 4051 enmRaise = IEMEvaluateRecursiveXcpt(pVCpu, fIdtVectorFlags, uIdtVector, fExitVectorFlags, uExitVector, &fRaiseInfo); 4049 4050 if (fRaiseInfo & (IEMXCPTRAISEINFO_EXT_INT_PF | IEMXCPTRAISEINFO_NMI_PF))4051 {4052 if (fRaiseInfo & IEMXCPTRAISEINFO_NMI_XCPT)4053 fReflectingNmi = true;4054 pSvmTransient->fVectoringPF = true;4055 }4056 else if (fRaiseInfo & IEMXCPTRAISEINFO_PF_PF)4057 pSvmTransient->fVectoringDoublePF = true;4058 4052 } 4059 4053 else … … 4075 4069 if (!(fRaiseInfo & IEMXCPTRAISEINFO_SOFT_INT_XCPT)) 4076 4070 { 4077 /* If we are re-injecting the NMI, clear NMI blocking. */ 4078 if (fReflectingNmi) 4079 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_BLOCK_NMIS); 4071 /* Determine a vectoring #PF condition, see comment in hmR0SvmExitXcptPF(). */ 4072 if (fRaiseInfo & (IEMXCPTRAISEINFO_EXT_INT_PF | IEMXCPTRAISEINFO_NMI_PF)) 4073 { 4074 pSvmTransient->fVectoringPF = true; 4075 /* If we are re-injecting the NMI, clear NMI blocking. */ 4076 if (fRaiseInfo & IEMXCPTRAISEINFO_NMI_XCPT) 4077 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_BLOCK_NMIS); 4078 } 4080 4079 4081 4080 Assert(pVmcb->ctrl.ExitIntInfo.n.u3Type != SVM_EVENT_SOFTWARE_INT); … … 4092 4091 case IEMXCPTRAISE_DOUBLE_FAULT: 4093 4092 { 4094 STAM_COUNTER_INC(&pVCpu->hm.s.StatInjectPendingReflect); 4095 hmR0SvmSetPendingXcptDF(pVCpu); 4096 rc = VINF_HM_DOUBLE_FAULT; 4093 /* 4094 * Determing a vectoring double #PF condition. Used later, when PGM evaluates the 4095 * second #PF as a guest #PF (and not a shadow #PF) and needs to be converted into a #DF. 4096 */ 4097 if (fRaiseInfo & IEMXCPTRAISEINFO_PF_PF) 4098 { 4099 pSvmTransient->fVectoringDoublePF = true; 4100 Assert(rc == VINF_SUCCESS); 4101 } 4102 else 4103 { 4104 STAM_COUNTER_INC(&pVCpu->hm.s.StatInjectPendingReflect); 4105 hmR0SvmSetPendingXcptDF(pVCpu); 4106 rc = VINF_HM_DOUBLE_FAULT; 4107 } 4097 4108 break; 4098 4109 }
Note:
See TracChangeset
for help on using the changeset viewer.