VirtualBox

Changeset 74542 in vbox for trunk


Ignore:
Timestamp:
Oct 1, 2018 5:42:25 AM (6 years ago)
Author:
vboxsync
Message:

VMM/CPUM, IEM: Nested VMX: bugref:9180 Preparation of MSR bitmaps for MSR intercepts.

Location:
trunk
Files:
6 edited

Legend:

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

    r74479 r74542  
    634634                uint32_t                uAutoMsrAreaR3;
    635635#endif
    636                 /** 0x368 - Padding. */
    637                 uint8_t             abPadding[0x3f0 - 0x368];
     636                /** 0x368 - The MSR bitmap - R0 ptr. */
     637                R0PTRTYPE(void *)       pvMsrBitmapR0;
     638#if HC_ARCH_BITS == 32
     639                uint32_t                uMsrBitmapR0;
     640#endif
     641                /** 0x370 - The MSR bitmap - R3 ptr. */
     642                R3PTRTYPE(void *)       pvMsrBitmapR3;
     643#if HC_ARCH_BITS == 32
     644                uint32_t                uMsrBitmapR3;
     645#endif
     646                /** 0x378 - Padding. */
     647                uint8_t             abPadding[0x3f0 - 0x378];
    638648            } vmx;
    639649        } CPUM_UNION_NM(s);
     
    741751AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR0, 8);
    742752AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pAutoMsrAreaR0,    8);
     753AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvMsrBitmapR0,     8);
    743754AssertCompileMemberOffset(CPUMCTX, hwvirt.enmHwvirt,           0x3f0);
    744755AssertCompileMemberOffset(CPUMCTX, hwvirt.fLocalForcedActions, 0x3f4);
  • trunk/include/VBox/vmm/hm_vmx.h

    r74523 r74542  
    30253025/** The size of the VMREAD/VMWRITE-bitmap (in pages). */
    30263026#define VMX_V_VMREAD_VMWRITE_BITMAP_PAGES                       1
     3027
     3028/** The size of the MSR bitmap (in bytes). */
     3029#define VMX_V_MSR_BITMAP_SIZE                                   X86_PAGE_4K_SIZE
     3030/** The size of the MSR bitmap (in pages). */
     3031#define VMX_V_MSR_BITMAP_PAGES                                  1
    30273032
    30283033/** The size of the auto-load/store MSR area (in bytes). */
     
    38243829    kVmxVDiag_Vmentry_HostSysenterEspEip,
    38253830    kVmxVDiag_Vmentry_LongModeCS,
     3831    kVmxVDiag_Vmentry_MsrBitmapPtrReadPhys,
    38263832    kVmxVDiag_Vmentry_MsrLoad,
    38273833    kVmxVDiag_Vmentry_MsrLoadCount,
  • trunk/src/VBox/VMM/VMMAll/HMVMXAll.cpp

    r74523 r74542  
    310310    VMXV_DIAG_DESC(kVmxVDiag_Vmentry_HostSysenterEspEip       , "HostSysenterEspEip"        ),
    311311    VMXV_DIAG_DESC(kVmxVDiag_Vmentry_LongModeCS               , "LongModeCS"                ),
     312    VMXV_DIAG_DESC(kVmxVDiag_Vmentry_MsrBitmapPtrReadPhys     , "MsrBitmapPtrReadPhys"      ),
    312313    VMXV_DIAG_DESC(kVmxVDiag_Vmentry_MsrLoad                  , "MsrLoad"                   ),
    313314    VMXV_DIAG_DESC(kVmxVDiag_Vmentry_MsrLoadCount             , "MsrLoadCount"              ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h

    r74541 r74542  
    41334133    if (pVmcs->u32ProcCtls & VMX_PROC_CTLS_USE_MSR_BITMAPS)
    41344134    {
    4135         if (   (pVmcs->u64AddrMsrBitmap.u & X86_PAGE_4K_OFFSET_MASK)
    4136             || (pVmcs->u64AddrMsrBitmap.u >> IEM_GET_GUEST_CPU_FEATURES(pVCpu)->cVmxMaxPhysAddrWidth)
    4137             || !PGMPhysIsGCPhysNormal(pVCpu->CTX_SUFF(pVM), pVmcs->u64AddrMsrBitmap.u))
     4135        RTGCPHYS const GCPhysMsrBitmap = pVmcs->u64AddrMsrBitmap.u;
     4136        if (   (GCPhysMsrBitmap & X86_PAGE_4K_OFFSET_MASK)
     4137            || (GCPhysMsrBitmap >> IEM_GET_GUEST_CPU_FEATURES(pVCpu)->cVmxMaxPhysAddrWidth)
     4138            || !PGMPhysIsGCPhysNormal(pVCpu->CTX_SUFF(pVM), GCPhysMsrBitmap))
    41384139            IEM_VMX_VMENTRY_FAILED_RET(pVCpu, pszInstr, pszFailure, kVmxVDiag_Vmentry_AddrMsrBitmap);
     4140
     4141        /* Read the MSR bitmap. */
     4142        Assert(pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pvMsrBitmap));
     4143        int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pvMsrBitmap),
     4144                                         GCPhysMsrBitmap, VMX_V_MSR_BITMAP_SIZE);
     4145        if (RT_FAILURE(rc))
     4146            IEM_VMX_VMENTRY_FAILED_RET(pVCpu, pszInstr, pszFailure, kVmxVDiag_Vmentry_MsrBitmapPtrReadPhys);
    41394147    }
    41404148
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r74512 r74542  
    954954            pVCpu->cpum.s.Guest.hwvirt.vmx.pAutoMsrAreaR3 = NULL;
    955955        }
     956        if (pVCpu->cpum.s.Guest.hwvirt.vmx.pvMsrBitmapR3)
     957        {
     958            SUPR3PageFreeEx(pVCpu->cpum.s.Guest.hwvirt.vmx.pvMsrBitmapR3, VMX_V_MSR_BITMAP_PAGES);
     959            pVCpu->cpum.s.Guest.hwvirt.vmx.pvMsrBitmapR3 = NULL;
     960        }
    956961    }
    957962}
     
    10361041         */
    10371042        Assert(!pVCpu->cpum.s.Guest.hwvirt.vmx.pAutoMsrAreaR3);
    1038         rc = SUPR3PageAllocEx(VMX_V_AUTOMSR_AREA_PAGES, 0 /* fFlags */,
    1039                               (void **)&pVCpu->cpum.s.Guest.hwvirt.vmx.pAutoMsrAreaR3,
     1043        rc = SUPR3PageAllocEx(VMX_V_AUTOMSR_AREA_PAGES, 0 /* fFlags */, (void **)&pVCpu->cpum.s.Guest.hwvirt.vmx.pAutoMsrAreaR3,
    10401044                              &pVCpu->cpum.s.Guest.hwvirt.vmx.pAutoMsrAreaR0, NULL /* paPages */);
    10411045        if (RT_FAILURE(rc))
     
    10441048            LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's auto-load/store MSR area\n", pVCpu->idCpu,
    10451049                    VMX_V_AUTOMSR_AREA_PAGES));
     1050            break;
     1051        }
     1052
     1053        /*
     1054         * Allocate the MSR bitmap.
     1055         */
     1056        Assert(!pVCpu->cpum.s.Guest.hwvirt.vmx.pvMsrBitmapR3);
     1057        rc = SUPR3PageAllocEx(VMX_V_MSR_BITMAP_PAGES, 0 /* fFlags */, (void **)&pVCpu->cpum.s.Guest.hwvirt.vmx.pvMsrBitmapR3,
     1058                              &pVCpu->cpum.s.Guest.hwvirt.vmx.pvMsrBitmapR0, NULL /* paPages */);
     1059        if (RT_FAILURE(rc))
     1060        {
     1061            Assert(!pVCpu->cpum.s.Guest.hwvirt.vmx.pvMsrBitmapR3);
     1062            LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's MSR bitmap\n", pVCpu->idCpu,
     1063                    VMX_V_MSR_BITMAP_PAGES));
    10461064            break;
    10471065        }
  • trunk/src/VBox/VMM/testcase/tstVMStruct.h

    r74479 r74542  
    166166    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pAutoMsrAreaR0);
    167167    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pAutoMsrAreaR3);
     168    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvMsrBitmapR0);
     169    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvMsrBitmapR3);
    168170    GEN_CHECK_OFF(CPUMCTX, hwvirt.enmHwvirt);
    169171    GEN_CHECK_OFF(CPUMCTX, hwvirt.fLocalForcedActions);
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