VirtualBox

Changeset 79572 in vbox


Ignore:
Timestamp:
Jul 7, 2019 9:22:30 AM (5 years ago)
Author:
vboxsync
Message:

VMM: Nested VMX: bugref:9180 Use a separate HC page for the guest's virtual-APIC page.

Location:
trunk
Files:
4 edited

Legend:

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

    r78632 r79572  
    601601                uint32_t                uShadowVmcsR3Padding;
    602602#endif
    603                 /** 0x328 - Reserved - R0 ptr. */
    604                 R0PTRTYPE(void *)       pvRsvdR0;
    605 #if HC_ARCH_BITS == 32
    606                 uint32_t                uRsvdR0Padding0;
    607 #endif
    608                 /** 0x330 - Reserved - R3 ptr. */
    609                 R3PTRTYPE(void *)       pvRsvdR3;
    610 #if HC_ARCH_BITS == 32
    611                 uint32_t                uRsvdR3Padding0;
     603                /** 0x328 - The virtual-APIC page - R0 ptr. */
     604                R0PTRTYPE(void *)       pvVirtApicPageR0;
     605#if HC_ARCH_BITS == 32
     606                uint32_t                uVirtApicPageR0Padding;
     607#endif
     608                /** 0x330 - The virtual-APIC page - R3 ptr. */
     609                R3PTRTYPE(void *)       pvVirtApicPageR3;
     610#if HC_ARCH_BITS == 32
     611                uint32_t                uVirtApicPageR3Padding;
    612612#endif
    613613                /** 0x338 - The VMREAD bitmap - R0 ptr. */
     
    692692                /** 0x3c2 - Whether virtual-NMI blocking is in effect. */
    693693                bool                    fVirtNmiBlocking;
    694                 /** 0x3c3 - Padding. */
    695                 uint8_t                 abPadding0[5];
     694                /** 0x3c3 - Whether the virtual-APIC may have been modified in VMX non-root
     695                 *  operation and we should write to it before VM-exit. */
     696                bool                    fVirtApicPageDirty;
     697                /** 0x3c4 - Padding. */
     698                uint8_t                 abPadding0[4];
    696699                /** 0x3c8 - Guest VMX MSRs. */
    697700                VMXMSRS                 Msrs;
     
    701704                RTHCPHYS                HCPhysShadowVmcs;
    702705                /** 0x4b8 - Host physical address of the virtual-APIC page. */
    703                 RTHCPHYS                HCPhysRsvd0;
     706                RTHCPHYS                HCPhysVirtApicPage;
    704707                /** 0x4c0 - Host physical address of the VMREAD bitmap. */
    705708                RTHCPHYS                HCPhysVmreadBitmap;
     
    814817AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR0,               0x318);
    815818AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR3,               0x320);
     819AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVirtApicPageR0,            0x328);
     820AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVirtApicPageR3,            0x330);
    816821AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR0,            0x338);
    817822AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR3,            0x340);
     
    833838AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.offVirtApicWrite,            0x3c0);
    834839AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fVirtNmiBlocking,            0x3c2);
     840AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fVirtApicPageDirty,          0x3c3);
    835841AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.Msrs,                        0x3c8);
    836842AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysVmcs,                  0x4a8);
    837843AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysShadowVmcs,            0x4b0);
     844AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysVirtApicPage,          0x4b8);
    838845AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysVmreadBitmap,          0x4c0);
    839846AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysVmwriteBitmap,         0x4c8);
  • trunk/src/VBox/VMM/VMMAll/HMVMXAll.cpp

    r79345 r79572  
    370370    VMXV_DIAG_DESC(kVmxVDiag_Vmexit_MsrStorePtrWritePhys      , "MsrStorePtrWritePhys"      ),
    371371    VMXV_DIAG_DESC(kVmxVDiag_Vmexit_MsrStoreRing3             , "MsrStoreRing3"             ),
    372     VMXV_DIAG_DESC(kVmxVDiag_Vmexit_MsrStoreRsvd              , "MsrStoreRsvd"              )
     372    VMXV_DIAG_DESC(kVmxVDiag_Vmexit_MsrStoreRsvd              , "MsrStoreRsvd"              ),
     373    VMXV_DIAG_DESC(kVmxVDiag_Vmexit_VirtApicPagePtrWritePhys  , "VirtApicPagePtrWritePhys"  )
    373374    /* kVmxVDiag_End */
    374375};
     
    925926    LogRel(("offVirtApicWrite           = %#RX16\n",    pCtx->hwvirt.vmx.offVirtApicWrite));
    926927    LogRel(("fVirtNmiBlocking           = %RTbool\n",   pCtx->hwvirt.vmx.fVirtNmiBlocking));
     928    LogRel(("fVirtApicPageDirty         = %RTbool\n",   pCtx->hwvirt.vmx.fVirtApicPageDirty));
    927929    LogRel(("VMCS cache:\n"));
    928930
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r79528 r79572  
    11401140            pCtx->hwvirt.vmx.pShadowVmcsR3 = NULL;
    11411141        }
     1142        if (pCtx->hwvirt.vmx.pvVirtApicPageR3)
     1143        {
     1144            SUPR3ContFree(pCtx->hwvirt.vmx.pvVirtApicPageR3, VMX_V_VIRT_APIC_PAGES);
     1145            pCtx->hwvirt.vmx.pvVirtApicPageR3 = NULL;
     1146        }
    11421147        if (pCtx->hwvirt.vmx.pvVmreadBitmapR3)
    11431148        {
     
    12311236
    12321237        /*
     1238         * Allocate the virtual-APIC page.
     1239         */
     1240        pCtx->hwvirt.vmx.pvVirtApicPageR3 = SUPR3ContAlloc(VMX_V_VIRT_APIC_PAGES,
     1241                                                           &pCtx->hwvirt.vmx.pvVirtApicPageR0,
     1242                                                           &pCtx->hwvirt.vmx.HCPhysVirtApicPage);
     1243        if (pCtx->hwvirt.vmx.pvVirtApicPageR3)
     1244        { /* likely */ }
     1245        else
     1246        {
     1247            LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's virtual-APIC page\n", pVCpu->idCpu,
     1248                    VMX_V_VIRT_APIC_PAGES));
     1249            break;
     1250        }
     1251
     1252        /*
    12331253         * Allocate the VMREAD-bitmap.
    12341254         */
     
    13401360        memset(pCtx->hwvirt.vmx.CTX_SUFF(pVmcs),               0, VMX_V_VMCS_SIZE);
    13411361        memset(pCtx->hwvirt.vmx.CTX_SUFF(pShadowVmcs),         0, VMX_V_SHADOW_VMCS_SIZE);
     1362        memset(pCtx->hwvirt.vmx.CTX_SUFF(pvVirtApicPage),      0, VMX_V_VIRT_APIC_SIZE);
    13421363        memset(pCtx->hwvirt.vmx.CTX_SUFF(pvVmreadBitmap),      0, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
    13431364        memset(pCtx->hwvirt.vmx.CTX_SUFF(pvVmwriteBitmap),     0, VMX_V_VMREAD_VMWRITE_BITMAP_SIZE);
     
    26272648            SSMR3PutU16(pSSM,      pGstCtx->hwvirt.vmx.offVirtApicWrite);
    26282649            SSMR3PutBool(pSSM,     pGstCtx->hwvirt.vmx.fVirtNmiBlocking);
     2650            SSMR3PutBool(pSSM,     pGstCtx->hwvirt.vmx.fVirtApicPageDirty);
    26292651            SSMR3PutU64(pSSM,      pGstCtx->hwvirt.vmx.Msrs.u64FeatCtrl);
    26302652            SSMR3PutU64(pSSM,      pGstCtx->hwvirt.vmx.Msrs.u64Basic);
     
    29182940                        SSMR3GetU16(pSSM,      &pGstCtx->hwvirt.vmx.offVirtApicWrite);
    29192941                        SSMR3GetBool(pSSM,     &pGstCtx->hwvirt.vmx.fVirtNmiBlocking);
     2942                        SSMR3GetBool(pSSM,     &pGstCtx->hwvirt.vmx.fVirtApicPageDirty);
    29202943                        SSMR3GetU64(pSSM,      &pGstCtx->hwvirt.vmx.Msrs.u64FeatCtrl);
    29212944                        SSMR3GetU64(pSSM,      &pGstCtx->hwvirt.vmx.Msrs.u64Basic);
     
    41094132        pHlp->pfnPrintf(pHlp, "  offVirtApicWrite           = %#RX16\n",    pCtx->hwvirt.vmx.offVirtApicWrite);
    41104133        pHlp->pfnPrintf(pHlp, "  fVirtNmiBlocking           = %RTbool\n",   pCtx->hwvirt.vmx.fVirtNmiBlocking);
     4134        pHlp->pfnPrintf(pHlp, "  fVirtApicPageDirty         = %RTbool\n",   pCtx->hwvirt.vmx.fVirtApicPageDirty);
    41114135        pHlp->pfnPrintf(pHlp, "  VMCS cache:\n");
    41124136        cpumR3InfoVmxVmcs(pHlp, pCtx->hwvirt.vmx.pVmcsR3, "  " /* pszPrefix */);
  • trunk/src/VBox/VMM/testcase/tstVMStruct.h

    r78220 r79572  
    159159    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pShadowVmcsR0);
    160160    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pShadowVmcsR3);
     161    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVirtApicPageR0);
     162    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVirtApicPageR3);
    161163    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVmreadBitmapR0);
    162164    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVmreadBitmapR3);
     
    178180    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.offVirtApicWrite);
    179181    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.fVirtNmiBlocking);
     182    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.fVirtApicPageDirty);
    180183    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.Msrs);
    181184    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.HCPhysVmcs);
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