VirtualBox

Changeset 87531 in vbox for trunk/src


Ignore:
Timestamp:
Feb 2, 2021 11:39:13 AM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
142557
Message:

VMM/HMVMX: Moving more stuff to HMR0PERVM. bugref:9217

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r87530 r87531  
    19801980    if (pVM->hm.s.vmx.fUseVmcsShadowing)
    19811981    {
    1982         RTMemFree(pVM->hm.s.vmx.paShadowVmcsFields);
    1983         pVM->hm.s.vmx.paShadowVmcsFields = NULL;
    1984         RTMemFree(pVM->hm.s.vmx.paShadowVmcsRoFields);
    1985         pVM->hm.s.vmx.paShadowVmcsRoFields = NULL;
     1982        RTMemFree(pVM->hmr0.s.vmx.paShadowVmcsFields);
     1983        pVM->hmr0.s.vmx.paShadowVmcsFields = NULL;
     1984        RTMemFree(pVM->hmr0.s.vmx.paShadowVmcsRoFields);
     1985        pVM->hmr0.s.vmx.paShadowVmcsRoFields = NULL;
    19861986    }
    19871987#endif
     
    20312031    VMXPAGEALLOCINFO aAllocInfo[] =
    20322032    {
    2033         { fVirtApicAccess,   0 /* Unused */, &pVM->hm.s.vmx.HCPhysApicAccess,    (PRTR0PTR)&pVM->hm.s.vmx.pbApicAccess },
    2034         { fUseVmcsShadowing, 0 /* Unused */, &pVM->hm.s.vmx.HCPhysVmreadBitmap,  &pVM->hm.s.vmx.pvVmreadBitmap         },
    2035         { fUseVmcsShadowing, 0 /* Unused */, &pVM->hm.s.vmx.HCPhysVmwriteBitmap, &pVM->hm.s.vmx.pvVmwriteBitmap        },
     2033        { fVirtApicAccess,   0 /* Unused */, &pVM->hmr0.s.vmx.HCPhysApicAccess,    (PRTR0PTR)&pVM->hmr0.s.vmx.pbApicAccess },
     2034        { fUseVmcsShadowing, 0 /* Unused */, &pVM->hmr0.s.vmx.HCPhysVmreadBitmap,  &pVM->hmr0.s.vmx.pvVmreadBitmap         },
     2035        { fUseVmcsShadowing, 0 /* Unused */, &pVM->hmr0.s.vmx.HCPhysVmwriteBitmap, &pVM->hmr0.s.vmx.pvVmwriteBitmap        },
    20362036#ifdef VBOX_WITH_CRASHDUMP_MAGIC
    2037         { true,              0 /* Unused */, &pVM->hm.s.vmx.HCPhysScratch,       &(PRTR0PTR)pVM->hm.s.vmx.pbScratch    },
     2037        { true,              0 /* Unused */, &pVM->hmr0.s.vmx.HCPhysScratch,       (PRTR0PTR)&pVM->hmr0.s.vmx.pbScratch    },
    20382038#endif
    20392039    };
     
    20462046        if (fUseVmcsShadowing)
    20472047        {
    2048             Assert(!pVM->hm.s.vmx.cShadowVmcsFields);
    2049             Assert(!pVM->hm.s.vmx.cShadowVmcsRoFields);
    2050             pVM->hm.s.vmx.paShadowVmcsFields   = (uint32_t *)RTMemAllocZ(sizeof(g_aVmcsFields));
    2051             pVM->hm.s.vmx.paShadowVmcsRoFields = (uint32_t *)RTMemAllocZ(sizeof(g_aVmcsFields));
    2052             if (!pVM->hm.s.vmx.paShadowVmcsFields || !pVM->hm.s.vmx.paShadowVmcsRoFields)
     2048            Assert(!pVM->hmr0.s.vmx.cShadowVmcsFields);
     2049            Assert(!pVM->hmr0.s.vmx.cShadowVmcsRoFields);
     2050            pVM->hmr0.s.vmx.paShadowVmcsFields   = (uint32_t *)RTMemAllocZ(sizeof(g_aVmcsFields));
     2051            pVM->hmr0.s.vmx.paShadowVmcsRoFields = (uint32_t *)RTMemAllocZ(sizeof(g_aVmcsFields));
     2052            if (!pVM->hmr0.s.vmx.paShadowVmcsFields || !pVM->hmr0.s.vmx.paShadowVmcsRoFields)
    20532053                rc = VERR_NO_MEMORY;
    20542054        }
     
    20862086{
    20872087    /* Paranoia. */
    2088     Assert(pVM->hm.s.vmx.pbApicAccess == NULL);
     2088    Assert(pVM->hmr0.s.vmx.pbApicAccess == NULL);
    20892089#ifdef VBOX_WITH_CRASHDUMP_MAGIC
    2090     Assert(pVM->hm.s.vmx.pbScratch == NULL);
     2090    Assert(pVM->hmr0.s.vmx.pbScratch == NULL);
    20912091#endif
    20922092
     
    20952095     */
    20962096#ifdef VBOX_WITH_CRASHDUMP_MAGIC
    2097     pVM->hm.s.vmx.HCPhysScratch = NIL_RTHCPHYS;
     2097    pVM->hmr0.s.vmx.HCPhysScratch      = NIL_RTHCPHYS;
    20982098#endif
    2099     pVM->hm.s.vmx.HCPhysApicAccess    = NIL_RTHCPHYS;
    2100     pVM->hm.s.vmx.HCPhysVmreadBitmap  = NIL_RTHCPHYS;
    2101     pVM->hm.s.vmx.HCPhysVmwriteBitmap = NIL_RTHCPHYS;
     2099    pVM->hmr0.s.vmx.HCPhysApicAccess    = NIL_RTHCPHYS;
     2100    pVM->hmr0.s.vmx.HCPhysVmreadBitmap  = NIL_RTHCPHYS;
     2101    pVM->hmr0.s.vmx.HCPhysVmwriteBitmap = NIL_RTHCPHYS;
    21022102    for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
    21032103    {
     
    35443544            if (   fGstVmwriteAll
    35453545                || !VMXIsVmcsFieldReadOnly(VmcsField.u))
    3546                 pVM->hm.s.vmx.paShadowVmcsFields[cRwFields++] = VmcsField.u;
     3546                pVM->hmr0.s.vmx.paShadowVmcsFields[cRwFields++] = VmcsField.u;
    35473547            else
    3548                 pVM->hm.s.vmx.paShadowVmcsRoFields[cRoFields++] = VmcsField.u;
     3548                pVM->hmr0.s.vmx.paShadowVmcsRoFields[cRoFields++] = VmcsField.u;
    35493549        }
    35503550    }
    35513551
    35523552    /* Update the counts. */
    3553     pVM->hm.s.vmx.cShadowVmcsFields   = cRwFields;
    3554     pVM->hm.s.vmx.cShadowVmcsRoFields = cRoFields;
     3553    pVM->hmr0.s.vmx.cShadowVmcsFields   = cRwFields;
     3554    pVM->hmr0.s.vmx.cShadowVmcsRoFields = cRoFields;
    35553555    return VINF_SUCCESS;
    35563556}
     
    35683568     */
    35693569    uint32_t const cbBitmap        = X86_PAGE_4K_SIZE;
    3570     uint8_t       *pbVmreadBitmap  = (uint8_t *)pVM->hm.s.vmx.pvVmreadBitmap;
    3571     uint8_t       *pbVmwriteBitmap = (uint8_t *)pVM->hm.s.vmx.pvVmwriteBitmap;
     3570    uint8_t       *pbVmreadBitmap  = (uint8_t *)pVM->hmr0.s.vmx.pvVmreadBitmap;
     3571    uint8_t       *pbVmwriteBitmap = (uint8_t *)pVM->hmr0.s.vmx.pvVmwriteBitmap;
    35723572    ASMMemFill32(pbVmreadBitmap,  cbBitmap, UINT32_C(0xffffffff));
    35733573    ASMMemFill32(pbVmwriteBitmap, cbBitmap, UINT32_C(0xffffffff));
     
    35783578     */
    35793579    {
    3580         uint32_t const *paShadowVmcsFields = pVM->hm.s.vmx.paShadowVmcsFields;
    3581         uint32_t const  cShadowVmcsFields  = pVM->hm.s.vmx.cShadowVmcsFields;
     3580        uint32_t const *paShadowVmcsFields = pVM->hmr0.s.vmx.paShadowVmcsFields;
     3581        uint32_t const  cShadowVmcsFields  = pVM->hmr0.s.vmx.cShadowVmcsFields;
    35823582        for (uint32_t i = 0; i < cShadowVmcsFields; i++)
    35833583        {
     
    35963596    if (pVM->hm.s.vmx.Msrs.u64Misc & VMX_MISC_VMWRITE_ALL)
    35973597    {
    3598         uint32_t const *paShadowVmcsRoFields = pVM->hm.s.vmx.paShadowVmcsRoFields;
    3599         uint32_t const  cShadowVmcsRoFields  = pVM->hm.s.vmx.cShadowVmcsRoFields;
     3598        uint32_t const *paShadowVmcsRoFields = pVM->hmr0.s.vmx.paShadowVmcsRoFields;
     3599        uint32_t const  cShadowVmcsRoFields  = pVM->hmr0.s.vmx.cShadowVmcsRoFields;
    36003600        for (uint32_t i = 0; i < cShadowVmcsRoFields; i++)
    36013601        {
     
    36473647DECLINLINE(void) hmR0VmxSetupVmcsApicAccessAddr(PVMCPUCC pVCpu)
    36483648{
    3649     RTHCPHYS const HCPhysApicAccess = pVCpu->CTX_SUFF(pVM)->hm.s.vmx.HCPhysApicAccess;
     3649    RTHCPHYS const HCPhysApicAccess = pVCpu->CTX_SUFF(pVM)->hmr0.s.vmx.HCPhysApicAccess;
    36503650    Assert(HCPhysApicAccess != NIL_RTHCPHYS);
    36513651    Assert(!(HCPhysApicAccess & 0xfff));                     /* Bits 11:0 MBZ. */
     
    36633663DECLINLINE(void) hmR0VmxSetupVmcsVmreadBitmapAddr(PVMCPUCC pVCpu)
    36643664{
    3665     RTHCPHYS const HCPhysVmreadBitmap = pVCpu->CTX_SUFF(pVM)->hm.s.vmx.HCPhysVmreadBitmap;
     3665    RTHCPHYS const HCPhysVmreadBitmap = pVCpu->CTX_SUFF(pVM)->hmr0.s.vmx.HCPhysVmreadBitmap;
    36663666    Assert(HCPhysVmreadBitmap != NIL_RTHCPHYS);
    36673667    Assert(!(HCPhysVmreadBitmap & 0xfff));                     /* Bits 11:0 MBZ. */
     
    36783678DECLINLINE(void) hmR0VmxSetupVmcsVmwriteBitmapAddr(PVMCPUCC pVCpu)
    36793679{
    3680     RTHCPHYS const HCPhysVmwriteBitmap = pVCpu->CTX_SUFF(pVM)->hm.s.vmx.HCPhysVmwriteBitmap;
     3680    RTHCPHYS const HCPhysVmwriteBitmap = pVCpu->CTX_SUFF(pVM)->hmr0.s.vmx.HCPhysVmwriteBitmap;
    36813681    Assert(HCPhysVmwriteBitmap != NIL_RTHCPHYS);
    36823682    Assert(!(HCPhysVmwriteBitmap & 0xfff));                     /* Bits 11:0 MBZ. */
     
    44534453    /* Setup the crash dump page. */
    44544454#ifdef VBOX_WITH_CRASHDUMP_MAGIC
    4455     strcpy((char *)pVM->hm.s.vmx.pbScratch, "SCRATCH Magic");
    4456     *(uint64_t *)(pVM->hm.s.vmx.pbScratch + 16) = UINT64_C(0xdeadbeefdeadbeef);
     4455    strcpy((char *)pVM->hmr0.s.vmx.pbScratch, "SCRATCH Magic");
     4456    *(uint64_t *)(pVM->hmr0.s.vmx.pbScratch + 16) = UINT64_C(0xdeadbeefdeadbeef);
    44574457#endif
    44584458    return VINF_SUCCESS;
     
    44724472
    44734473#ifdef VBOX_WITH_CRASHDUMP_MAGIC
    4474     if (pVM->hm.s.vmx.hMemObjScratch != NIL_RTR0MEMOBJ)
    4475     {
    4476         Assert(pVM->hm.s.vmx.pvScratch);
    4477         ASMMemZero32(pVM->hm.s.vmx.pvScratch, X86_PAGE_4K_SIZE);
    4478     }
     4474    if (pVM->hmr0.s.vmx.pbScratch)
     4475        RT_BZERO(pVM->hmr0.s.vmx.pbScratch, X86_PAGE_4K_SIZE);
    44794476#endif
    44804477    hmR0VmxStructsFree(pVM);
     
    54365433         * like hardware errors.
    54375434         */
    5438         uint32_t const cShadowVmcsFields = pVM->hm.s.vmx.cShadowVmcsFields;
     5435        uint32_t const cShadowVmcsFields = pVM->hmr0.s.vmx.cShadowVmcsFields;
    54395436        for (uint32_t i = 0; i < cShadowVmcsFields; i++)
    54405437        {
    54415438            uint64_t       u64Val;
    5442             uint32_t const uVmcsField = pVM->hm.s.vmx.paShadowVmcsFields[i];
     5439            uint32_t const uVmcsField = pVM->hmr0.s.vmx.paShadowVmcsFields[i];
    54435440            IEMReadVmxVmcsField(pVmcsNstGst, uVmcsField, &u64Val);
    54445441            VMXWriteVmcs64(uVmcsField, u64Val);
     
    54515448        if (pVM->hm.s.vmx.Msrs.u64Misc & VMX_MISC_VMWRITE_ALL)
    54525449        {
    5453             uint32_t const cShadowVmcsRoFields = pVM->hm.s.vmx.cShadowVmcsRoFields;
     5450            uint32_t const cShadowVmcsRoFields = pVM->hmr0.s.vmx.cShadowVmcsRoFields;
    54545451            for (uint32_t i = 0; i < cShadowVmcsRoFields; i++)
    54555452            {
    54565453                uint64_t       u64Val;
    5457                 uint32_t const uVmcsField = pVM->hm.s.vmx.paShadowVmcsRoFields[i];
     5454                uint32_t const uVmcsField = pVM->hmr0.s.vmx.paShadowVmcsRoFields[i];
    54585455                IEMReadVmxVmcsField(pVmcsNstGst, uVmcsField, &u64Val);
    54595456                VMXWriteVmcs64(uVmcsField, u64Val);
     
    54965493         * like hardware errors.
    54975494         */
    5498         uint32_t const cShadowVmcsFields = pVM->hm.s.vmx.cShadowVmcsFields;
     5495        uint32_t const cShadowVmcsFields = pVM->hmr0.s.vmx.cShadowVmcsFields;
    54995496        for (uint32_t i = 0; i < cShadowVmcsFields; i++)
    55005497        {
    55015498            uint64_t       u64Val;
    5502             uint32_t const uVmcsField = pVM->hm.s.vmx.paShadowVmcsFields[i];
     5499            uint32_t const uVmcsField = pVM->hmr0.s.vmx.paShadowVmcsFields[i];
    55035500            VMXReadVmcs64(uVmcsField, &u64Val);
    55045501            IEMWriteVmxVmcsField(pVmcsNstGst, uVmcsField, u64Val);
     
    1024310240
    1024410241    /* Map the HC APIC-access page in place of the MMIO page, also updates the shadow page tables if necessary. */
    10245     Assert(pVM->hm.s.vmx.HCPhysApicAccess != NIL_RTHCPHYS);
    10246     rc = IOMR0MmioMapMmioHCPage(pVM, pVCpu, GCPhysApicBase, pVM->hm.s.vmx.HCPhysApicAccess, X86_PTE_RW | X86_PTE_P);
     10242    Assert(pVM->hmr0.s.vmx.HCPhysApicAccess != NIL_RTHCPHYS);
     10243    rc = IOMR0MmioMapMmioHCPage(pVM, pVCpu, GCPhysApicBase, pVM->hmr0.s.vmx.HCPhysApicAccess, X86_PTE_RW | X86_PTE_P);
    1024710244    AssertRCReturn(rc, rc);
    1024810245
  • trunk/src/VBox/VMM/VMMR3/HM.cpp

    r87522 r87531  
    15381538    hmR3VmxReportCrFixedMsrs(&pVM->hm.s.vmx.Msrs);
    15391539
     1540#ifdef TODO_9217_VMCSINFO
    15401541    LogRel(("HM: APIC-access page physaddr         = %#RHp\n",  pVM->hm.s.vmx.HCPhysApicAccess));
    1541 #ifdef TODO_9217_VMCSINFO
    15421542    for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
    15431543    {
  • trunk/src/VBox/VMM/include/HMInternal.h

    r87530 r87531  
    506506        bool                        afPadding0;
    507507
    508         /** Virtual address of the APIC-access page. */
    509         R0PTRTYPE(uint8_t *)        pbApicAccess;
    510         /** Pointer to the VMREAD bitmap. */
    511         R0PTRTYPE(void *)           pvVmreadBitmap;
    512         /** Pointer to the VMWRITE bitmap. */
    513         R0PTRTYPE(void *)           pvVmwriteBitmap;
    514 
    515         /** Pointer to the shadow VMCS read-only fields array. */
    516         R0PTRTYPE(uint32_t *)       paShadowVmcsRoFields;
    517         /** Pointer to the shadow VMCS read/write fields array. */
    518         R0PTRTYPE(uint32_t *)       paShadowVmcsFields;
    519         /** Number of elements in the shadow VMCS read-only fields array. */
    520         uint32_t                    cShadowVmcsRoFields;
    521         /** Number of elements in the shadow VMCS read-write fields array. */
    522         uint32_t                    cShadowVmcsFields;
    523 
    524508        /** Tagged-TLB flush type. */
    525509        VMXTLBFLUSHTYPE             enmTlbFlushType;
     
    564548        uint32_t                    u32Alignment1;
    565549
     550        /** Host-physical address for a failing VMXON instruction. */
     551        RTHCPHYS                    HCPhysVmxEnableError;
     552
    566553        /** VMX MSR values. */
    567554        VMXMSRS                     Msrs;
    568555
    569         /** Host-physical address for a failing VMXON instruction. */
    570         RTHCPHYS                    HCPhysVmxEnableError;
    571         /** Host-physical address of the APIC-access page. */
    572         RTHCPHYS                    HCPhysApicAccess;
    573         /** Host-physical address of the VMREAD bitmap. */
    574         RTHCPHYS                    HCPhysVmreadBitmap;
    575         /** Host-physical address of the VMWRITE bitmap. */
    576         RTHCPHYS                    HCPhysVmwriteBitmap;
    577 #ifdef VBOX_WITH_CRASHDUMP_MAGIC
    578         /** Host-physical address of the crash-dump scratch area. */
    579         RTHCPHYS                    HCPhysScratch;
    580 #endif
    581 
    582 #ifdef VBOX_WITH_CRASHDUMP_MAGIC
    583         /** Pointer to the crash-dump scratch bitmap. */
    584         R0PTRTYPE(uint8_t *)        pbScratch;
    585 #endif
    586556        /** Virtual address of the TSS page used for real mode emulation. */
    587557        R3PTRTYPE(PVBOXTSS)         pRealModeTSS;
     
    679649    struct HMR0VMXVM
    680650    {
     651        /** Virtual address of the APIC-access page. */
     652        R0PTRTYPE(uint8_t *)        pbApicAccess;
     653        /** Pointer to the VMREAD bitmap. */
     654        R0PTRTYPE(void *)           pvVmreadBitmap;
     655        /** Pointer to the VMWRITE bitmap. */
     656        R0PTRTYPE(void *)           pvVmwriteBitmap;
     657
     658        /** Pointer to the shadow VMCS read-only fields array. */
     659        R0PTRTYPE(uint32_t *)       paShadowVmcsRoFields;
     660        /** Pointer to the shadow VMCS read/write fields array. */
     661        R0PTRTYPE(uint32_t *)       paShadowVmcsFields;
     662        /** Number of elements in the shadow VMCS read-only fields array. */
     663        uint32_t                    cShadowVmcsRoFields;
     664        /** Number of elements in the shadow VMCS read-write fields array. */
     665        uint32_t                    cShadowVmcsFields;
     666
     667        /** Host-physical address of the APIC-access page. */
     668        RTHCPHYS                    HCPhysApicAccess;
     669        /** Host-physical address of the VMREAD bitmap. */
     670        RTHCPHYS                    HCPhysVmreadBitmap;
     671        /** Host-physical address of the VMWRITE bitmap. */
     672        RTHCPHYS                    HCPhysVmwriteBitmap;
     673
     674#ifdef VBOX_WITH_CRASHDUMP_MAGIC
     675        /** Host-physical address of the crash-dump scratch area. */
     676        RTHCPHYS                    HCPhysScratch;
     677        /** Pointer to the crash-dump scratch bitmap. */
     678        R0PTRTYPE(uint8_t *)        pbScratch;
     679#endif
     680
    681681        /** Ring-0 memory object for per-VM VMX structures. */
    682682        RTR0MEMOBJ                  hMemObj;
    683 
    684683    } vmx;
    685684
Note: See TracChangeset for help on using the changeset viewer.

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