VirtualBox

Changeset 91306 in vbox


Ignore:
Timestamp:
Sep 17, 2021 9:11:01 PM (3 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

Location:
trunk
Files:
10 edited

Legend:

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

    r91303 r91306  
    24412441}
    24422442
    2443 /**
    2444  * Gets the nested-guest virtual-APIC page.
    2445  *
    2446  * @returns The virtual-APIC page.
    2447  * @param   pCtx        Pointer to the context.
    2448  * @param   pHCPhys     Where to store the host-physical address of the virtual-APIC
    2449  *                      page.
    2450  */
    2451 DECLINLINE(void *) CPUMGetGuestVmxVirtApicPage(PCCPUMCTX pCtx, PRTHCPHYS pHCPhysVirtApicPage)
    2452 {
    2453     Assert(pHCPhysVirtApicPage);
    2454     Assert(pCtx->hwvirt.enmHwvirt == CPUMHWVIRT_VMX);
    2455     *pHCPhysVirtApicPage = pCtx->hwvirt.vmx.HCPhysVirtApicPage;
    2456     return pCtx->hwvirt.vmx.CTX_SUFF(pvVirtApicPage);
    2457 }
    2458 
    24592443# endif /* !IN_RC */
    24602444
  • trunk/include/VBox/vmm/cpum.mac

    r91305 r91306  
    290290    .hwvirt.vmx.abMsrBitmap             resb        0x1000
    291291    .hwvirt.vmx.abIoBitmap              resb        0x1000+0x1000
     292    .hwvirt.vmx.abVirtApicPage          resb        0x1000
    292293    alignb 8
    293294    .hwvirt.vmx.GCPhysVmxon             resq        1
     
    302303    .hwvirt.vmx.fInterceptEvents        resb        1
    303304    .hwvirt.vmx.fNmiUnblockingIret      resb        1
    304     .hwvirt.vmx.pvVirtApicPageR0        resq        1
    305     .hwvirt.vmx.pvVirtApicPageR3        resq        1
    306305    .hwvirt.vmx.uFirstPauseLoopTick     resq        1
    307306    .hwvirt.vmx.uPrevPauseTick          resq        1
     
    311310    alignb 8
    312311    .hwvirt.vmx.Msrs                    resb        224
    313     .hwvirt.vmx.HCPhysVirtApicPage      resq        1
    314312
    315313    alignb 8
  • trunk/include/VBox/vmm/cpumctx.h

    r91305 r91306  
    557557                /** 0x10000 - The I/O permission bitmap. */
    558558                uint8_t                 abIoBitmap[VMX_V_IO_BITMAP_A_SIZE + VMX_V_IO_BITMAP_B_SIZE];
     559                /** 0x12000 - The virtual-APIC page.
     560                 * @note This is used by VT-x hardware... */
     561                uint8_t                 abVirtApicPage[VMX_V_VIRT_APIC_SIZE];
    559562
    560563                /** 0x300 - Guest physical address of the VMXON region. */
     
    582585                 *  mode before execution of IRET. */
    583586                bool                    fNmiUnblockingIret;
    584                 /** 0x350 - The virtual-APIC page - R0 ptr. */
    585                 R0PTRTYPE(void *)       pvVirtApicPageR0;
    586                 /** 0x358 - The virtual-APIC page - R3 ptr. */
    587                 R3PTRTYPE(void *)       pvVirtApicPageR3;
    588587                /** 0x3d0 - Guest TSC timestamp of the first PAUSE instruction that is considered to
    589588                 *  be the first in a loop. */
     
    601600                /** 0x3f0 - Guest VMX MSRs. */
    602601                VMXMSRS                 Msrs;
    603                 /** 0x4e0 - Host physical address of the virtual-APIC page. */
    604                 RTHCPHYS                HCPhysVirtApicPage;
    605602            } vmx;
    606603        } CPUM_UNION_NM(s);
     
    619616        uint32_t                fPadding;
    620617#endif
     618#if 0
    621619        /** 0x530 - Pad to 64 byte boundary. */
    622         uint8_t                 abPadding0[8+32];
     620        uint8_t                 abPadding0[8+16+32];
     621#endif
    623622    } hwvirt;
    624623} CPUMCTX;
     
    838837AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.abMsrBitmap,           X86_PAGE_SIZE);
    839838AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.abIoBitmap,            X86_PAGE_SIZE);
     839AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.abVirtApicPage,        X86_PAGE_SIZE);
    840840AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.Msrs,                  8);
    841841
  • trunk/include/VBox/vmm/vm.h

    r91305 r91306  
    305305        CPUMCTX             GstCtx;
    306306#endif
    307         uint8_t             padding[98304];      /* multiple of 4096 */
     307        uint8_t             padding[102400];     /* multiple of 4096 */
    308308    } cpum;
    309309
  • trunk/include/VBox/vmm/vm.mac

    r91305 r91306  
    9191    .pgm                    resb 4096+28672
    9292    alignb 4096
    93     .cpum                   resb 98304
     93    .cpum                   resb 102400
    9494%define VMCPU.cpum.GstCtx   VMCPU.cpum
    9595    alignb 4096
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r91304 r91306  
    19721972        else
    19731973        {
    1974             pVmcsInfo->pbVirtApic = (uint8_t *)CPUMGetGuestVmxVirtApicPage(&pVCpu->cpum.GstCtx, &pVmcsInfo->HCPhysVirtApic);
    1975             Assert(pVmcsInfo->pbVirtApic);
     1974            pVmcsInfo->pbVirtApic     = &pVCpu->cpum.GstCtx.hwvirt.vmx.abVirtApicPage[0];
     1975            pVmcsInfo->HCPhysVirtApic = GVMMR0ConvertGVMPtr2HCPhys(pVM, pVmcsInfo->pbVirtApic);
    19761976            Assert(pVmcsInfo->HCPhysVirtApic && pVmcsInfo->HCPhysVirtApic != NIL_RTHCPHYS);
    19771977        }
  • 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;
  • trunk/src/VBox/VMM/include/CPUMInternal.mac

    r91305 r91306  
    257257    .Guest.hwvirt.vmx.abMsrBitmap           resb        0x1000
    258258    .Guest.hwvirt.vmx.abIoBitmap            resb        0x1000+0x1000
     259    .Guest.hwvirt.vmx.abVirtApicPage        resb        0x1000
    259260    alignb 8
    260261    .Guest.hwvirt.vmx.GCPhysVmxon           resq        1
     
    269270    .Guest.hwvirt.vmx.fInterceptEvents      resb        1
    270271    .Guest.hwvirt.vmx.fNmiUnblockingIret    resb        1
    271     .Guest.hwvirt.vmx.pvVirtApicPageR0      resq        1
    272     .Guest.hwvirt.vmx.pvVirtApicPageR3      resq        1
    273272    .Guest.hwvirt.vmx.uFirstPauseLoopTick   resq        1
    274273    .Guest.hwvirt.vmx.uPrevPauseTick        resq        1
     
    278277    alignb 8
    279278    .Guest.hwvirt.vmx.Msrs                  resb        224
    280     .Guest.hwvirt.vmx.HCPhysVirtApicPage    resq        1
    281279
    282280    alignb 8
  • trunk/src/VBox/VMM/testcase/tstVMStruct.h

    r91305 r91306  
    148148    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.fInterceptEvents);
    149149    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.fNmiUnblockingIret);
    150     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVirtApicPageR0);
    151     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVirtApicPageR3);
    152150    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.uFirstPauseLoopTick);
    153151    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.uPrevPauseTick);
  • trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp

    r91305 r91306  
    261261    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.abMsrBitmap, 4096);
    262262    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.abIoBitmap, 4096);
     263    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.abVirtApicPage, 4096);
    263264
    264265    PVM pVM = NULL; NOREF(pVM);
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