Changeset 79759 in vbox
- Timestamp:
- Jul 13, 2019 4:46:21 PM (5 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r79758 r79759 71 71 #define HMVMX_FLUSH_TAGGED_TLB_NONE 3 72 72 73 /** @name HMVMX_READ_XXX73 /** 74 74 * Flags to skip redundant reads of some common VMCS fields that are not part of 75 75 * the guest-CPU or VCPU state but are needed while handling VM-exits. … … 83 83 #define HMVMX_READ_EXIT_INSTR_INFO RT_BIT_32(6) 84 84 #define HMVMX_READ_GUEST_LINEAR_ADDR RT_BIT_32(7) 85 /** @} */ 86 87 /** All the VMCS fields required for our processing of exception/NMI VM-exits. */ 88 #define HMVMX_READ_XCPT_INFO ( HMVMX_READ_EXIT_INTERRUPTION_INFO \ 89 | HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE \ 90 | HMVMX_READ_EXIT_INSTR_LEN \ 91 | HMVMX_READ_IDT_VECTORING_INFO \ 92 | HMVMX_READ_IDT_VECTORING_ERROR_CODE) 85 86 /** All the VMCS fields required for processing of exception/NMI VM-exits. */ 87 #define HMVMX_READ_XCPT_INFO ( HMVMX_READ_EXIT_INTERRUPTION_INFO \ 88 | HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE \ 89 | HMVMX_READ_EXIT_INSTR_LEN \ 90 | HMVMX_READ_IDT_VECTORING_INFO \ 91 | HMVMX_READ_IDT_VECTORING_ERROR_CODE) 92 93 /** Assert that all the given fields have been read from the VMCS. */ 94 #ifdef VBOX_STRICT 95 # define HMVMX_ASSERT_READ(a_pVmxTransient, a_fReadFields) \ 96 do { \ 97 uint32_t const fVmcsFieldRead = ASMAtomicUoReadU32(&pVmxTransient->fVmcsFieldsRead); \ 98 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); \ 99 Assert((fVmcsFieldRead & (a_fReadFields)) == (a_fReadFields)); \ 100 } while (0) 101 #else 102 # define HMVMX_ASSERT_READ(a_pVmxTransient, a_fReadFields) do { } while (0) 103 #endif 93 104 94 105 /** … … 13630 13641 static int hmR0VmxCheckExitDueToEventDeliveryNested(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient) 13631 13642 { 13643 Assert(!pVCpu->hm.s.Event.fPending); 13632 13644 Assert(pVmxTransient->fIsNestedGuest); 13633 Assert(!pVCpu->hm.s.Event.fPending); 13634 13635 #ifdef VBOX_STRICT 13636 /* 13637 * Validate we have read the required fields from the VMCS. 13638 */ 13639 uint32_t const fVmcsFieldRead = ASMAtomicUoReadU32(&pVmxTransient->fVmcsFieldsRead); 13640 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); 13641 Assert((fVmcsFieldRead & HMVMX_READ_XCPT_INFO) == HMVMX_READ_XCPT_INFO); 13642 #endif 13645 HMVMX_ASSERT_READ(pVmxTransient, HMVMX_READ_XCPT_INFO); 13643 13646 13644 13647 /* … … 13774 13777 #endif 13775 13778 13779 Assert(!pVCpu->hm.s.Event.fPending); 13776 13780 Assert(!pVmxTransient->fIsNestedGuest); 13777 VBOXSTRICTRC rcStrict = VINF_SUCCESS; 13778 13779 #ifdef VBOX_STRICT 13780 /* 13781 * Validate we have read the required fields from the VMCS. 13782 */ 13783 { 13784 uint32_t const fVmcsFieldRead = ASMAtomicUoReadU32(&pVmxTransient->fVmcsFieldsRead); 13785 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); 13786 Assert((fVmcsFieldRead & HMVMX_READ_XCPT_INFO) == HMVMX_READ_XCPT_INFO); 13787 } 13788 #endif 13789 13781 HMVMX_ASSERT_READ(pVmxTransient, HMVMX_READ_XCPT_INFO); 13782 13783 VBOXSTRICTRC rcStrict = VINF_SUCCESS; 13790 13784 uint32_t const uExitIntInfo = pVmxTransient->uExitIntInfo; 13791 13785 uint8_t const uExitVector = VMX_EXIT_INT_INFO_VECTOR(pVmxTransient->uExitIntInfo); … … 13961 13955 || pVmxTransient->uExitReason == VMX_EXIT_SPP_EVENT) 13962 13956 { 13963 #ifdef VBOX_STRICT13964 /*13965 * Validate we have read the Exit qualification from the VMCS.13966 */13967 uint32_t const fVmcsFieldRead = ASMAtomicUoReadU32(&pVmxTransient->fVmcsFieldsRead);13968 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE();13969 Assert(fVmcsFieldRead & HMVMX_READ_EXIT_QUALIFICATION);13970 #endif13971 13957 /* 13972 13958 * Execution of IRET caused an EPT violation, page-modification log-full event or … … 13977 13963 * See Intel spec. 27.2.3 "Information about NMI unblocking due to IRET" 13978 13964 */ 13965 HMVMX_ASSERT_READ(pVmxTransient, HMVMX_READ_EXIT_QUALIFICATION); 13979 13966 if (VMX_EXIT_QUAL_EPT_IS_NMI_UNBLOCK_IRET(pVmxTransient->uExitQual)) 13980 13967 { … … 14874 14861 DECL_FORCE_INLINE(VBOXSTRICTRC) hmR0VmxExitXcptAll(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient, uint8_t uVector) 14875 14862 { 14876 /* 14877 * Validate we have read the required fields from the VMCS. 14878 */ 14879 #ifdef VBOX_STRICT 14880 uint32_t const fVmcsFieldRead = ASMAtomicUoReadU32(&pVmxTransient->fVmcsFieldsRead); 14881 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); 14882 Assert((fVmcsFieldRead & HMVMX_READ_XCPT_INFO) == HMVMX_READ_XCPT_INFO); 14883 #endif 14884 14863 HMVMX_ASSERT_READ(pVmxTransient, HMVMX_READ_XCPT_INFO); 14885 14864 switch (uVector) 14886 14865 {
Note:
See TracChangeset
for help on using the changeset viewer.

