Changeset 79750 in vbox
- Timestamp:
- Jul 13, 2019 6:17:38 AM (5 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r79721 r79750 14360 14360 #endif 14361 14361 pVCpu->hm.s.Event.fPending = false; /* In case it's a contributory or vectoring #PF. */ 14362 if ( RT_LIKELY(!pVmxTransient->fVectoringDoublePF))14362 if (!pVmxTransient->fVectoringDoublePF) 14363 14363 { 14364 14364 hmR0VmxSetPendingEvent(pVCpu, VMX_ENTRY_INT_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 0 /* cbInstr */, … … 14368 14368 { 14369 14369 /* A guest page-fault occurred during delivery of a page-fault. Inject #DF. */ 14370 Assert(!pVmxTransient->fIsNestedGuest); 14370 14371 hmR0VmxSetPendingXcptDF(pVCpu); 14371 14372 Log4Func(("Pending #DF due to vectoring #PF w/ NestedPaging\n")); … … 14374 14375 return rc; 14375 14376 } 14377 14378 Assert(!pVmxTransient->fIsNestedGuest); 14376 14379 14377 14380 /* If it's a vectoring #PF, emulate injecting the original event injection as PGMTrap0eHandler() is incapable … … 14460 14463 } 14461 14464 14465 rc = hmR0VmxReadExitIntInfoVmcs(pVmxTransient); 14466 rc |= hmR0VmxReadExitIntErrorCodeVmcs(pVmxTransient); 14467 rc |= hmR0VmxReadExitInstrLenVmcs(pVmxTransient); 14468 AssertRCReturn(rc, rc); 14469 14462 14470 hmR0VmxSetPendingEvent(pVCpu, VMX_ENTRY_INT_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), pVmxTransient->cbInstr, 14463 14471 pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */); … … 14478 14486 14479 14487 PCPUMCTX pCtx = &pVCpu->cpum.GstCtx; 14480 rc = DBGFRZTrap03Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pCtx)); 14488 if (!pVmxTransient->fIsNestedGuest) 14489 rc = DBGFRZTrap03Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pCtx)); 14490 else 14491 rc = VINF_EM_RAW_GUEST_TRAP; 14481 14492 if (rc == VINF_EM_RAW_GUEST_TRAP) 14482 14493 { … … 14496 14507 14497 14508 /** 14498 * VM-exit exception handler for \#AC ( alignmentcheck exception).14509 * VM-exit exception handler for \#AC (Alignment-check exception). 14499 14510 */ 14500 14511 static VBOXSTRICTRC hmR0VmxExitXcptAC(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient) … … 14536 14547 14537 14548 PCPUMCTX pCtx = &pVCpu->cpum.GstCtx; 14538 rc = DBGFRZTrap01Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pCtx), uDR6, pVCpu->hm.s.fSingleInstruction); 14549 if (!pVmxTransient->fIsNestedGuest) 14550 rc = DBGFRZTrap01Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pCtx), uDR6, pVCpu->hm.s.fSingleInstruction); 14551 else 14552 rc = VINF_EM_RAW_GUEST_TRAP; 14539 14553 Log6Func(("rc=%Rrc\n", rc)); 14540 14554 if (rc == VINF_EM_RAW_GUEST_TRAP) … … 14667 14681 } 14668 14682 14683 14669 14684 /** 14670 14685 * VM-exit exception handler for \#GP (General-protection exception). 14671 *14672 * @remarks Requires pVmxTransient->uExitIntInfo to be up-to-date.14673 14686 */ 14674 14687 static VBOXSTRICTRC hmR0VmxExitXcptGP(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient) … … 14686 14699 Assert(pVCpu->hm.s.fUsingDebugLoop || pVCpu->hm.s.fTrapXcptGpForLovelyMesaDrv || pVmxTransient->fIsNestedGuest); 14687 14700 #endif 14688 /* If the guest is not in real-mode or we have unrestricted guest execution support, reflect #GP to the guest. */ 14701 /* 14702 * If the guest is not in real-mode or we have unrestricted guest execution support, or if we are 14703 * executing a nested-guest, reflect #GP to the guest or nested-guest. 14704 */ 14689 14705 int rc = hmR0VmxReadExitIntInfoVmcs(pVmxTransient); 14690 14706 rc |= hmR0VmxReadExitIntErrorCodeVmcs(pVmxTransient); … … 14746 14762 14747 14763 /** 14748 * VM-exit exception handler wrapper for generic exceptions. 14764 * VM-exit exception handler wrapper for all other exceptions that are not handled 14765 * by a specific handler. 14749 14766 * 14750 14767 * This simply re-injects the exception back into the VM without any special 14751 14768 * processing. 14752 14769 */ 14753 static VBOXSTRICTRC hmR0VmxExitXcpt Generic(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)14770 static VBOXSTRICTRC hmR0VmxExitXcptOthers(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient) 14754 14771 { 14755 14772 HMVMX_VALIDATE_EXIT_XCPT_HANDLER_PARAMS(pVCpu, pVmxTransient); … … 14814 14831 return VINF_SUCCESS; 14815 14832 } 14833 14834 14835 /** 14836 * VM-exit exception handler for all exceptions. 14837 * 14838 * @remarks This may be called for both guests and nested-guests. Take care to not 14839 * make assumptions and avoid doing anything that is not relevant when 14840 * executing a nested-guest (e.g., Mesa driver hacks). 14841 */ 14842 DECL_FORCE_INLINE(VBOXSTRICTRC) hmR0VmxExitXcptAll(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient, uint8_t uVector) 14843 { 14844 switch (uVector) 14845 { 14846 case X86_XCPT_PF: return hmR0VmxExitXcptPF(pVCpu, pVmxTransient); 14847 case X86_XCPT_GP: return hmR0VmxExitXcptGP(pVCpu, pVmxTransient); 14848 case X86_XCPT_MF: return hmR0VmxExitXcptMF(pVCpu, pVmxTransient); 14849 case X86_XCPT_DB: return hmR0VmxExitXcptDB(pVCpu, pVmxTransient); 14850 case X86_XCPT_BP: return hmR0VmxExitXcptBP(pVCpu, pVmxTransient); 14851 case X86_XCPT_AC: return hmR0VmxExitXcptAC(pVCpu, pVmxTransient); 14852 default: 14853 return hmR0VmxExitXcptOthers(pVCpu, pVmxTransient); 14854 } 14855 } 14816 14856 /** @} */ 14817 14857 … … 14912 14952 break; 14913 14953 } 14914 14915 switch (uVector) 14916 { 14917 case X86_XCPT_PF: rcStrict = hmR0VmxExitXcptPF(pVCpu, pVmxTransient); break; 14918 case X86_XCPT_GP: rcStrict = hmR0VmxExitXcptGP(pVCpu, pVmxTransient); break; 14919 case X86_XCPT_MF: rcStrict = hmR0VmxExitXcptMF(pVCpu, pVmxTransient); break; 14920 case X86_XCPT_DB: rcStrict = hmR0VmxExitXcptDB(pVCpu, pVmxTransient); break; 14921 case X86_XCPT_BP: rcStrict = hmR0VmxExitXcptBP(pVCpu, pVmxTransient); break; 14922 case X86_XCPT_AC: rcStrict = hmR0VmxExitXcptAC(pVCpu, pVmxTransient); break; 14923 default: 14924 rcStrict = hmR0VmxExitXcptGeneric(pVCpu, pVmxTransient); 14925 break; 14926 } 14954 rcStrict = hmR0VmxExitXcptAll(pVCpu, pVmxTransient, uVector); 14927 14955 break; 14928 14956 } … … 17066 17094 */ 17067 17095 pVCpu->hm.s.Event.fPending = false; 17068 hmR0VmxSetPendingEvent(pVCpu, VMX_ENTRY_INT_INFO_FROM_EXIT_INT_INFO(uExitIntInfo), pVmxTransient->cbInstr, 17069 pVmxTransient->uExitIntErrorCode, pVmxTransient->uExitQual); 17070 return VINF_SUCCESS; 17096 return hmR0VmxExitXcptAll(pVCpu, pVmxTransient, uVector); 17071 17097 } 17072 17098
Note:
See TracChangeset
for help on using the changeset viewer.

