VirtualBox

Changeset 91298 in vbox


Ignore:
Timestamp:
Sep 17, 2021 12:02:38 PM (3 years ago)
Author:
vboxsync
Message:

VMM/CPUM,++: Moved the nested VT-X shadow VMCS allocation into CPUMCTX. bugref:10093

Location:
trunk
Files:
7 edited

Legend:

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

    r91291 r91298  
    265265
    266266    alignb 4096
     267    .hwvirt                             resb        0
     268    .hwvirt.svm                         resb        0
     269    .hwvirt.vmx                         resb        0
    267270    .hwvirt.svm.Vmcb                    resb        4096
    268271    .hwvirt.svm.abMsrBitmap             resb        8192
     
    277280    .hwvirt.svm.fInterceptEvents       resb          1
    278281    ;.unnamed_padding.1 resb 0
     282
     283    .hwvirt.vmx.Vmcs                    EQU (.hwvirt.vmx )
     284    .hwvirt.vmx.ShadowVmcs              EQU (.hwvirt.vmx + 0x1000)
     285
    279286    alignb 8
    280287    .hwvirt.enmHwvirt                  resd          1
  • trunk/include/VBox/vmm/cpumctx.h

    r91297 r91298  
    541541                /** 0x4000 - The current VMCS. */
    542542                VMXVVMCS                Vmcs;
     543                /** 0X5000 - The shadow VMCS. */
     544                VMXVVMCS                ShadowVmcs;
    543545
    544546                /** 0x300 - Guest physical address of the VMXON region. */
     
    566568                 *  mode before execution of IRET. */
    567569                bool                    fNmiUnblockingIret;
    568                 /** 0X340 - The shadow VMCS - R0 ptr. */
    569                 R0PTRTYPE(PVMXVVMCS)    pShadowVmcsR0;
    570                 /** 0x348 - The shadow VMCS - R3 ptr. */
    571                 R3PTRTYPE(PVMXVVMCS)    pShadowVmcsR3;
    572570                /** 0x350 - The virtual-APIC page - R0 ptr. */
    573571                R0PTRTYPE(void *)       pvVirtApicPageR0;
     
    846844AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.abIoBitmap,            X86_PAGE_SIZE);
    847845AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.Vmcs,                  X86_PAGE_SIZE);
    848 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR0,         8);
     846AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.ShadowVmcs,            X86_PAGE_SIZE);
    849847AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR0,      8);
    850848AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR0,     8);
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h

    r91297 r91298  
    67196719        /* Read the VMCS-link pointer from guest memory. */
    67206720        RTGCPHYS const GCPhysShadowVmcs = pVmcs->u64VmcsLinkPtr.u;
    6721         Assert(pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pShadowVmcs));
    6722         int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pShadowVmcs),
    6723                                          GCPhysShadowVmcs, VMX_V_SHADOW_VMCS_SIZE);
     6721        int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), &pVCpu->cpum.GstCtx.hwvirt.vmx.ShadowVmcs,
     6722                                         GCPhysShadowVmcs, sizeof(pVCpu->cpum.GstCtx.hwvirt.vmx.ShadowVmcs));
    67246723        if (RT_SUCCESS(rc))
    67256724        { /* likely */ }
     
    67316730
    67326731        /* Verify the VMCS revision specified by the guest matches what we reported to the guest. */
    6733         if (pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pShadowVmcs)->u32VmcsRevId.n.u31RevisionId == VMX_V_VMCS_REVISION_ID)
     6732        if (pVCpu->cpum.GstCtx.hwvirt.vmx.ShadowVmcs.u32VmcsRevId.n.u31RevisionId == VMX_V_VMCS_REVISION_ID)
    67346733        { /* likely */ }
    67356734        else
     
    67416740        /* Verify the shadow bit is set if VMCS shadowing is enabled . */
    67426741        if (   !(pVmcs->u32ProcCtls2 & VMX_PROC_CTLS2_VMCS_SHADOWING)
    6743             || pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pShadowVmcs)->u32VmcsRevId.n.fIsShadowVmcs)
     6742            || pVCpu->cpum.GstCtx.hwvirt.vmx.ShadowVmcs.u32VmcsRevId.n.fIsShadowVmcs)
    67446743        { /* likely */ }
    67456744        else
     
    75927591    PCVMXVVMCS pVmcs = !IEM_VMX_IS_NON_ROOT_MODE(pVCpu)
    75937592                     ? &pVCpu->cpum.GstCtx.hwvirt.vmx.Vmcs
    7594                      : pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pShadowVmcs);
    7595     Assert(pVmcs);
     7593                     : &pVCpu->cpum.GstCtx.hwvirt.vmx.ShadowVmcs;
    75967594    iemVmxVmreadNoCheck(pVmcs, pu64Dst, u64VmcsField);
    75977595    return VINF_SUCCESS;
     
    78627860    PVMXVVMCS pVmcs = !fInVmxNonRootMode
    78637861                    ? &pVCpu->cpum.GstCtx.hwvirt.vmx.Vmcs
    7864                     : pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pShadowVmcs);
    7865     Assert(pVmcs);
     7862                    : &pVCpu->cpum.GstCtx.hwvirt.vmx.ShadowVmcs;
    78667863    iemVmxVmwriteNoCheck(pVmcs, u64Val, u64VmcsField);
    78677864
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r91297 r91298  
    10621062        PCPUMCTX pCtx  = &pVCpu->cpum.s.Guest;
    10631063
    1064         if (pCtx->hwvirt.vmx.pShadowVmcsR3)
    1065         {
    1066             SUPR3ContFree(pCtx->hwvirt.vmx.pShadowVmcsR3, VMX_V_VMCS_PAGES);
    1067             pCtx->hwvirt.vmx.pShadowVmcsR3 = NULL;
    1068         }
    10691064        if (pCtx->hwvirt.vmx.pvVirtApicPageR3)
    10701065        {
     
    11351130
    11361131        AssertCompile(sizeof(pCtx->hwvirt.vmx.Vmcs) == VMX_V_VMCS_PAGES * X86_PAGE_SIZE);
    1137 
    1138         /*
    1139          * Allocate the nested-guest shadow VMCS.
    1140          */
    1141         pCtx->hwvirt.vmx.pShadowVmcsR3 = (PVMXVVMCS)SUPR3ContAlloc(VMX_V_VMCS_PAGES, &pCtx->hwvirt.vmx.pShadowVmcsR0, NULL);
    1142         if (pCtx->hwvirt.vmx.pShadowVmcsR3)
    1143         { /* likely */ }
    1144         else
    1145         {
    1146             LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's shadow VMCS\n", pVCpu->idCpu, VMX_V_VMCS_PAGES));
    1147             break;
    1148         }
     1132        AssertCompile(sizeof(pCtx->hwvirt.vmx.Vmcs) == VMX_V_VMCS_SIZE);
     1133        AssertCompile(sizeof(pCtx->hwvirt.vmx.ShadowVmcs) == VMX_V_SHADOW_VMCS_PAGES * X86_PAGE_SIZE);
     1134        AssertCompile(sizeof(pCtx->hwvirt.vmx.ShadowVmcs) == VMX_V_SHADOW_VMCS_SIZE);
    11491135
    11501136        /*
     
    12641250         */
    12651251        RT_ZERO(pCtx->hwvirt.vmx.Vmcs);
    1266         memset(pCtx->hwvirt.vmx.CTX_SUFF(pShadowVmcs),         0, VMX_V_SHADOW_VMCS_SIZE);
     1252        RT_ZERO(pCtx->hwvirt.vmx.ShadowVmcs);
    12671253        memset(pCtx->hwvirt.vmx.CTX_SUFF(pvVirtApicPage),      0, VMX_V_VIRT_APIC_SIZE);
    12681254        memset(pCtx->hwvirt.vmx.CTX_SUFF(pvVmreadBitmap),      0, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
     
    12921278    PCPUMCTX pCtx = &pVCpu->cpum.s.Guest;
    12931279    Assert(pCtx->hwvirt.enmHwvirt == CPUMHWVIRT_VMX);
    1294     Assert(pCtx->hwvirt.vmx.CTX_SUFF(pShadowVmcs));
    12951280
    12961281    RT_ZERO(pCtx->hwvirt.vmx.Vmcs);
    1297     memset(pCtx->hwvirt.vmx.CTX_SUFF(pShadowVmcs), 0, VMX_V_SHADOW_VMCS_SIZE);
     1282    RT_ZERO(pCtx->hwvirt.vmx.ShadowVmcs);
    12981283    pCtx->hwvirt.vmx.GCPhysVmxon       = NIL_RTGCPHYS;
    12991284    pCtx->hwvirt.vmx.GCPhysShadowVmcs  = NIL_RTGCPHYS;
     
    25782563            SSMR3PutBool(pSSM,     pGstCtx->hwvirt.vmx.fNmiUnblockingIret);
    25792564            SSMR3PutStructEx(pSSM, &pGstCtx->hwvirt.vmx.Vmcs, sizeof(pGstCtx->hwvirt.vmx.Vmcs), 0, g_aVmxHwvirtVmcs, NULL);
    2580             SSMR3PutStructEx(pSSM, pGstCtx->hwvirt.vmx.pShadowVmcsR3, sizeof(VMXVVMCS), 0, g_aVmxHwvirtVmcs, NULL);
     2565            SSMR3PutStructEx(pSSM, &pGstCtx->hwvirt.vmx.ShadowVmcs, sizeof(pGstCtx->hwvirt.vmx.ShadowVmcs),
     2566                             0, g_aVmxHwvirtVmcs, NULL);
    25812567            SSMR3PutMem(pSSM,      pGstCtx->hwvirt.vmx.pvVmreadBitmapR3, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
    25822568            SSMR3PutMem(pSSM,      pGstCtx->hwvirt.vmx.pvVmwriteBitmapR3, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
     
    28672853                        SSMR3GetStructEx(pSSM, &pGstCtx->hwvirt.vmx.Vmcs, sizeof(pGstCtx->hwvirt.vmx.Vmcs),
    28682854                                         0, g_aVmxHwvirtVmcs, NULL);
    2869                         SSMR3GetStructEx(pSSM,  pGstCtx->hwvirt.vmx.pShadowVmcsR3, sizeof(VMXVVMCS), 0, g_aVmxHwvirtVmcs, NULL);
     2855                        SSMR3GetStructEx(pSSM, &pGstCtx->hwvirt.vmx.ShadowVmcs, sizeof(pGstCtx->hwvirt.vmx.ShadowVmcs),
     2856                                         0, g_aVmxHwvirtVmcs, NULL);
    28702857                        SSMR3GetMem(pSSM,       pGstCtx->hwvirt.vmx.pvVmreadBitmapR3, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
    28712858                        SSMR3GetMem(pSSM,       pGstCtx->hwvirt.vmx.pvVmwriteBitmapR3, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
  • trunk/src/VBox/VMM/include/CPUMInternal.mac

    r91297 r91298  
    231231
    232232    alignb 4096
     233    .Guest.hwvirt                           resb        0
     234    .Guest.hwvirt.svm                       resb        0
     235    .Guest.hwvirt.vmx                       resb        0
     236
    233237    .Guest.hwvirt.svm.Vmcb                  resb        4096
    234238    .Guest.hwvirt.svm.abMsrBitmap           resb        8192
     
    243247    .Guest.hwvirt.svm.fInterceptEvents       resb         1
    244248
    245     .Guest.hwvirt.vmx.Vmcs EQU .Guest.hwvirt.svm.Vmcb
     249    .Guest.hwvirt.vmx.Vmcs                  EQU (.Guest.hwvirt.vmx )
     250    .Guest.hwvirt.vmx.ShadowVmcs            EQU (.Guest.hwvirt.vmx + 0x1000)
    246251
    247252    ;.unnamed_padding.1 resb 0
  • trunk/src/VBox/VMM/testcase/tstVMStruct.h

    r91297 r91298  
    148148    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.fInterceptEvents);
    149149    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.fNmiUnblockingIret);
    150     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pShadowVmcsR0);
    151     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pShadowVmcsR3);
    152150    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVirtApicPageR0);
    153151    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVirtApicPageR3);
  • trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp

    r91297 r91298  
    253253    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.svm.abIoBitmap, 4096);
    254254    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.Vmcs, 4096);
     255    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.ShadowVmcs, 4096);
    255256
    256257    PVM pVM = NULL; NOREF(pVM);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette