VirtualBox

Changeset 79759 in vbox


Ignore:
Timestamp:
Jul 13, 2019 4:46:21 PM (5 years ago)
Author:
vboxsync
Message:

VMM/HMVMXR0: Nested VMX: bugref:9180 Better build fix for r132123.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r79758 r79759  
    7171#define HMVMX_FLUSH_TAGGED_TLB_NONE                 3
    7272
    73 /** @name HMVMX_READ_XXX
     73/**
    7474 * Flags to skip redundant reads of some common VMCS fields that are not part of
    7575 * the guest-CPU or VCPU state but are needed while handling VM-exits.
     
    8383#define HMVMX_READ_EXIT_INSTR_INFO                  RT_BIT_32(6)
    8484#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
    93104
    94105/**
     
    1363013641static int hmR0VmxCheckExitDueToEventDeliveryNested(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
    1363113642{
     13643    Assert(!pVCpu->hm.s.Event.fPending);
    1363213644    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);
    1364313646
    1364413647    /*
     
    1377413777#endif
    1377513778
     13779    Assert(!pVCpu->hm.s.Event.fPending);
    1377613780    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;
    1379013784    uint32_t const uExitIntInfo   = pVmxTransient->uExitIntInfo;
    1379113785    uint8_t const  uExitVector    = VMX_EXIT_INT_INFO_VECTOR(pVmxTransient->uExitIntInfo);
     
    1396113955                 || pVmxTransient->uExitReason == VMX_EXIT_SPP_EVENT)
    1396213956        {
    13963 #ifdef VBOX_STRICT
    13964             /*
    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 #endif
    1397113957            /*
    1397213958             * Execution of IRET caused an EPT violation, page-modification log-full event or
     
    1397713963             * See Intel spec. 27.2.3 "Information about NMI unblocking due to IRET"
    1397813964             */
     13965            HMVMX_ASSERT_READ(pVmxTransient, HMVMX_READ_EXIT_QUALIFICATION);
    1397913966            if (VMX_EXIT_QUAL_EPT_IS_NMI_UNBLOCK_IRET(pVmxTransient->uExitQual))
    1398013967            {
     
    1487414861DECL_FORCE_INLINE(VBOXSTRICTRC) hmR0VmxExitXcptAll(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient, uint8_t uVector)
    1487514862{
    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);
    1488514864    switch (uVector)
    1488614865    {
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette