VirtualBox

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


Ignore:
Timestamp:
Jul 3, 2018 7:02:16 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
123351
Message:

VMM/HMVMXR0: Fix pending CR3 and PAE PDPEs force-flag being set too late due to longjumps.

File:
1 edited

Legend:

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

    r72805 r72808  
    64926492    Assert(VMMRZCallRing3IsEnabled(pVCpu));
    64936493
    6494     /* Pending HM CR3 sync. */
    6495     if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HM_UPDATE_CR3))
    6496     {
    6497         Assert(!(ASMAtomicUoReadU64(&pMixedCtx->fExtrn) & CPUMCTX_EXTRN_CR3));
    6498         int rc2 = PGMUpdateCR3(pVCpu, CPUMGetGuestCR3(pVCpu));
    6499         AssertMsgReturn(rc2 == VINF_SUCCESS || rc2 == VINF_PGM_SYNC_CR3,
    6500                         ("%Rrc\n", rc2), RT_FAILURE_NP(rc2) ? rc2 : VERR_IPE_UNEXPECTED_INFO_STATUS);
    6501         Assert(!VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HM_UPDATE_CR3));
    6502     }
    6503 
    6504     /* Pending HM PAE PDPEs. */
    6505     if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES))
    6506     {
    6507         PGMGstUpdatePaePdpes(pVCpu, &pVCpu->hm.s.aPdpes[0]);
    6508         Assert(!VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES));
    6509     }
    6510 
    65116494    /*
    65126495     * Anything pending?  Should be more likely than not if we're doing a good job.
     
    82748257
    82758258    /*
     8259     * A longjump might result in importing CR3 even for VM-exits that don't necessarily
     8260     * import CR3 themselves. We will need to update them here as even as late as the above
     8261     * hmR0VmxInjectPendingEvent() call may lazily import guest-CPU state on demand causing
     8262     * the below force flags to be set.
     8263     */
     8264    if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HM_UPDATE_CR3))
     8265    {
     8266        Assert(!(ASMAtomicUoReadU64(&pMixedCtx->fExtrn) & CPUMCTX_EXTRN_CR3));
     8267        int rc2 = PGMUpdateCR3(pVCpu, CPUMGetGuestCR3(pVCpu));
     8268        AssertMsgReturn(rc2 == VINF_SUCCESS || rc2 == VINF_PGM_SYNC_CR3,
     8269                        ("%Rrc\n", rc2), RT_FAILURE_NP(rc2) ? rc2 : VERR_IPE_UNEXPECTED_INFO_STATUS);
     8270        Assert(!VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HM_UPDATE_CR3));
     8271    }
     8272    if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES))
     8273    {
     8274        PGMGstUpdatePaePdpes(pVCpu, &pVCpu->hm.s.aPdpes[0]);
     8275        Assert(!VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES));
     8276    }
     8277
     8278    /*
    82768279     * No longjmps to ring-3 from this point on!!!
    82778280     * Asserts() will still longjmp to ring-3 (but won't return), which is intentional, better than a kernel panic.
     
    85808583        {
    85818584            VMMRZCallRing3Enable(pVCpu);
     8585
     8586            Assert(!VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HM_UPDATE_CR3));
     8587            Assert(!VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES));
    85828588
    85838589#if defined(HMVMX_ALWAYS_SYNC_FULL_GUEST_STATE) || defined(HMVMX_ALWAYS_SAVE_FULL_GUEST_STATE)
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