VirtualBox

Changeset 74900 in vbox for trunk


Ignore:
Timestamp:
Oct 18, 2018 6:02:15 AM (6 years ago)
Author:
vboxsync
Message:

VMM/IEM: Nested VMX: bugref:9180 Handle premature interrupt-window exit as part of VM-entry.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h

    r74861 r74900  
    26422642            }
    26432643            else
    2644                 IEM_VMX_VMENTRY_FAILED_RET(pVCpu, uExitReason, pszFailure, kVmxVDiag_Vmexit_MsrLoadRsvd);
     2644                IEM_VMX_VMEXIT_FAILED_RET(pVCpu, uExitReason, pszFailure, kVmxVDiag_Vmexit_MsrLoadRsvd);
    26452645        }
    26462646    }
     
    27912791    pVCpu->cpum.GstCtx.hwvirt.vmx.fInVmxNonRootMode = false;
    27922792
    2793     return rcStrict;
     2793    Assert(rcStrict == VINF_SUCCESS);
     2794    return VINF_VMX_VMEXIT;
    27942795}
    27952796
     
    49294930
    49304931/**
     4932 * Checks if an interrupt-window exiting occurs immediately as part of VM-entry.
     4933 *
     4934 * @returns VBox status code.
     4935 * @param   pVCpu           The cross context virtual CPU structure.
     4936 * @param   pszInstr        The VMX instruction name (for logging purposes).
     4937 *
     4938 * @remarks This must be called after loading the guest-state and switching
     4939 *          page-tables as part of VM-entry!
     4940 */
     4941IEM_STATIC int iemVmxVmentryCheckIntWindowExit(PVMCPU pVCpu, const char *pszInstr)
     4942{
     4943    /*
     4944     * An interrupt-window exit occurs immediately after VM-entry if interrupts
     4945     * are enabled and the interrupt-window exit control is set.
     4946     *
     4947     * See Intel spec. 25.2 "Other Causes Of VM Exits".
     4948     */
     4949    PCVMXVVMCS pVmcs = pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pVmcs);
     4950    Assert(pVmcs);
     4951
     4952    if (   (pVmcs->u32ProcCtls & VMX_PROC_CTLS_INT_WINDOW_EXIT)
     4953        &&  pVCpu->cpum.GstCtx.eflags.Bits.u1IF
     4954        && !VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS))
     4955    {
     4956        Log(("%s: Interrupt-window detected during VM-entry -> VM-exit\n", pszInstr));
     4957        return iemVmxVmexitIntWindow(pVCpu);
     4958    }
     4959
     4960    return VINF_VMX_INTERCEPT_NOT_ACTIVE;
     4961}
     4962
     4963
     4964/**
    49314965 * Checks host-state as part of VM-entry.
    49324966 *
     
    60566090                                pVCpu->cpum.GstCtx.hwvirt.vmx.fInVmxNonRootMode = true;
    60576091
     6092                                /* Check premature interrupt-window exiting. */
     6093                                rc = iemVmxVmentryCheckIntWindowExit(pVCpu, pszInstr);
     6094                                if (rc == VINF_VMX_INTERCEPT_NOT_ACTIVE)
     6095                                { /* likely */ }
     6096                                else if (rc == VINF_VMX_VMEXIT)
     6097                                    return VINF_SUCCESS;
     6098
    60586099                                /* Now that we've switched page tables, we can inject events if any. */
    60596100                                iemVmxVmentryInjectEvent(pVCpu, pszInstr);
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