VirtualBox

Changeset 70413 in vbox


Ignore:
Timestamp:
Jan 2, 2018 7:22:26 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
120018
Message:

VMM/HM: Nested Hw.virt: Implemented virtualized VMSAVE/VMLOAD to avoid intercepting them when supported by the CPU.

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

Legend:

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

    r70412 r70413  
    166166                                                         | SVM_CTRL_INTERCEPT_VMRUN       \
    167167                                                         | SVM_CTRL_INTERCEPT_VMMCALL     \
    168                                                          | SVM_CTRL_INTERCEPT_VMLOAD      \
    169                                                          | SVM_CTRL_INTERCEPT_VMSAVE      \
    170168                                                         | SVM_CTRL_INTERCEPT_STGI        \
    171169                                                         | SVM_CTRL_INTERCEPT_CLGI        \
     
    817815    bool const fUseLbrVirt           = fLbrVirt; /** @todo CFGM etc. */
    818816
     817    bool const fVirtVmsaveVmload     = RT_BOOL(pVM->hm.s.svm.u32Features & X86_CPUID_SVM_FEATURE_EDX_VIRT_VMSAVE_VMLOAD);
     818    bool const fUseVirtVmsaveVmload  = fVirtVmsaveVmload && pVM->hm.s.svm.fVirtVmsaveVmload && pVM->hm.s.fNestedPaging;
     819
    819820    for (VMCPUID i = 0; i < pVM->cCpus; i++)
    820821    {
     
    885886        else
    886887            Assert(pVmcb->ctrl.LbrVirt.n.u1LbrVirt == 0);
     888
     889        /* Virtualized VMSAVE/VMLOAD. */
     890        pVmcb->ctrl.LbrVirt.n.u1VirtVmsaveVmload = fUseVirtVmsaveVmload;
     891        if (!fUseVirtVmsaveVmload)
     892        {
     893            pVmcb->ctrl.u64InterceptCtrl |= SVM_CTRL_INTERCEPT_VMSAVE
     894                                         |  SVM_CTRL_INTERCEPT_VMLOAD;
     895        }
    887896
    888897        /* Initially all VMCB clean bits MBZ indicating that everything should be loaded from the VMCB in memory. */
     
    19061915        pVmcbNstGst->ctrl.u64InterceptCtrl  |= pVmcb->ctrl.u64InterceptCtrl
    19071916                                            |  HMSVM_MANDATORY_GUEST_CTRL_INTERCEPTS;
    1908 
    19091917        /*
    19101918         * Remove control intercepts that we don't need while executing the nested-guest.
     
    19131921         * other SVM instructions like VMSAVE when not intercept can cause havoc on the
    19141922         * host as they can write to any location in physical memory, hence they always
    1915          * need to be intercepted (they are included in HMSVM_MANDATORY_GUEST_CTRL_INTERCEPTS).
     1923         * need to be intercepted (see below).
    19161924         */
    19171925        Assert(   (pVmcbNstGst->ctrl.u64InterceptCtrl & HMSVM_MANDATORY_GUEST_CTRL_INTERCEPTS)
    19181926               == HMSVM_MANDATORY_GUEST_CTRL_INTERCEPTS);
    19191927        pVmcbNstGst->ctrl.u64InterceptCtrl  &= ~SVM_CTRL_INTERCEPT_VMMCALL;
     1928
     1929        /*
     1930         * If we don't expose Virtualized-VMSAVE/VMLOAD feature to the outer guest, we
     1931         * need to intercept VMSAVE/VMLOAD instructions executed by the nested-guest.
     1932         */
     1933        if (!pVCpu->CTX_SUFF(pVM)->cpum.ro.GuestFeatures.fSvmVirtVmsaveVmload)
     1934        {
     1935            pVmcbNstGst->ctrl.u64InterceptCtrl |= SVM_CTRL_INTERCEPT_VMSAVE
     1936                                               |  SVM_CTRL_INTERCEPT_VMLOAD;
     1937        }
    19201938
    19211939        /* Finally, update the VMCB clean bits. */
     
    75637581    HMSVM_VALIDATE_EXIT_HANDLER_PARAMS();
    75647582
     7583#ifdef VBOX_STRICT
     7584    PCSVMVMCB pVmcb = hmR0SvmGetCurrentVmcb(pVCpu, pCtx);
     7585    Assert(pVmcb);
     7586    Assert(!pVmcb->ctrl.LbrVirt.n.u1VirtVmsaveVmload);
     7587    RT_NOREF(pVmcb);
     7588#endif
     7589
    75657590    /** @todo Stat. */
    75667591    /* STAM_COUNTER_INC(&pVCpu->hm.s.StatExitVmload); */
     
    75847609{
    75857610    HMSVM_VALIDATE_EXIT_HANDLER_PARAMS();
     7611
     7612#ifdef VBOX_STRICT
     7613    PCSVMVMCB pVmcb = hmR0SvmGetCurrentVmcb(pVCpu, pCtx);
     7614    Assert(pVmcb);
     7615    Assert(!pVmcb->ctrl.LbrVirt.n.u1VirtVmsaveVmload);
     7616    RT_NOREF(pVmcb);
     7617#endif
    75867618
    75877619    /** @todo Stat. */
  • trunk/src/VBox/VMM/VMMR3/HM.cpp

    r70299 r70413  
    460460                              "|Exclusive"
    461461                              "|MaxResumeLoops"
    462                               "|UseVmxPreemptTimer",
     462                              "|UseVmxPreemptTimer"
     463                              "|SvmVirtVmsaveVmload",
    463464                              "" /* pszValidNodes */, "HM" /* pszWho */, 0 /* uInstance */);
    464465    if (RT_FAILURE(rc))
     
    559560     */
    560561    rc = CFGMR3QueryU16Def(pCfgHm, "SvmPauseFilterThreshold", &pVM->hm.s.svm.cPauseFilterThresholdTicks, 0);
     562    AssertRCReturn(rc, rc);
     563
     564    /** @cfgm{/HM/SvmVirtVmsaveVmload, bool, true}
     565     * Whether to make use of virtualized VMSAVE/VMLOAD feature of the CPU if it's
     566     * available. */
     567    rc = CFGMR3QueryBoolDef(pCfgHm, "SvmVirtVmsaveVmload", &pVM->hm.s.svm.fVirtVmsaveVmload, true);
    561568    AssertRCReturn(rc, rc);
    562569
  • trunk/src/VBox/VMM/include/HMInternal.h

    r69474 r70413  
    522522        /** Set when the hack to ignore VERR_SVM_IN_USE is active. */
    523523        bool                        fIgnoreInUseError;
    524         uint8_t                     u8Alignment0[4];
     524        /** Whether to use virutalized VMSAVE/VMLOAD feature. */
     525        bool                        fVirtVmsaveVmload;
     526        uint8_t                     u8Alignment0[3];
    525527
    526528        /** Physical address of the IO bitmap (12kb). */
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