VirtualBox

Changeset 79572 in vbox for trunk/src/VBox/VMM


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

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

Location:
trunk/src/VBox/VMM
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • 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