Index: /trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp	(revision 79758)
+++ /trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp	(revision 79759)
@@ -71,5 +71,5 @@
 #define HMVMX_FLUSH_TAGGED_TLB_NONE                 3
 
-/** @name HMVMX_READ_XXX
+/**
  * Flags to skip redundant reads of some common VMCS fields that are not part of
  * the guest-CPU or VCPU state but are needed while handling VM-exits.
@@ -83,12 +83,23 @@
 #define HMVMX_READ_EXIT_INSTR_INFO                  RT_BIT_32(6)
 #define HMVMX_READ_GUEST_LINEAR_ADDR                RT_BIT_32(7)
-/** @} */
-
-/** All the VMCS fields required for our processing of exception/NMI VM-exits. */
-#define HMVMX_READ_XCPT_INFO                        (  HMVMX_READ_EXIT_INTERRUPTION_INFO        \
-                                                     | HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE  \
-                                                     | HMVMX_READ_EXIT_INSTR_LEN                \
-                                                     | HMVMX_READ_IDT_VECTORING_INFO            \
-                                                     | HMVMX_READ_IDT_VECTORING_ERROR_CODE)
+
+/** All the VMCS fields required for processing of exception/NMI VM-exits. */
+#define HMVMX_READ_XCPT_INFO         (  HMVMX_READ_EXIT_INTERRUPTION_INFO        \
+                                      | HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE  \
+                                      | HMVMX_READ_EXIT_INSTR_LEN                \
+                                      | HMVMX_READ_IDT_VECTORING_INFO            \
+                                      | HMVMX_READ_IDT_VECTORING_ERROR_CODE)
+
+/** Assert that all the given fields have been read from the VMCS. */
+#ifdef VBOX_STRICT
+# define HMVMX_ASSERT_READ(a_pVmxTransient, a_fReadFields) \
+        do { \
+            uint32_t const fVmcsFieldRead = ASMAtomicUoReadU32(&pVmxTransient->fVmcsFieldsRead); \
+            RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); \
+            Assert((fVmcsFieldRead & (a_fReadFields)) == (a_fReadFields)); \
+        } while (0)
+#else
+# define HMVMX_ASSERT_READ(a_pVmxTransient, a_fReadFields)          do { } while (0)
+#endif
 
 /**
@@ -13630,15 +13641,7 @@
 static int hmR0VmxCheckExitDueToEventDeliveryNested(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
 {
+    Assert(!pVCpu->hm.s.Event.fPending);
     Assert(pVmxTransient->fIsNestedGuest);
-    Assert(!pVCpu->hm.s.Event.fPending);
-
-#ifdef VBOX_STRICT
-    /*
-     * Validate we have read the required fields from the VMCS.
-     */
-    uint32_t const fVmcsFieldRead = ASMAtomicUoReadU32(&pVmxTransient->fVmcsFieldsRead);
-    RT_UNTRUSTED_NONVOLATILE_COPY_FENCE();
-    Assert((fVmcsFieldRead & HMVMX_READ_XCPT_INFO) == HMVMX_READ_XCPT_INFO);
-#endif
+    HMVMX_ASSERT_READ(pVmxTransient, HMVMX_READ_XCPT_INFO);
 
     /*
@@ -13774,18 +13777,9 @@
 #endif
 
+    Assert(!pVCpu->hm.s.Event.fPending);
     Assert(!pVmxTransient->fIsNestedGuest);
-    VBOXSTRICTRC rcStrict = VINF_SUCCESS;
-
-#ifdef VBOX_STRICT
-    /*
-     * Validate we have read the required fields from the VMCS.
-     */
-    {
-        uint32_t const fVmcsFieldRead = ASMAtomicUoReadU32(&pVmxTransient->fVmcsFieldsRead);
-        RT_UNTRUSTED_NONVOLATILE_COPY_FENCE();
-        Assert((fVmcsFieldRead & HMVMX_READ_XCPT_INFO) == HMVMX_READ_XCPT_INFO);
-    }
-#endif
-
+    HMVMX_ASSERT_READ(pVmxTransient, HMVMX_READ_XCPT_INFO);
+
+    VBOXSTRICTRC   rcStrict       = VINF_SUCCESS;
     uint32_t const uExitIntInfo   = pVmxTransient->uExitIntInfo;
     uint8_t const  uExitVector    = VMX_EXIT_INT_INFO_VECTOR(pVmxTransient->uExitIntInfo);
@@ -13961,12 +13955,4 @@
                  || pVmxTransient->uExitReason == VMX_EXIT_SPP_EVENT)
         {
-#ifdef VBOX_STRICT
-            /*
-             * Validate we have read the Exit qualification from the VMCS.
-             */
-            uint32_t const fVmcsFieldRead = ASMAtomicUoReadU32(&pVmxTransient->fVmcsFieldsRead);
-            RT_UNTRUSTED_NONVOLATILE_COPY_FENCE();
-            Assert(fVmcsFieldRead & HMVMX_READ_EXIT_QUALIFICATION);
-#endif
             /*
              * Execution of IRET caused an EPT violation, page-modification log-full event or
@@ -13977,4 +13963,5 @@
              * See Intel spec. 27.2.3 "Information about NMI unblocking due to IRET"
              */
+            HMVMX_ASSERT_READ(pVmxTransient, HMVMX_READ_EXIT_QUALIFICATION);
             if (VMX_EXIT_QUAL_EPT_IS_NMI_UNBLOCK_IRET(pVmxTransient->uExitQual))
             {
@@ -14874,13 +14861,5 @@
 DECL_FORCE_INLINE(VBOXSTRICTRC) hmR0VmxExitXcptAll(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient, uint8_t uVector)
 {
-    /*
-     * Validate we have read the required fields from the VMCS.
-     */
-#ifdef VBOX_STRICT
-    uint32_t const fVmcsFieldRead = ASMAtomicUoReadU32(&pVmxTransient->fVmcsFieldsRead);
-    RT_UNTRUSTED_NONVOLATILE_COPY_FENCE();
-    Assert((fVmcsFieldRead & HMVMX_READ_XCPT_INFO) == HMVMX_READ_XCPT_INFO);
-#endif
-
+    HMVMX_ASSERT_READ(pVmxTransient, HMVMX_READ_XCPT_INFO);
     switch (uVector)
     {
