VirtualBox

Changeset 80056 in vbox


Ignore:
Timestamp:
Jul 30, 2019 6:17:13 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
132493
Message:

VMM/HMVMXR0: Nested VMX: bugref:9180 Add VMX force-flags to VMCPU_FF_HP_R0_PRE_HM_MASK and process it in hmR0VmxCheckForceFlags.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/vm.h

    r80024 r80056  
    626626/** High priority ring-0 VMCPU pre HM-mode execution mask. */
    627627#define VMCPU_FF_HP_R0_PRE_HM_MASK              (  VMCPU_FF_HM_TO_R3_MASK | VMCPU_FF_PGM_SYNC_CR3 \
    628                                                  | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL | VMCPU_FF_REQUEST)
     628                                                 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL | VMCPU_FF_REQUEST \
     629                                                 | VMCPU_FF_VMX_APIC_WRITE | VMCPU_FF_VMX_MTF | VMCPU_FF_VMX_PREEMPT_TIMER)
    629630/** High priority ring-0 VM pre HM-mode execution mask, single stepping. */
    630631#define VM_FF_HP_R0_PRE_HM_STEP_MASK            (VM_FF_HP_R0_PRE_HM_MASK & ~(  VM_FF_TM_VIRTUAL_SYNC | VM_FF_PDM_QUEUES  \
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r80052 r80056  
    81838183 * @param   fStepping   Whether we are single-stepping the guest using the
    81848184 *                      hypervisor debugger.
     8185 *
     8186 * @remarks This might cause nested-guest VM-exits, caller must check if the guest
     8187 *          is no longer in VMX non-root mode.
    81858188 */
    81868189static VBOXSTRICTRC hmR0VmxCheckForceFlags(PVMCPU pVCpu, bool fStepping)
     
    82108213        PCPUMCTX pCtx = &pVCpu->cpum.GstCtx;
    82118214        Assert(!(ASMAtomicUoReadU64(&pCtx->fExtrn) & (CPUMCTX_EXTRN_CR0 | CPUMCTX_EXTRN_CR3 | CPUMCTX_EXTRN_CR4)));
    8212         VBOXSTRICTRC rcStrict2 = PGMSyncCR3(pVCpu, pCtx->cr0, pCtx->cr3, pCtx->cr4,
    8213                                             VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3));
    8214         if (rcStrict2 != VINF_SUCCESS)
    8215         {
    8216             AssertRC(VBOXSTRICTRC_VAL(rcStrict2));
    8217             Log4Func(("PGMSyncCR3 forcing us back to ring-3. rc2=%d\n", VBOXSTRICTRC_VAL(rcStrict2)));
    8218             return rcStrict2;
     8215        VBOXSTRICTRC rcStrict = PGMSyncCR3(pVCpu, pCtx->cr0, pCtx->cr3, pCtx->cr4,
     8216                                           VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3));
     8217        if (rcStrict != VINF_SUCCESS)
     8218        {
     8219            AssertRC(VBOXSTRICTRC_VAL(rcStrict));
     8220            Log4Func(("PGMSyncCR3 forcing us back to ring-3. rc2=%d\n", VBOXSTRICTRC_VAL(rcStrict)));
     8221            return rcStrict;
    82198222        }
    82208223    }
     
    82258228    {
    82268229        STAM_COUNTER_INC(&pVCpu->hm.s.StatSwitchHmToR3FF);
    8227         int rc2 = RT_LIKELY(!VM_FF_IS_SET(pVM, VM_FF_PGM_NO_MEMORY)) ? VINF_EM_RAW_TO_R3 : VINF_EM_NO_MEMORY;
    8228         Log4Func(("HM_TO_R3 forcing us back to ring-3. rc=%d\n", rc2));
    8229         return rc2;
     8230        int rc = RT_LIKELY(!VM_FF_IS_SET(pVM, VM_FF_PGM_NO_MEMORY)) ? VINF_EM_RAW_TO_R3 : VINF_EM_NO_MEMORY;
     8231        Log4Func(("HM_TO_R3 forcing us back to ring-3. rc=%d\n", rc));
     8232        return rc;
    82308233    }
    82318234
     
    82548257        return VINF_EM_RAW_TO_R3;
    82558258    }
     8259
     8260    /* Pending nested-guest APIC-write (has highest priority among nested-guest FFs). */
     8261    if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_VMX_APIC_WRITE))
     8262    {
     8263        Log4Func(("Pending nested-guest APIC-write\n"));
     8264        VBOXSTRICTRC rcStrict = IEMExecVmxVmexitApicWrite(pVCpu);
     8265        Assert(rcStrict != VINF_VMX_INTERCEPT_NOT_ACTIVE);
     8266        return rcStrict;
     8267    }
     8268    /** @todo VMCPU_FF_VMX_MTF, VMCPU_FF_VMX_PREEMPT_TIMER */
    82568269
    82578270    return VINF_SUCCESS;
     
    1080010813    VBOXSTRICTRC rcStrict = hmR0VmxCheckForceFlags(pVCpu, fStepping);
    1080110814    if (rcStrict == VINF_SUCCESS)
    10802     { /* FFs don't get set all the time. */ }
     10815    {
     10816        /* FFs don't get set all the time. */
     10817#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
     10818        if (   pVmxTransient->fIsNestedGuest
     10819            && !CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.GstCtx))
     10820        {
     10821            STAM_COUNTER_INC(&pVCpu->hm.s.StatSwitchNstGstVmexit);
     10822            return VINF_VMX_VMEXIT;
     10823        }
     10824#endif
     10825    }
    1080310826    else
    1080410827        return rcStrict;
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