VirtualBox

Changeset 91306 in vbox for trunk/src/VBox/VMM/VMMR3


Ignore:
Timestamp:
Sep 17, 2021 9:11:01 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
146966
Message:

VMM/CPUM,++: Moved the nested VT-X virtual apic page allocation into CPUMCTX. bugref:10093

File:
1 edited

Legend:

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

    r91305 r91306  
    10191019    Assert(pVM->cpum.s.GuestFeatures.fSvm);
    10201020
    1021     LogRel(("CPUM: Allocating %u pages for the nested-guest SVM MSR and IO permission bitmaps\n",
    1022             pVM->cCpus * (SVM_MSRPM_PAGES + SVM_IOPM_PAGES)));
     1021    LogRel(("CPUM: AMD-V nested-guest init\n"));
    10231022    for (VMCPUID i = 0; i < pVM->cCpus; i++)
    10241023    {
     
    10501049
    10511050/**
    1052  * Frees memory allocated for the VMX hardware virtualization state.
     1051 * Allocates memory for the VMX hardware virtualization state.
    10531052 *
    10541053 * @param   pVM     The cross context VM structure.
    10551054 */
    1056 static void cpumR3FreeVmxHwVirtState(PVM pVM)
    1057 {
    1058     Assert(pVM->cpum.s.GuestFeatures.fVmx);
     1055static void cpumR3InitVmxHwVirtState(PVM pVM)
     1056{
     1057    LogRel(("CPUM: VT-x nested-guest init\n"));
    10591058    for (VMCPUID i = 0; i < pVM->cCpus; i++)
    10601059    {
     
    10621061        PCPUMCTX pCtx  = &pVCpu->cpum.s.Guest;
    10631062
    1064         if (pCtx->hwvirt.vmx.pvVirtApicPageR3)
    1065         {
    1066             SUPR3ContFree(pCtx->hwvirt.vmx.pvVirtApicPageR3, VMX_V_VIRT_APIC_PAGES);
    1067             pCtx->hwvirt.vmx.pvVirtApicPageR3 = NULL;
    1068         }
    1069     }
    1070 }
    1071 
    1072 
    1073 /**
    1074  * Allocates memory for the VMX hardware virtualization state.
    1075  *
    1076  * @returns VBox status code.
    1077  * @param   pVM     The cross context VM structure.
    1078  */
    1079 static int cpumR3AllocVmxHwVirtState(PVM pVM)
    1080 {
    1081     int rc = VINF_SUCCESS;
    1082     uint32_t const cPages = VMX_V_VMCS_PAGES
    1083                           + VMX_V_SHADOW_VMCS_PAGES
    1084                           + VMX_V_VIRT_APIC_PAGES
    1085                           + (2 * VMX_V_VMREAD_VMWRITE_BITMAP_PAGES)
    1086                           + (3 * VMX_V_AUTOMSR_AREA_PAGES)
    1087                           + VMX_V_MSR_BITMAP_PAGES
    1088                           + (VMX_V_IO_BITMAP_A_PAGES + VMX_V_IO_BITMAP_B_PAGES);
    1089     LogRel(("CPUM: Allocating %u pages for the nested-guest VMCS and related structures\n", pVM->cCpus * cPages));
    1090     for (VMCPUID i = 0; i < pVM->cCpus; i++)
    1091     {
    1092         PVMCPU   pVCpu = pVM->apCpusR3[i];
    1093         PCPUMCTX pCtx  = &pVCpu->cpum.s.Guest;
    10941063        pCtx->hwvirt.enmHwvirt = CPUMHWVIRT_VMX;
    10951064
     
    11121081        AssertCompile(sizeof(pCtx->hwvirt.vmx.abIoBitmap) == (VMX_V_IO_BITMAP_A_PAGES + VMX_V_IO_BITMAP_B_PAGES) * X86_PAGE_SIZE);
    11131082        AssertCompile(sizeof(pCtx->hwvirt.vmx.abIoBitmap) == VMX_V_IO_BITMAP_A_SIZE + VMX_V_IO_BITMAP_B_SIZE);
    1114 
    1115         /*
    1116          * Allocate the virtual-APIC page.
    1117          */
    1118         pCtx->hwvirt.vmx.pvVirtApicPageR3 = SUPR3ContAlloc(VMX_V_VIRT_APIC_PAGES,
    1119                                                            &pCtx->hwvirt.vmx.pvVirtApicPageR0,
    1120                                                            &pCtx->hwvirt.vmx.HCPhysVirtApicPage);
    1121         if (pCtx->hwvirt.vmx.pvVirtApicPageR3)
    1122         { /* likely */ }
    1123         else
    1124         {
    1125             LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's virtual-APIC page\n", pVCpu->idCpu,
    1126                     VMX_V_VIRT_APIC_PAGES));
    1127             break;
    1128         }
     1083        AssertCompile(sizeof(pCtx->hwvirt.vmx.abVirtApicPage) == VMX_V_VIRT_APIC_PAGES * X86_PAGE_SIZE);
     1084        AssertCompile(sizeof(pCtx->hwvirt.vmx.abVirtApicPage) == VMX_V_VIRT_APIC_SIZE);
    11291085
    11301086        /*
     
    11411097        RT_ZERO(pCtx->hwvirt.vmx.abMsrBitmap);
    11421098        RT_ZERO(pCtx->hwvirt.vmx.abIoBitmap);
    1143         memset(pCtx->hwvirt.vmx.CTX_SUFF(pvVirtApicPage),      0, VMX_V_VIRT_APIC_SIZE);
    1144     }
    1145 
    1146     /* On any failure, cleanup. */
    1147     if (RT_FAILURE(rc))
    1148         cpumR3FreeVmxHwVirtState(pVM);
    1149 
    1150     return rc;
     1099        RT_ZERO(pCtx->hwvirt.vmx.abVirtApicPage);
     1100    }
    11511101}
    11521102
     
    20892039
    20902040    /*
    2091      * Allocate memory required by the guest hardware-virtualization structures.
     2041     * Init the VMX/SVM state.
     2042     *
    20922043     * This must be done after initializing CPUID/MSR features as we access the
    20932044     * the VMX/SVM guest features below.
     
    20972048     */
    20982049    if (pVM->cpum.s.GuestFeatures.fVmx)
    2099         rc = cpumR3AllocVmxHwVirtState(pVM);
     2050        cpumR3InitVmxHwVirtState(pVM);
    21002051    else if (pVM->cpum.s.GuestFeatures.fSvm)
    21012052        cpumR3InitSvmHwVirtState(pVM);
    21022053    else
    21032054        Assert(pVM->apCpusR3[0]->cpum.s.Guest.hwvirt.enmHwvirt == CPUMHWVIRT_NONE);
    2104     if (RT_FAILURE(rc))
    2105         return rc;
    21062055
    21072056    CPUMR3Reset(pVM);
     
    21572106            }
    21582107        }
    2159 
    2160         cpumR3FreeVmxHwVirtState(pVM);
    21612108    }
    21622109    return VINF_SUCCESS;
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