VirtualBox

Changeset 101058 in vbox for trunk


Ignore:
Timestamp:
Sep 8, 2023 4:02:27 AM (13 months ago)
Author:
vboxsync
Message:

VMM: Nested VMX: bugref:10318 Pass only the final (leaf) SLAT PTE entry to (NestedSyncPageWorker) rather than the whole page-walk result.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r101002 r101058  
    5151# if defined(VBOX_WITH_NESTED_HWVIRT_VMX_EPT) && PGM_SHW_TYPE == PGM_TYPE_EPT
    5252static void PGM_BTH_NAME(NestedSyncPageWorker)(PVMCPUCC pVCpu, PSHWPTE pPte, RTGCPHYS GCPhysPage, PPGMPOOLPAGE pShwPage,
    53                                                unsigned iPte, PCPGMPTWALKGST pGstWalkAll);
     53                                               unsigned iPte, SLATPTE GstSlatPte);
    5454static int  PGM_BTH_NAME(NestedSyncPage)(PVMCPUCC pVCpu, RTGCPHYS GCPhysNestedPage, RTGCPHYS GCPhysPage, unsigned cPages,
    5555                                         uint32_t uErr, PPGMPTWALKGST pGstWalkAll);
     
    25802580 * @param   pShwPage        The shadow page of the page table.
    25812581 * @param   iPte            The index of the page table entry.
    2582  * @param   pGstWalkAll     The guest page table walk result.
     2582 * @param   pGstSlatPte     The guest SLAT page table entry.
    25832583 *
    25842584 * @note    Not to be used for 2/4MB pages!
    25852585 */
    25862586static void PGM_BTH_NAME(NestedSyncPageWorker)(PVMCPUCC pVCpu, PSHWPTE pPte, RTGCPHYS GCPhysPage, PPGMPOOLPAGE pShwPage,
    2587                                                unsigned iPte, PCPGMPTWALKGST pGstWalkAll)
     2587                                               unsigned iPte, SLATPTE GstSlatPte)
    25882588{
    2589     /*
    2590      * Do not make assumptions about anything other than the final PTE entry in the
    2591      * guest page table walk result. For instance, while mapping 2M PDEs as 4K pages,
    2592      * the PDE might still be having its leaf bit set.
    2593      *
    2594      * In the future, we could consider introducing a generic SLAT macro like PSLATPTE
    2595      * and using that instead of passing the full SLAT translation result.
    2596      */
    25972589    PGM_A20_ASSERT_MASKED(pVCpu, GCPhysPage);
    25982590    Assert(PGMPOOL_PAGE_IS_NESTED(pShwPage));
    25992591    Assert(!pShwPage->fDirty);
    26002592    Assert(pVCpu->pgm.s.enmGuestSlatMode == PGMSLAT_EPT);
    2601     AssertMsg(!(pGstWalkAll->u.Ept.Pte.u & EPT_E_LEAF), ("Large page unexpected: %RX64\n", pGstWalkAll->u.Ept.Pte.u));
    2602     AssertMsg((pGstWalkAll->u.Ept.Pte.u & EPT_PTE_PG_MASK) == GCPhysPage,
    2603               ("PTE address mismatch. GCPhysPage=%RGp Pte=%RX64\n", GCPhysPage, pGstWalkAll->u.Ept.Pte.u & EPT_PTE_PG_MASK));
     2593    AssertMsg(!(GstSlatPte.u & EPT_E_LEAF), ("Large page unexpected: %RX64\n", GstSlatPte.u));
     2594    AssertMsg((GstSlatPte.u & EPT_PTE_PG_MASK) == GCPhysPage,
     2595              ("PTE address mismatch. GCPhysPage=%RGp Pte=%RX64\n", GCPhysPage, GstSlatPte.u & EPT_PTE_PG_MASK));
    26042596
    26052597    /*
     
    26342626     */
    26352627    SHWPTE Pte;
    2636     uint64_t const fGstShwPteFlags = (pGstWalkAll->u.Ept.Pte.u & pVCpu->pgm.s.fGstEptShadowedPteMask)
     2628    uint64_t const fGstShwPteFlags = (GstSlatPte.u & pVCpu->pgm.s.fGstEptShadowedPteMask)
    26372629                                   | EPT_E_MEMTYPE_WB | EPT_E_IGNORE_PAT;
    26382630    if (!PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) || PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage))
     
    26422634        if (    PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM
    26432635            &&  (   PGM_PAGE_IS_ZERO(pPage)
    2644                  || (   (pGstWalkAll->u.Ept.Pte.u & EPT_E_WRITE)
     2636                 || (   (GstSlatPte.u & EPT_E_WRITE)
    26452637                     && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED
    26462638#  ifdef VBOX_WITH_REAL_WRITE_MONITORED_PAGES
     
    27992791        uint64_t const fGstShwPteFlags = (pGstWalkAll->u.Ept.Pde.u & pVCpu->pgm.s.fGstEptShadowedBigPdeMask & ~EPT_E_LEAF)
    28002792                                       | EPT_E_MEMTYPE_WB | EPT_E_IGNORE_PAT;
    2801         pGstWalkAll->u.Ept.Pte.u = GCPhysPage | fGstShwPteFlags;
     2793        SLATPTE GstSlatPte;
     2794        GstSlatPte.u = GCPhysPage | fGstShwPteFlags;
    28022795
    28032796        unsigned const iPte = (GCPhysNestedPage >> SHW_PT_SHIFT) & SHW_PT_MASK;
    2804         PGM_BTH_NAME(NestedSyncPageWorker)(pVCpu, &pPt->a[iPte], GCPhysPage, pShwPage, iPte, pGstWalkAll);
     2797        PGM_BTH_NAME(NestedSyncPageWorker)(pVCpu, &pPt->a[iPte], GCPhysPage, pShwPage, iPte, GstSlatPte);
    28052798        Log7Func(("4K: GCPhysPage=%RGp iPte=%u ShwPte=%08llx\n", GCPhysPage, iPte, SHW_PTE_LOG64(pPt->a[iPte])));
    2806 
    2807         /* Restore modifications did to the guest-walk result above in case callers might inspect them later. */
    2808         pGstWalkAll->u.Ept.Pte.u = 0;
    28092799        return VINF_SUCCESS;
    28102800    }
     
    28392829                                    &GstWalkPt);
    28402830                if (RT_SUCCESS(rc))
    2841                     PGM_BTH_NAME(NestedSyncPageWorker)(pVCpu, &pPt->a[iPte], WalkPt.GCPhys, pShwPage, iPte, &GstWalkPt);
     2831                    PGM_BTH_NAME(NestedSyncPageWorker)(pVCpu, &pPt->a[iPte], WalkPt.GCPhys, pShwPage, iPte, GstWalkPt.u.Ept.Pte);
    28422832                else
    28432833                {
     
    28782868    {
    28792869        unsigned const iPte = (GCPhysNestedPage >> SHW_PT_SHIFT) & SHW_PT_MASK;
    2880         PGM_BTH_NAME(NestedSyncPageWorker)(pVCpu, &pPt->a[iPte], GCPhysPage, pShwPage, iPte, pGstWalkAll);
     2870        PGM_BTH_NAME(NestedSyncPageWorker)(pVCpu, &pPt->a[iPte], GCPhysPage, pShwPage, iPte, pGstWalkAll->u.Ept.Pte);
    28812871        Log7Func(("4K: GCPhysPage=%RGp iPte=%u ShwPte=%08llx\n", GCPhysPage, iPte, SHW_PTE_LOG64(pPt->a[iPte])));
    28822872    }
     
    30543044            {
    30553045                RTGCPHYS const GCPhysSubPage = GCPhysPt | (iPte << GUEST_PAGE_SHIFT);
    3056                 pGstWalkAll->u.Ept.Pte.u = GCPhysSubPage | fGstShwPteFlags;
    3057                 Assert(!(pGstWalkAll->u.Ept.Pte.u & pVCpu->pgm.s.fGstEptMbzPteMask));
    3058                 PGM_BTH_NAME(NestedSyncPageWorker)(pVCpu, &pPt->a[iPte], GCPhysSubPage, pShwPage, iPte, pGstWalkAll);
     3046                SLATPTE GstSlatPte;
     3047                GstSlatPte.u = GCPhysSubPage | fGstShwPteFlags;
     3048                Assert(!(GstSlatPte.u & pVCpu->pgm.s.fGstEptMbzPteMask));
     3049                PGM_BTH_NAME(NestedSyncPageWorker)(pVCpu, &pPt->a[iPte], GCPhysSubPage, pShwPage, iPte, GstSlatPte);
    30593050                Log7Func(("GstPte=%RGp ShwPte=%RX64 iPte=%u [2M->4K]\n", pGstWalkAll->u.Ept.Pte, pPt->a[iPte].u, iPte));
    30603051                if (RT_UNLIKELY(VM_FF_IS_SET(pVM, VM_FF_PGM_NO_MEMORY)))
    30613052                    break;
    30623053            }
    3063 
    3064             /* Restore modifications did to the guest-walk result above in case callers might inspect them later. */
    3065             pGstWalkAll->u.Ept.Pte.u = 0;
    30663054        }
    30673055        else
     
    31233111        /* Sync the page we've already translated through SLAT. */
    31243112        const unsigned iPte = (GCPhysNestedPage >> SHW_PT_SHIFT) & SHW_PT_MASK;
    3125         PGM_BTH_NAME(NestedSyncPageWorker)(pVCpu, &pPt->a[iPte], GCPhysPage, pShwPage, iPte, pGstWalkAll);
     3113        PGM_BTH_NAME(NestedSyncPageWorker)(pVCpu, &pPt->a[iPte], GCPhysPage, pShwPage, iPte, pGstWalkAll->u.Ept.Pte);
    31263114        Log7Func(("GstPte=%RGp ShwPte=%RX64 iPte=%u\n", pGstWalkAll->u.Ept.Pte.u, pPt->a[iPte].u, iPte));
    31273115
     
    31393127                if (RT_SUCCESS(rc2))
    31403128                {
    3141                     PGM_BTH_NAME(NestedSyncPageWorker)(pVCpu, &pPt->a[iPteCur], WalkPt.GCPhys, pShwPage, iPteCur, &GstWalkPt);
     3129                    PGM_BTH_NAME(NestedSyncPageWorker)(pVCpu, &pPt->a[iPteCur], WalkPt.GCPhys, pShwPage, iPteCur,
     3130                                                       GstWalkPt.u.Ept.Pte);
    31423131                    Log7Func(("GstPte=%RGp ShwPte=%RX64 iPte=%u\n", GstWalkPt.u.Ept.Pte.u, pPt->a[iPteCur].u, iPteCur));
    31433132                }
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