VirtualBox

Changeset 78877 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
May 30, 2019 11:55:15 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
130990
Message:

VMM: Nested VMX: bugref:9180 APIC-access VM-exit handling.

Location:
trunk/src/VBox/VMM
Files:
4 edited

Legend:

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

    r78838 r78877  
    1592915929 * @param   pVCpu           The cross context virtual CPU structure of the calling EMT.
    1593015930 * @param   uExitReason     The VM-exit reason.
     15931 * @param   uExitQual       The VM-exit qualification.
    1593115932 * @thread  EMT(pVCpu)
    15932  *
    15933  * @remarks It is the responsibility of the caller to ensure VM-exit qualification
    15934  *          is updated prior to calling this function!
    15935  */
    15936 VMM_INT_DECL(VBOXSTRICTRC) IEMExecVmxVmexit(PVMCPU pVCpu, uint32_t uExitReason)
    15937 {
     15933 */
     15934VMM_INT_DECL(VBOXSTRICTRC) IEMExecVmxVmexit(PVMCPU pVCpu, uint32_t uExitReason, uint64_t uExitQual)
     15935{
     15936    iemVmxVmcsSetExitQual(pVCpu, uExitQual);
    1593815937    VBOXSTRICTRC rcStrict = iemVmxVmexit(pVCpu, uExitReason);
    1593915938    if (pVCpu->iem.s.cActiveMappings)
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r78874 r78877  
    446446static FNVMXEXITHANDLER            hmR0VmxExitPauseNested;
    447447//static FNVMXEXITHANDLERNSRC        hmR0VmxExitTprBelowThreshold;
    448 //static FNVMXEXITHANDLER            hmR0VmxExitApicAccess;
     448static FNVMXEXITHANDLER            hmR0VmxExitApicAccessNested;
    449449static FNVMXEXITHANDLER            hmR0VmxExitXdtrAccessNested;
    450450//static FNVMXEXITHANDLER            hmR0VmxExitEptViolation;
     
    1579815798
    1579915799    if (CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INT_WINDOW_EXIT))
    15800         return IEMExecVmxVmexit(pVCpu, pVmxTransient->uExitReason);
     15800        return IEMExecVmxVmexit(pVCpu, pVmxTransient->uExitReason, 0 /* uExitQual */);
    1580115801    return hmR0VmxExitIntWindow(pVCpu, pVmxTransient);
    1580215802}
     
    1581115811
    1581215812    if (CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_NMI_WINDOW_EXIT))
    15813         return IEMExecVmxVmexit(pVCpu, pVmxTransient->uExitReason);
     15813        return IEMExecVmxVmexit(pVCpu, pVmxTransient->uExitReason, 0 /* uExitQual */);
    1581415814    return hmR0VmxExitIntWindow(pVCpu, pVmxTransient);
    1581515815}
     
    1626016260
    1626116261    /** @todo NSTVMX: Should consider debugging nested-guests using VM debugger. */
    16262     return IEMExecVmxVmexit(pVCpu, pVmxTransient->uExitReason);
     16262    return IEMExecVmxVmexit(pVCpu, pVmxTransient->uExitReason, 0 /* uExitQual */);
    1626316263}
    1626416264
     
    1630116301    }
    1630216302    return hmR0VmxExitPause(pVCpu, pVmxTransient);
     16303}
     16304
     16305
     16306/**
     16307 * Nested-guest VM-exit handler for APIC access (VMX_EXIT_APIC_ACCESS). Conditional
     16308 * VM-exit.
     16309 */
     16310HMVMX_EXIT_DECL hmR0VmxExitApicAccessNested(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
     16311{
     16312    HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
     16313
     16314    /*
     16315     * All VMCS controls that cause APIC-access VM-exits (Virtualize APIC access,
     16316     * virtual-interrupt delivery, APIC-register virtualization) are all taken
     16317     * directly from the guest-hypervisor. So there should be no need to re-verify
     16318     * them here.
     16319     *
     16320     * Only the VM-exit qualification is relevant here.
     16321     */
     16322    int rc = hmR0VmxReadExitQualVmcs(pVCpu, pVmxTransient);
     16323    AssertRCReturn(rc, rc);
     16324    return IEMExecVmxVmexit(pVCpu, pVmxTransient->uExitReason, pVmxTransient->uExitQual);
    1630316325}
    1630416326
  • trunk/src/VBox/VMM/VMMR3/EM.cpp

    r78237 r78877  
    17291729        && CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INT_WINDOW_EXIT))
    17301730    {
    1731         VBOXSTRICTRC rcStrict = IEMExecVmxVmexit(pVCpu, VMX_EXIT_INT_WINDOW);
     1731        VBOXSTRICTRC rcStrict = IEMExecVmxVmexit(pVCpu, VMX_EXIT_INT_WINDOW, 0 /* uExitQual */);
    17321732        if (RT_SUCCESS(rcStrict))
    17331733        {
     
    21572157        if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_VMX_MTF))
    21582158        {
    2159             rc2 = VBOXSTRICTRC_VAL(IEMExecVmxVmexit(pVCpu, VMX_EXIT_MTF));
     2159            rc2 = VBOXSTRICTRC_VAL(IEMExecVmxVmexit(pVCpu, VMX_EXIT_MTF, 0 /* uExitQual */));
    21602160            Assert(rc2 != VINF_VMX_INTERCEPT_NOT_ACTIVE);
    21612161            UPDATE_RC();
     
    21792179        if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_VMX_NMI_WINDOW))
    21802180        {
    2181             rc2 = VBOXSTRICTRC_VAL(IEMExecVmxVmexit(pVCpu, VMX_EXIT_NMI_WINDOW));
     2181            rc2 = VBOXSTRICTRC_VAL(IEMExecVmxVmexit(pVCpu, VMX_EXIT_NMI_WINDOW, 0 /* uExitQual */));
    21822182            Assert(rc2 != VINF_VMX_INTERCEPT_NOT_ACTIVE);
    21832183            UPDATE_RC();
  • trunk/src/VBox/VMM/VMMR3/VMM.cpp

    r78237 r78877  
    16471647    PCCPUMCTX pCtx = CPUMQueryGuestCtxPtr(pVCpu);
    16481648    if (CPUMIsGuestInVmxNonRootMode(pCtx))
    1649         return VBOXSTRICTRC_TODO(IEMExecVmxVmexit(pVCpu, VMX_EXIT_INIT_SIGNAL));
     1649        return VBOXSTRICTRC_TODO(IEMExecVmxVmexit(pVCpu, VMX_EXIT_INIT_SIGNAL, 0 /* uExitQual */));
    16501650#endif
    16511651
Note: See TracChangeset for help on using the changeset viewer.

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