VirtualBox

Changeset 67157 in vbox


Ignore:
Timestamp:
May 31, 2017 9:11:17 AM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
115833
Message:

VMM/CPUM: Nested Hw.virt: fixes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r66405 r67157  
    756756static void cpumR3FreeHwVirtState(PVM pVM)
    757757{
    758     if (pVM->cpum.ro.GuestFeatures.fSvm)
    759     {
    760         for (VMCPUID i = 0; i < pVM->cCpus; i++)
     758    Assert(pVM->cpum.ro.GuestFeatures.fSvm);
     759    for (VMCPUID i = 0; i < pVM->cCpus; i++)
     760    {
     761        PVMCPU pVCpu = &pVM->aCpus[i];
     762        if (pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3)
    761763        {
    762             PVMCPU pVCpu = &pVM->aCpus[i];
    763             if (pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3)
    764             {
    765                 SUPR3PageFreeEx(pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3, SVM_MSRPM_PAGES);
    766                 pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3 = NULL;
    767             }
    768 
    769             if (pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3)
    770             {
    771                 SUPR3PageFreeEx(pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3, SVM_IOPM_PAGES);
    772                 pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3 = NULL;
    773             }
     764            SUPR3PageFreeEx(pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3, SVM_MSRPM_PAGES);
     765            pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3 = NULL;
     766        }
     767
     768        if (pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3)
     769        {
     770            SUPR3PageFreeEx(pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3, SVM_IOPM_PAGES);
     771            pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3 = NULL;
    774772        }
    775773    }
     
    785783static int cpumR3AllocHwVirtState(PVM pVM)
    786784{
     785    Assert(pVM->cpum.ro.GuestFeatures.fSvm);
     786
    787787    int rc = VINF_SUCCESS;
    788     if (pVM->cpum.ro.GuestFeatures.fSvm)
    789     {
    790         for (VMCPUID i = 0; i < pVM->cCpus; i++)
     788    LogRel(("CPUM: Allocating a total of %u pages for the nested-guest SVM MSR and IO permission bitmaps\n",
     789            pVM->cCpus * (SVM_MSRPM_PAGES + SVM_IOPM_PAGES)));
     790    for (VMCPUID i = 0; i < pVM->cCpus; i++)
     791    {
     792        PVMCPU pVCpu = &pVM->aCpus[i];
     793
     794        /*
     795         * Allocate the MSRPM (MSR Permission bitmap).
     796         */
     797        Assert(!pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3);
     798        rc = SUPR3PageAllocEx(SVM_MSRPM_PAGES, 0 /* fFlags */, &pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3,
     799                              &pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR0, NULL /* paPages */);
     800        if (RT_FAILURE(rc))
    791801        {
    792             PVMCPU pVCpu = &pVM->aCpus[i];
    793 
    794             /*
    795              * Allocate the MSRPM (MSR Permission bitmap).
    796              */
    797802            Assert(!pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3);
    798             rc = SUPR3PageAllocEx(SVM_MSRPM_PAGES, 0 /* fFlags */, &pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3,
    799                                   &pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR0, NULL /* paPages */);
    800             if (RT_FAILURE(rc))
    801             {
    802                 Assert(!pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3);
    803                 LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's MSR permission bitmap\n", pVCpu->idCpu,
    804                         SVM_MSRPM_PAGES));
    805                 break;
    806             }
    807 
    808             /*
    809              * Allocate the IOPM (IO Permission bitmap).
    810              */
     803            LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's MSR permission bitmap\n", pVCpu->idCpu,
     804                    SVM_MSRPM_PAGES));
     805            break;
     806        }
     807
     808        /*
     809         * Allocate the IOPM (IO Permission bitmap).
     810         */
     811        Assert(!pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3);
     812        rc = SUPR3PageAllocEx(SVM_IOPM_PAGES, 0 /* fFlags */, &pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3,
     813                              &pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR0, NULL /* paPages */);
     814        if (RT_FAILURE(rc))
     815        {
    811816            Assert(!pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3);
    812             rc = SUPR3PageAllocEx(SVM_IOPM_PAGES, 0 /* fFlags */, &pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3,
    813                                   &pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR0, NULL /* paPages */);
    814             if (RT_FAILURE(rc))
    815             {
    816                 Assert(!pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3);
    817                 LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's IO permission bitmap\n", pVCpu->idCpu,
    818                         SVM_IOPM_PAGES));
    819                 break;
    820             }
     817            LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's IO permission bitmap\n", pVCpu->idCpu,
     818                    SVM_IOPM_PAGES));
     819            break;
    821820        }
    822 
    823         /* On any failure, cleanup. */
    824         if (RT_FAILURE(rc))
    825             cpumR3FreeHwVirtState(pVM);
    826     }
     821    }
     822
     823    /* On any failure, cleanup. */
     824    if (RT_FAILURE(rc))
     825        cpumR3FreeHwVirtState(pVM);
    827826
    828827    return rc;
     
    966965
    967966    /*
    968      * Allocate memory required by the hardware virtualization state.
    969      */
    970     rc = cpumR3AllocHwVirtState(pVM);
    971     if (RT_FAILURE(rc))
    972         return rc;
    973 
    974     /*
    975967     * Register saved state data item.
    976968     */
     
    10121004    if (RT_FAILURE(rc))
    10131005        return rc;
     1006
     1007    /*
     1008     * Allocate memory required by the guest hardware virtualization state.
     1009     */
     1010    if (pVM->cpum.ro.GuestFeatures.fSvm)
     1011    {
     1012        rc = cpumR3AllocHwVirtState(pVM);
     1013        if (RT_FAILURE(rc))
     1014            return rc;
     1015    }
     1016
    10141017    CPUMR3Reset(pVM);
    10151018    return VINF_SUCCESS;
     
    10931096#endif
    10941097
    1095     cpumR3FreeHwVirtState(pVM);
     1098    if (pVM->cpum.ro.GuestFeatures.fSvm)
     1099        cpumR3FreeHwVirtState(pVM);
    10961100    return VINF_SUCCESS;
    10971101}
     
    12411245     * Hardware virtualization state.
    12421246     */
    1243     memset(&pCtx->hwvirt, 0, sizeof(pCtx->hwvirt));
    12441247    /* SVM. */
     1248    RT_ZERO(pCtx->hwvirt.svm.VmcbCtrl);
    12451249    pCtx->hwvirt.svm.fGif = 1;
    12461250}
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