VirtualBox

Changeset 91301 in vbox


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

VMM/CPUM,++: Moved the nested VT-X MSR load & store bitmap allocations into CPUMCTX. bugref:10093

Location:
trunk
Files:
10 edited

Legend:

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

    r91299 r91301  
    268268    .hwvirt.svm                         resb        0
    269269    .hwvirt.vmx                         resb        0
    270     .hwvirt.svm.Vmcb                    resb        4096
    271     .hwvirt.svm.abMsrBitmap             resb        8192
    272     .hwvirt.svm.abIoBitmap              resb        12288
    273     .hwvirt.svm.uMsrHSavePa             resq        1
    274     .hwvirt.svm.GCPhysVmcb              resq        1
    275     alignb 8
    276     .hwvirt.svm.HostState               resb        184
    277     .hwvirt.svm.uPrevPauseTick          resq        1
    278     .hwvirt.svm.cPauseFilter            resw        1
    279     .hwvirt.svm.cPauseFilterThreshold   resw        1
    280     .hwvirt.svm.fInterceptEvents        resb        1
    281     ;.unnamed_padding.1 resb 0
    282 
    283     .hwvirt.vmx.Vmcs                    EQU         (.hwvirt.vmx )
    284     .hwvirt.vmx.ShadowVmcs              EQU         (.hwvirt.vmx + 0x1000)
     270
     271    .hwvirt.svm.Vmcb                    EQU         .hwvirt.svm
     272    .hwvirt.svm.abMsrBitmap             EQU         (.hwvirt.svm.Vmcb                   + 0x1000)
     273    .hwvirt.svm.abIoBitmap              EQU         (.hwvirt.svm.abMsrBitmap            + 0x2000)
     274    .hwvirt.svm.uMsrHSavePa             EQU         (.hwvirt.svm.abIoBitmap             + 0x3000)   ; resq        1
     275    .hwvirt.svm.GCPhysVmcb              EQU         (.hwvirt.svm.uMsrHSavePa            + 8)        ; resq        1
     276    alignb 8
     277    .hwvirt.svm.HostState               EQU         (.hwvirt.svm.GCPhysVmcb             + 8)        ; resb        184
     278    .hwvirt.svm.uPrevPauseTick          EQU         (.hwvirt.svm.HostState              + 184)      ; resq        1
     279    .hwvirt.svm.cPauseFilter            EQU         (.hwvirt.svm.uPrevPauseTick         + 8)        ; resw        1
     280    .hwvirt.svm.cPauseFilterThreshold   EQU         (.hwvirt.svm.cPauseFilter           + 2)        ; resw        1
     281    .hwvirt.svm.fInterceptEvents        EQU         (.hwvirt.svm.cPauseFilterThreshold  + 2)        ; resb        1
     282
     283    .hwvirt.vmx.Vmcs                    resb        0x1000
     284    .hwvirt.vmx.ShadowVmcs              resb        0x1000
     285    .hwvirt.vmx.abVmreadBitmap          resb        0x1000
     286    .hwvirt.vmx.abVmwriteBitmap         resb        0x1000
     287    .hwvirt.vmx.aEntryMsrLoadArea       resb        0x2000
     288    .hwvirt.vmx.aExitMsrStoreArea       resb        0x2000
     289    .hwvirt.vmx.aExitMsrLoadArea        resb        0x2000
     290    alignb 8
     291    .hwvirt.vmx.GCPhysVmxon             resq        1
     292    .hwvirt.vmx.GCPhysVmcs              resq        1
     293    .hwvirt.vmx.GCPhysShadowVmcs        resq        1
     294    .hwvirt.vmx.enmDiag                 resd        1
     295    .hwvirt.vmx.enmAbort                resd        1
     296    .hwvirt.vmx.uDiagAux                resq        1
     297    .hwvirt.vmx.uAbortAux               resd        1
     298    .hwvirt.vmx.fInVmxRootMode          resb        1
     299    .hwvirt.vmx.fInVmxNonRootMode       resb        1
     300    .hwvirt.vmx.fInterceptEvents        resb        1
     301    .hwvirt.vmx.fNmiUnblockingIret      resb        1
     302    .hwvirt.vmx.pvVirtApicPageR0        resq        1
     303    .hwvirt.vmx.pvVirtApicPageR3        resq        1
     304    .hwvirt.vmx.pvMsrBitmapR0           resq        1
     305    .hwvirt.vmx.pvMsrBitmapR3           resq        1
     306    .hwvirt.vmx.pvIoBitmapR0            resq        1
     307    .hwvirt.vmx.pvIoBitmapR3            resq        1
     308    .hwvirt.vmx.uFirstPauseLoopTick     resq        1
     309    .hwvirt.vmx.uPrevPauseTick          resq        1
     310    .hwvirt.vmx.uEntryTick              resq        1
     311    .hwvirt.vmx.offVirtApicWrite        resw        1
     312    .hwvirt.vmx.fVirtNmiBlocking        resb        1
     313    alignb 8
     314    .hwvirt.vmx.Msrs                    resb        224
     315    .hwvirt.vmx.HCPhysVirtApicPage      resq        1
    285316
    286317    alignb 8
  • trunk/include/VBox/vmm/cpumctx.h

    r91298 r91301  
    543543                /** 0X5000 - The shadow VMCS. */
    544544                VMXVVMCS                ShadowVmcs;
     545                /** 0x6000 - The VMREAD bitmap. */
     546                uint8_t                 abVmreadBitmap[VMX_V_VMREAD_VMWRITE_BITMAP_SIZE];
     547                /** 0x7000 - The VMWRITE bitmap. */
     548                uint8_t                 abVmwriteBitmap[VMX_V_VMREAD_VMWRITE_BITMAP_SIZE];
     549                /** 0x8000 - The VM-entry MSR-load area. */
     550                VMXAUTOMSR              aEntryMsrLoadArea[VMX_V_AUTOMSR_AREA_SIZE / sizeof(VMXAUTOMSR)];
     551                /** 0xa000 - The VM-exit MSR-store area. */
     552                VMXAUTOMSR              aExitMsrStoreArea[VMX_V_AUTOMSR_AREA_SIZE / sizeof(VMXAUTOMSR)];
     553                /** 0xc000 - The VM-exit MSR-load area. */
     554                VMXAUTOMSR              aExitMsrLoadArea[VMX_V_AUTOMSR_AREA_SIZE / sizeof(VMXAUTOMSR)];
    545555
    546556                /** 0x300 - Guest physical address of the VMXON region. */
     
    572582                /** 0x358 - The virtual-APIC page - R3 ptr. */
    573583                R3PTRTYPE(void *)       pvVirtApicPageR3;
    574                 /** 0x360 - The VMREAD bitmap - R0 ptr. */
    575                 R0PTRTYPE(void *)       pvVmreadBitmapR0;
    576                 /** 0x368 - The VMREAD bitmap - R3 ptr. */
    577                 R3PTRTYPE(void *)       pvVmreadBitmapR3;
    578                 /** 0x370 - The VMWRITE bitmap - R0 ptr. */
    579                 R0PTRTYPE(void *)       pvVmwriteBitmapR0;
    580                 /** 0x378 - The VMWRITE bitmap - R3 ptr. */
    581                 R3PTRTYPE(void *)       pvVmwriteBitmapR3;
    582                 /** 0x380 - The VM-entry MSR-load area - R0 ptr. */
    583                 R0PTRTYPE(PVMXAUTOMSR)  pEntryMsrLoadAreaR0;
    584                 /** 0x388 - The VM-entry MSR-load area - R3 ptr. */
    585                 R3PTRTYPE(PVMXAUTOMSR)  pEntryMsrLoadAreaR3;
    586                 /** 0x390 - The VM-exit MSR-store area - R0 ptr. */
    587                 R0PTRTYPE(PVMXAUTOMSR)  pExitMsrStoreAreaR0;
    588                 /** 0x398 - The VM-exit MSR-store area - R3 ptr. */
    589                 R3PTRTYPE(PVMXAUTOMSR)  pExitMsrStoreAreaR3;
    590                 /** 0x3a0 - The VM-exit MSR-load area - R0 ptr. */
    591                 R0PTRTYPE(PVMXAUTOMSR)  pExitMsrLoadAreaR0;
    592                 /** 0x3a8 - The VM-exit MSR-load area - R3 ptr. */
    593                 R3PTRTYPE(PVMXAUTOMSR)  pExitMsrLoadAreaR3;
    594584                /** 0x3b0 - MSR bitmap - R0 ptr. */
    595585                R0PTRTYPE(void *)       pvMsrBitmapR0;
     
    634624#endif
    635625        /** 0x530 - Pad to 64 byte boundary. */
    636         uint8_t                 abPadding0[8+16];
     626        uint8_t                 abPadding0[8];
    637627    } hwvirt;
    638628} CPUMCTX;
     
    845835AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.Vmcs,                  X86_PAGE_SIZE);
    846836AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.ShadowVmcs,            X86_PAGE_SIZE);
    847 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR0,      8);
    848 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR0,     8);
    849 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pEntryMsrLoadAreaR0,   8);
    850 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pExitMsrStoreAreaR0,   8);
    851 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pExitMsrLoadAreaR0,    8);
     837AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.abVmreadBitmap,        X86_PAGE_SIZE);
     838AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.abVmwriteBitmap,       X86_PAGE_SIZE);
     839AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.aEntryMsrLoadArea,     X86_PAGE_SIZE);
     840AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.aExitMsrStoreArea,     X86_PAGE_SIZE);
     841AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.aExitMsrLoadArea,      X86_PAGE_SIZE);
    852842AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvMsrBitmapR0,         8);
    853843AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvIoBitmapR0,          8);
  • trunk/include/VBox/vmm/vm.h

    r91291 r91301  
    305305        CPUMCTX             GstCtx;
    306306#endif
    307         uint8_t             padding[61440];      /* multiple of 4096 */
     307        uint8_t             padding[86016];      /* multiple of 4096 */
    308308    } cpum;
    309309
  • trunk/include/VBox/vmm/vm.mac

    r91291 r91301  
    9191    .pgm                    resb 4096+28672
    9292    alignb 4096
    93     .cpum                   resb 61440
     93    .cpum                   resb 86016
    9494%define VMCPU.cpum.GstCtx   VMCPU.cpum
    9595    alignb 4096
  • trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp

    r91297 r91301  
    28822882     * Finally, consult the VMREAD/VMWRITE bitmap whether to intercept the instruction or not.
    28832883     */
    2884     uint32_t const u32VmcsField = RT_LO_U32(u64VmcsField);
    2885     uint8_t const *pbBitmap     = uExitReason == VMX_EXIT_VMREAD
    2886                                 ? (uint8_t const *)pVCpu->cpum.s.Guest.hwvirt.vmx.CTX_SUFF(pvVmreadBitmap)
    2887                                 : (uint8_t const *)pVCpu->cpum.s.Guest.hwvirt.vmx.CTX_SUFF(pvVmwriteBitmap);
     2884    uint32_t const        u32VmcsField = RT_LO_U32(u64VmcsField);
     2885    uint8_t const * const pbBitmap     = uExitReason == VMX_EXIT_VMREAD
     2886                                       ? &pVCpu->cpum.s.Guest.hwvirt.vmx.abVmreadBitmap[0]
     2887                                       : &pVCpu->cpum.s.Guest.hwvirt.vmx.abVmwriteBitmap[0];
    28882888    Assert(pbBitmap);
    28892889    Assert(u32VmcsField >> 3 < VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
    2890     return ASMBitTest(pbBitmap + (u32VmcsField >> 3), u32VmcsField & 7);
     2890    return ASMBitTest(&pbBitmap[u32VmcsField >> 3], u32VmcsField & 7);
    28912891}
    28922892
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h

    r91298 r91301  
    15761576     * See Intel spec. 24.7.2 "VM-Exit Controls for MSRs".
    15771577     */
    1578     uint32_t const cMsrs = pVmcs->u32ExitMsrStoreCount;
     1578    uint32_t const cMsrs = RT_MIN(pVmcs->u32ExitMsrStoreCount, RT_ELEMENTS(pVCpu->cpum.GstCtx.hwvirt.vmx.aExitMsrStoreArea));
    15791579    if (!cMsrs)
    15801580        return VINF_SUCCESS;
     
    15991599    RTGCPHYS const GCPhysVmExitMsrStoreArea = pVmcs->u64AddrExitMsrStore.u;
    16001600    if (GCPhysVmEntryMsrLoadArea == GCPhysVmExitMsrStoreArea)
    1601         pMsrArea = pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pEntryMsrLoadArea);
     1601        pMsrArea = pVCpu->cpum.GstCtx.hwvirt.vmx.aEntryMsrLoadArea;
    16021602    else
    16031603    {
    1604         int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), (void *)pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pExitMsrStoreArea),
     1604        int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), &pVCpu->cpum.GstCtx.hwvirt.vmx.aExitMsrStoreArea[0],
    16051605                                         GCPhysVmExitMsrStoreArea, cMsrs * sizeof(VMXAUTOMSR));
    16061606        if (RT_SUCCESS(rc))
    1607             pMsrArea = pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pExitMsrStoreArea);
     1607            pMsrArea = pVCpu->cpum.GstCtx.hwvirt.vmx.aExitMsrStoreArea;
    16081608        else
    16091609        {
     
    16171617     */
    16181618    PVMXAUTOMSR pMsr = pMsrArea;
    1619     Assert(pMsr);
    16201619    for (uint32_t idxMsr = 0; idxMsr < cMsrs; idxMsr++, pMsr++)
    16211620    {
     
    19531952     * See Intel spec. 24.7.2 "VM-Exit Controls for MSRs".
    19541953     */
    1955     uint32_t const cMsrs = pVmcs->u32ExitMsrLoadCount;
     1954    uint32_t const cMsrs = RT_MIN(pVmcs->u32ExitMsrLoadCount, RT_ELEMENTS(pVCpu->cpum.GstCtx.hwvirt.vmx.aExitMsrLoadArea));
    19561955    if (!cMsrs)
    19571956        return VINF_SUCCESS;
     
    19691968
    19701969    RTGCPHYS const GCPhysVmExitMsrLoadArea = pVmcs->u64AddrExitMsrLoad.u;
    1971     int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), (void *)pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pExitMsrLoadArea),
     1970    int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), &pVCpu->cpum.GstCtx.hwvirt.vmx.aExitMsrLoadArea[0],
    19721971                                     GCPhysVmExitMsrLoadArea, cMsrs * sizeof(VMXAUTOMSR));
    19731972    if (RT_SUCCESS(rc))
    19741973    {
    1975         PCVMXAUTOMSR pMsr = pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pExitMsrLoadArea);
    1976         Assert(pMsr);
     1974        PCVMXAUTOMSR pMsr = pVCpu->cpum.GstCtx.hwvirt.vmx.aExitMsrLoadArea;
    19771975        for (uint32_t idxMsr = 0; idxMsr < cMsrs; idxMsr++, pMsr++)
    19781976        {
     
    64596457     * See Intel spec. 24.8.2 "VM-Entry Controls for MSRs".
    64606458     */
    6461     uint32_t const cMsrs = pVmcs->u32EntryMsrLoadCount;
     6459    uint32_t const cMsrs = RT_MIN(pVmcs->u32EntryMsrLoadCount, RT_ELEMENTS(pVCpu->cpum.GstCtx.hwvirt.vmx.aEntryMsrLoadArea));
    64626460    if (!cMsrs)
    64636461        return VINF_SUCCESS;
     
    64786476
    64796477    RTGCPHYS const GCPhysVmEntryMsrLoadArea = pVmcs->u64AddrEntryMsrLoad.u;
    6480     int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), (void *)pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pEntryMsrLoadArea),
     6478    int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), &pVCpu->cpum.GstCtx.hwvirt.vmx.aEntryMsrLoadArea[0],
    64816479                                     GCPhysVmEntryMsrLoadArea, cMsrs * sizeof(VMXAUTOMSR));
    64826480    if (RT_SUCCESS(rc))
    64836481    {
    6484         PCVMXAUTOMSR pMsr = pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pEntryMsrLoadArea);
    6485         Assert(pMsr);
     6482        PCVMXAUTOMSR pMsr = &pVCpu->cpum.GstCtx.hwvirt.vmx.aEntryMsrLoadArea[0];
    64866483        for (uint32_t idxMsr = 0; idxMsr < cMsrs; idxMsr++, pMsr++)
    64876484        {
     
    66426639        /* Read the VMREAD-bitmap. */
    66436640        RTGCPHYS const GCPhysVmreadBitmap = pVmcs->u64AddrVmreadBitmap.u;
    6644         Assert(pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pvVmreadBitmap));
    6645         int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pvVmreadBitmap),
    6646                                          GCPhysVmreadBitmap, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
     6641        int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), &pVCpu->cpum.GstCtx.hwvirt.vmx.abVmreadBitmap[0],
     6642                                         GCPhysVmreadBitmap, sizeof(pVCpu->cpum.GstCtx.hwvirt.vmx.abVmreadBitmap));
    66476643        if (RT_SUCCESS(rc))
    66486644        { /* likely */ }
     
    66526648        /* Read the VMWRITE-bitmap. */
    66536649        RTGCPHYS const GCPhysVmwriteBitmap = pVmcs->u64AddrVmwriteBitmap.u;
    6654         Assert(pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pvVmwriteBitmap));
    6655         rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pvVmwriteBitmap),
    6656                                      GCPhysVmwriteBitmap, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
     6650        rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), &pVCpu->cpum.GstCtx.hwvirt.vmx.abVmwriteBitmap[0],
     6651                                     GCPhysVmwriteBitmap, sizeof(pVCpu->cpum.GstCtx.hwvirt.vmx.abVmwriteBitmap));
    66576652        if (RT_SUCCESS(rc))
    66586653        { /* likely */ }
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r91298 r91301  
    10671067            pCtx->hwvirt.vmx.pvVirtApicPageR3 = NULL;
    10681068        }
    1069         if (pCtx->hwvirt.vmx.pvVmreadBitmapR3)
    1070         {
    1071             SUPR3ContFree(pCtx->hwvirt.vmx.pvVmreadBitmapR3, VMX_V_VMREAD_VMWRITE_BITMAP_PAGES);
    1072             pCtx->hwvirt.vmx.pvVmreadBitmapR3 = NULL;
    1073         }
    1074         if (pCtx->hwvirt.vmx.pvVmwriteBitmapR3)
    1075         {
    1076             SUPR3ContFree(pCtx->hwvirt.vmx.pvVmwriteBitmapR3, VMX_V_VMREAD_VMWRITE_BITMAP_PAGES);
    1077             pCtx->hwvirt.vmx.pvVmwriteBitmapR3 = NULL;
    1078         }
    1079         if (pCtx->hwvirt.vmx.pEntryMsrLoadAreaR3)
    1080         {
    1081             SUPR3ContFree(pCtx->hwvirt.vmx.pEntryMsrLoadAreaR3, VMX_V_AUTOMSR_AREA_PAGES);
    1082             pCtx->hwvirt.vmx.pEntryMsrLoadAreaR3 = NULL;
    1083         }
    1084         if (pCtx->hwvirt.vmx.pExitMsrStoreAreaR3)
    1085         {
    1086             SUPR3ContFree(pCtx->hwvirt.vmx.pExitMsrStoreAreaR3, VMX_V_AUTOMSR_AREA_PAGES);
    1087             pCtx->hwvirt.vmx.pExitMsrStoreAreaR3 = NULL;
    1088         }
    1089         if (pCtx->hwvirt.vmx.pExitMsrLoadAreaR3)
    1090         {
    1091             SUPR3ContFree(pCtx->hwvirt.vmx.pExitMsrLoadAreaR3, VMX_V_AUTOMSR_AREA_PAGES);
    1092             pCtx->hwvirt.vmx.pExitMsrLoadAreaR3 = NULL;
    1093         }
    10941069        if (pCtx->hwvirt.vmx.pvMsrBitmapR3)
    10951070        {
     
    11331108        AssertCompile(sizeof(pCtx->hwvirt.vmx.ShadowVmcs) == VMX_V_SHADOW_VMCS_PAGES * X86_PAGE_SIZE);
    11341109        AssertCompile(sizeof(pCtx->hwvirt.vmx.ShadowVmcs) == VMX_V_SHADOW_VMCS_SIZE);
     1110        AssertCompile(sizeof(pCtx->hwvirt.vmx.abVmreadBitmap) == VMX_V_VMREAD_VMWRITE_BITMAP_PAGES * X86_PAGE_SIZE);
     1111        AssertCompile(sizeof(pCtx->hwvirt.vmx.abVmreadBitmap) == VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
     1112        AssertCompile(sizeof(pCtx->hwvirt.vmx.abVmwriteBitmap) == VMX_V_VMREAD_VMWRITE_BITMAP_PAGES * X86_PAGE_SIZE);
     1113        AssertCompile(sizeof(pCtx->hwvirt.vmx.abVmwriteBitmap) == VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
     1114        AssertCompile(sizeof(pCtx->hwvirt.vmx.aEntryMsrLoadArea) == VMX_V_AUTOMSR_AREA_PAGES * X86_PAGE_SIZE);
     1115        AssertCompile(sizeof(pCtx->hwvirt.vmx.aEntryMsrLoadArea) == VMX_V_AUTOMSR_AREA_SIZE);
     1116        AssertCompile(sizeof(pCtx->hwvirt.vmx.aExitMsrStoreArea) == VMX_V_AUTOMSR_AREA_PAGES * X86_PAGE_SIZE);
     1117        AssertCompile(sizeof(pCtx->hwvirt.vmx.aExitMsrStoreArea) == VMX_V_AUTOMSR_AREA_SIZE);
     1118        AssertCompile(sizeof(pCtx->hwvirt.vmx.aExitMsrLoadArea) == VMX_V_AUTOMSR_AREA_PAGES * X86_PAGE_SIZE);
     1119        AssertCompile(sizeof(pCtx->hwvirt.vmx.aExitMsrLoadArea) == VMX_V_AUTOMSR_AREA_SIZE);
    11351120
    11361121        /*
     
    11501135
    11511136        /*
    1152          * Allocate the VMREAD-bitmap.
    1153          */
    1154         pCtx->hwvirt.vmx.pvVmreadBitmapR3 = SUPR3ContAlloc(VMX_V_VMREAD_VMWRITE_BITMAP_PAGES,
    1155                                                            &pCtx->hwvirt.vmx.pvVmreadBitmapR0, NULL);
    1156         if (pCtx->hwvirt.vmx.pvVmreadBitmapR3)
    1157         { /* likely */ }
    1158         else
    1159         {
    1160             LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's VMREAD-bitmap\n", pVCpu->idCpu,
    1161                     VMX_V_VMREAD_VMWRITE_BITMAP_PAGES));
    1162             break;
    1163         }
    1164 
    1165         /*
    1166          * Allocatge the VMWRITE-bitmap.
    1167          */
    1168         pCtx->hwvirt.vmx.pvVmwriteBitmapR3 = SUPR3ContAlloc(VMX_V_VMREAD_VMWRITE_BITMAP_PAGES,
    1169                                                             &pCtx->hwvirt.vmx.pvVmwriteBitmapR0, NULL);
    1170         if (pCtx->hwvirt.vmx.pvVmwriteBitmapR3)
    1171         { /* likely */ }
    1172         else
    1173         {
    1174             LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's VMWRITE-bitmap\n", pVCpu->idCpu,
    1175                     VMX_V_VMREAD_VMWRITE_BITMAP_PAGES));
    1176             break;
    1177         }
    1178 
    1179         /*
    1180          * Allocate the VM-entry MSR-load area.
    1181          */
    1182         pCtx->hwvirt.vmx.pEntryMsrLoadAreaR3 = (PVMXAUTOMSR)SUPR3ContAlloc(VMX_V_AUTOMSR_AREA_PAGES,
    1183                                                                            &pCtx->hwvirt.vmx.pEntryMsrLoadAreaR0, NULL);
    1184         if (pCtx->hwvirt.vmx.pEntryMsrLoadAreaR3)
    1185         { /* likely */ }
    1186         else
    1187         {
    1188             LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's VM-entry MSR-load area\n", pVCpu->idCpu,
    1189                     VMX_V_AUTOMSR_AREA_PAGES));
    1190             break;
    1191         }
    1192 
    1193         /*
    1194          * Allocate the VM-exit MSR-store area.
    1195          */
    1196         pCtx->hwvirt.vmx.pExitMsrStoreAreaR3 = (PVMXAUTOMSR)SUPR3ContAlloc(VMX_V_AUTOMSR_AREA_PAGES,
    1197                                                                            &pCtx->hwvirt.vmx.pExitMsrStoreAreaR0, NULL);
    1198         if (pCtx->hwvirt.vmx.pExitMsrStoreAreaR3)
    1199         { /* likely */ }
    1200         else
    1201         {
    1202             LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's VM-exit MSR-store area\n", pVCpu->idCpu,
    1203                     VMX_V_AUTOMSR_AREA_PAGES));
    1204             break;
    1205         }
    1206 
    1207         /*
    1208          * Allocate the VM-exit MSR-load area.
    1209          */
    1210         pCtx->hwvirt.vmx.pExitMsrLoadAreaR3 = (PVMXAUTOMSR)SUPR3ContAlloc(VMX_V_AUTOMSR_AREA_PAGES,
    1211                                                                           &pCtx->hwvirt.vmx.pExitMsrLoadAreaR0, NULL);
    1212         if (pCtx->hwvirt.vmx.pExitMsrLoadAreaR3)
    1213         { /* likely */ }
    1214         else
    1215         {
    1216             LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's VM-exit MSR-load area\n", pVCpu->idCpu,
    1217                     VMX_V_AUTOMSR_AREA_PAGES));
    1218             break;
    1219         }
    1220 
    1221         /*
    12221137         * Allocate the MSR bitmap.
    12231138         */
     
    12511166        RT_ZERO(pCtx->hwvirt.vmx.Vmcs);
    12521167        RT_ZERO(pCtx->hwvirt.vmx.ShadowVmcs);
    1253         memset(pCtx->hwvirt.vmx.CTX_SUFF(pvVirtApicPage),      0, VMX_V_VIRT_APIC_SIZE);
    1254         memset(pCtx->hwvirt.vmx.CTX_SUFF(pvVmreadBitmap),      0, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
    1255         memset(pCtx->hwvirt.vmx.CTX_SUFF(pvVmwriteBitmap),     0, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
    1256         memset(pCtx->hwvirt.vmx.CTX_SUFF(pEntryMsrLoadArea),   0, VMX_V_AUTOMSR_AREA_SIZE);
    1257         memset(pCtx->hwvirt.vmx.CTX_SUFF(pExitMsrStoreArea),   0, VMX_V_AUTOMSR_AREA_SIZE);
    1258         memset(pCtx->hwvirt.vmx.CTX_SUFF(pExitMsrLoadArea),    0, VMX_V_AUTOMSR_AREA_SIZE);
     1168        RT_ZERO(pCtx->hwvirt.vmx.abVmreadBitmap);
     1169        RT_ZERO(pCtx->hwvirt.vmx.abVmwriteBitmap);
     1170        RT_ZERO(pCtx->hwvirt.vmx.aEntryMsrLoadArea);
     1171        RT_ZERO(pCtx->hwvirt.vmx.aExitMsrStoreArea);
     1172        RT_ZERO(pCtx->hwvirt.vmx.aExitMsrLoadArea);
    12591173        memset(pCtx->hwvirt.vmx.CTX_SUFF(pvMsrBitmap),         0, VMX_V_MSR_BITMAP_SIZE);
    12601174        memset(pCtx->hwvirt.vmx.CTX_SUFF(pvIoBitmap),          0, VMX_V_IO_BITMAP_A_SIZE + VMX_V_IO_BITMAP_B_SIZE);
     1175        memset(pCtx->hwvirt.vmx.CTX_SUFF(pvVirtApicPage),      0, VMX_V_VIRT_APIC_SIZE);
    12611176    }
    12621177
     
    25652480            SSMR3PutStructEx(pSSM, &pGstCtx->hwvirt.vmx.ShadowVmcs, sizeof(pGstCtx->hwvirt.vmx.ShadowVmcs),
    25662481                             0, g_aVmxHwvirtVmcs, NULL);
    2567             SSMR3PutMem(pSSM,      pGstCtx->hwvirt.vmx.pvVmreadBitmapR3, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
    2568             SSMR3PutMem(pSSM,      pGstCtx->hwvirt.vmx.pvVmwriteBitmapR3, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
    2569             SSMR3PutMem(pSSM,      pGstCtx->hwvirt.vmx.pEntryMsrLoadAreaR3, VMX_V_AUTOMSR_AREA_SIZE);
    2570             SSMR3PutMem(pSSM,      pGstCtx->hwvirt.vmx.pExitMsrStoreAreaR3, VMX_V_AUTOMSR_AREA_SIZE);
    2571             SSMR3PutMem(pSSM,      pGstCtx->hwvirt.vmx.pExitMsrLoadAreaR3,  VMX_V_AUTOMSR_AREA_SIZE);
     2482            SSMR3PutMem(pSSM,     &pGstCtx->hwvirt.vmx.abVmreadBitmap[0],    sizeof(pGstCtx->hwvirt.vmx.abVmreadBitmap));
     2483            SSMR3PutMem(pSSM,     &pGstCtx->hwvirt.vmx.abVmwriteBitmap[0],   sizeof(pGstCtx->hwvirt.vmx.abVmwriteBitmap));
     2484            SSMR3PutMem(pSSM,     &pGstCtx->hwvirt.vmx.aEntryMsrLoadArea[0], sizeof(pGstCtx->hwvirt.vmx.aEntryMsrLoadArea));
     2485            SSMR3PutMem(pSSM,     &pGstCtx->hwvirt.vmx.aExitMsrStoreArea[0], sizeof(pGstCtx->hwvirt.vmx.aExitMsrStoreArea));
     2486            SSMR3PutMem(pSSM,     &pGstCtx->hwvirt.vmx.aExitMsrLoadArea[0],  sizeof(pGstCtx->hwvirt.vmx.aExitMsrLoadArea));
    25722487            SSMR3PutMem(pSSM,      pGstCtx->hwvirt.vmx.pvMsrBitmapR3, VMX_V_MSR_BITMAP_SIZE);
    25732488            SSMR3PutMem(pSSM,      pGstCtx->hwvirt.vmx.pvIoBitmapR3, VMX_V_IO_BITMAP_A_SIZE + VMX_V_IO_BITMAP_B_SIZE);
     
    28552770                        SSMR3GetStructEx(pSSM, &pGstCtx->hwvirt.vmx.ShadowVmcs, sizeof(pGstCtx->hwvirt.vmx.ShadowVmcs),
    28562771                                         0, g_aVmxHwvirtVmcs, NULL);
    2857                         SSMR3GetMem(pSSM,       pGstCtx->hwvirt.vmx.pvVmreadBitmapR3, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
    2858                         SSMR3GetMem(pSSM,       pGstCtx->hwvirt.vmx.pvVmwriteBitmapR3, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
    2859                         SSMR3GetMem(pSSM,       pGstCtx->hwvirt.vmx.pEntryMsrLoadAreaR3, VMX_V_AUTOMSR_AREA_SIZE);
    2860                         SSMR3GetMem(pSSM,       pGstCtx->hwvirt.vmx.pExitMsrStoreAreaR3, VMX_V_AUTOMSR_AREA_SIZE);
    2861                         SSMR3GetMem(pSSM,       pGstCtx->hwvirt.vmx.pExitMsrLoadAreaR3,  VMX_V_AUTOMSR_AREA_SIZE);
     2772                        SSMR3GetMem(pSSM,      &pGstCtx->hwvirt.vmx.abVmreadBitmap[0],    sizeof(pGstCtx->hwvirt.vmx.abVmreadBitmap));
     2773                        SSMR3GetMem(pSSM,      &pGstCtx->hwvirt.vmx.abVmwriteBitmap[0],   sizeof(pGstCtx->hwvirt.vmx.abVmwriteBitmap));
     2774                        SSMR3GetMem(pSSM,      &pGstCtx->hwvirt.vmx.aEntryMsrLoadArea[0], sizeof(pGstCtx->hwvirt.vmx.aEntryMsrLoadArea));
     2775                        SSMR3GetMem(pSSM,      &pGstCtx->hwvirt.vmx.aExitMsrStoreArea[0], sizeof(pGstCtx->hwvirt.vmx.aExitMsrStoreArea));
     2776                        SSMR3GetMem(pSSM,      &pGstCtx->hwvirt.vmx.aExitMsrLoadArea[0],  sizeof(pGstCtx->hwvirt.vmx.aExitMsrLoadArea));
    28622777                        SSMR3GetMem(pSSM,       pGstCtx->hwvirt.vmx.pvMsrBitmapR3, VMX_V_MSR_BITMAP_SIZE);
    28632778                        SSMR3GetMem(pSSM,       pGstCtx->hwvirt.vmx.pvIoBitmapR3, VMX_V_IO_BITMAP_A_SIZE + VMX_V_IO_BITMAP_B_SIZE);
  • trunk/src/VBox/VMM/include/CPUMInternal.mac

    r91299 r91301  
    230230    .Guest.XState               EQU     .Guest.abXState
    231231
     232;;
    232233    alignb 4096
    233234    .Guest.hwvirt                           resb        0
     
    235236    .Guest.hwvirt.vmx                       resb        0
    236237
    237     .Guest.hwvirt.svm.Vmcb                  resb        4096
    238     .Guest.hwvirt.svm.abMsrBitmap           resb        8192
    239     .Guest.hwvirt.svm.abIoBitmap            resb        12288
    240     .Guest.hwvirt.svm.uMsrHSavePa           resq        1
    241     .Guest.hwvirt.svm.GCPhysVmcb            resq        1
    242     alignb 8
    243     .Guest.hwvirt.svm.HostState             resb        184
    244     .Guest.hwvirt.svm.uPrevPauseTick        resq        1
    245     .Guest.hwvirt.svm.cPauseFilter          resw        1
    246     .Guest.hwvirt.svm.cPauseFilterThreshold resw        1
    247     .Guest.hwvirt.svm.fInterceptEvents      resb        1
    248 
    249     .Guest.hwvirt.vmx.Vmcs                  EQU         (.Guest.hwvirt.vmx )
    250     .Guest.hwvirt.vmx.ShadowVmcs            EQU         (.Guest.hwvirt.vmx + 0x1000)
    251 
    252     ;.unnamed_padding.1 resb 0
     238    .Guest.hwvirt.svm.Vmcb                  EQU         .Guest.hwvirt.svm
     239    .Guest.hwvirt.svm.abMsrBitmap           EQU         (.Guest.hwvirt.svm.Vmcb                   + 0x1000)
     240    .Guest.hwvirt.svm.abIoBitmap            EQU         (.Guest.hwvirt.svm.abMsrBitmap            + 0x2000)
     241    .Guest.hwvirt.svm.uMsrHSavePa           EQU         (.Guest.hwvirt.svm.abIoBitmap             + 0x3000)   ; resq        1
     242    .Guest.hwvirt.svm.GCPhysVmcb            EQU         (.Guest.hwvirt.svm.uMsrHSavePa            + 8)        ; resq        1
     243    alignb 8
     244    .Guest.hwvirt.svm.HostState             EQU         (.Guest.hwvirt.svm.GCPhysVmcb             + 8)        ; resb        184
     245    .Guest.hwvirt.svm.uPrevPauseTick        EQU         (.Guest.hwvirt.svm.HostState              + 184)      ; resq        1
     246    .Guest.hwvirt.svm.cPauseFilter          EQU         (.Guest.hwvirt.svm.uPrevPauseTick         + 8)        ; resw        1
     247    .Guest.hwvirt.svm.cPauseFilterThreshold EQU         (.Guest.hwvirt.svm.cPauseFilter           + 2)        ; resw        1
     248    .Guest.hwvirt.svm.fInterceptEvents      EQU         (.Guest.hwvirt.svm.cPauseFilterThreshold  + 2)        ; resb        1
     249
     250    .Guest.hwvirt.vmx.Vmcs                  resb        0x1000
     251    .Guest.hwvirt.vmx.ShadowVmcs            resb        0x1000
     252    .Guest.hwvirt.vmx.abVmreadBitmap        resb        0x1000
     253    .Guest.hwvirt.vmx.abVmwriteBitmap       resb        0x1000
     254    .Guest.hwvirt.vmx.aEntryMsrLoadArea     resb        0x2000
     255    .Guest.hwvirt.vmx.aExitMsrStoreArea     resb        0x2000
     256    .Guest.hwvirt.vmx.aExitMsrLoadArea      resb        0x2000
     257    alignb 8
     258    .Guest.hwvirt.vmx.GCPhysVmxon           resq        1
     259    .Guest.hwvirt.vmx.GCPhysVmcs            resq        1
     260    .Guest.hwvirt.vmx.GCPhysShadowVmcs      resq        1
     261    .Guest.hwvirt.vmx.enmDiag               resd        1
     262    .Guest.hwvirt.vmx.enmAbort              resd        1
     263    .Guest.hwvirt.vmx.uDiagAux              resq        1
     264    .Guest.hwvirt.vmx.uAbortAux             resd        1
     265    .Guest.hwvirt.vmx.fInVmxRootMode        resb        1
     266    .Guest.hwvirt.vmx.fInVmxNonRootMode     resb        1
     267    .Guest.hwvirt.vmx.fInterceptEvents      resb        1
     268    .Guest.hwvirt.vmx.fNmiUnblockingIret    resb        1
     269    .Guest.hwvirt.vmx.pvVirtApicPageR0      resq        1
     270    .Guest.hwvirt.vmx.pvVirtApicPageR3      resq        1
     271    .Guest.hwvirt.vmx.pvMsrBitmapR0         resq        1
     272    .Guest.hwvirt.vmx.pvMsrBitmapR3         resq        1
     273    .Guest.hwvirt.vmx.pvIoBitmapR0          resq        1
     274    .Guest.hwvirt.vmx.pvIoBitmapR3          resq        1
     275    .Guest.hwvirt.vmx.uFirstPauseLoopTick   resq        1
     276    .Guest.hwvirt.vmx.uPrevPauseTick        resq        1
     277    .Guest.hwvirt.vmx.uEntryTick            resq        1
     278    .Guest.hwvirt.vmx.offVirtApicWrite      resw        1
     279    .Guest.hwvirt.vmx.fVirtNmiBlocking      resb        1
     280    alignb 8
     281    .Guest.hwvirt.vmx.Msrs                  resb        224
     282    .Guest.hwvirt.vmx.HCPhysVirtApicPage    resq        1
     283
    253284    alignb 8
    254285    .Guest.hwvirt.enmHwvirt                 resd        1
  • trunk/src/VBox/VMM/testcase/tstVMStruct.h

    r91298 r91301  
    150150    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVirtApicPageR0);
    151151    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVirtApicPageR3);
    152     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVmreadBitmapR0);
    153     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVmreadBitmapR3);
    154     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVmwriteBitmapR0);
    155     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVmwriteBitmapR3);
    156     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pEntryMsrLoadAreaR0);
    157     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pEntryMsrLoadAreaR3);
    158     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pExitMsrStoreAreaR0);
    159     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pExitMsrStoreAreaR3);
    160     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pExitMsrLoadAreaR0);
    161     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pExitMsrLoadAreaR3);
    162152    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvMsrBitmapR0);
    163153    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvMsrBitmapR3);
  • trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp

    r91298 r91301  
    254254    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.Vmcs, 4096);
    255255    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.ShadowVmcs, 4096);
     256    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.abVmreadBitmap, 4096);
     257    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.abVmwriteBitmap, 4096);
     258    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.aEntryMsrLoadArea, 4096);
     259    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.aExitMsrStoreArea, 4096);
     260    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.aExitMsrLoadArea, 4096);
    256261
    257262    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