VirtualBox

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


Ignore:
Timestamp:
Jun 15, 2024 1:40:08 AM (8 months ago)
Author:
vboxsync
Message:

VMM/PGM: Lockless pgmPhysGCPhys2R3Ptr variant for use in PGMGstQueryPage. bugref:10687

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

Legend:

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

    r104934 r104935  
    643643        RTGCPHYS GCPhysPdpt = Pml4e.u & X86_PML4E_PG_MASK;
    644644        PGM_GST_SLAT_WALK_FAST(pVCpu, GCPtr, GCPhysPdpt, false /*a_fFinal*/, GCPhysPdpt, pWalk);
    645         rc = PGM_GCPHYS_2_PTR_BY_VMCPU(pVCpu, GCPhysPdpt, &pGstWalk->pPdpt);
     645        rc = pgmPhysGCPhys2CCPtrLockless(pVCpu, GCPhysPdpt, (void **)&pGstWalk->pPdpt);
    646646        if (RT_SUCCESS(rc)) { /* probable */ }
    647647        else return PGM_GST_NAME(WalkFastReturnBadPhysAddr)(pVCpu, pWalk, 3, rc);
     
    687687        RTGCPHYS GCPhysPd = Pdpe.u & X86_PDPE_PG_MASK;
    688688        PGM_GST_SLAT_WALK_FAST(pVCpu, GCPtr, GCPhysPd, false /*a_fFinal*/, GCPhysPd, pWalk);
    689         rc = PGM_GCPHYS_2_PTR_BY_VMCPU(pVCpu, GCPhysPd, &pGstWalk->pPd);
     689        rc = pgmPhysGCPhys2CCPtrLockless(pVCpu, GCPhysPd, (void **)&pGstWalk->pPd);
    690690        if (RT_SUCCESS(rc)) { /* probable */ }
    691691        else return PGM_GST_NAME(WalkFastReturnBadPhysAddr)(pVCpu, pWalk, 2, rc);
     
    791791        RTGCPHYS GCPhysPt = GST_GET_PDE_GCPHYS(Pde);
    792792        PGM_GST_SLAT_WALK_FAST(pVCpu, GCPtr, GCPhysPt, false /*a_fFinal*/, GCPhysPt, pWalk);
    793         rc = PGM_GCPHYS_2_PTR_BY_VMCPU(pVCpu, GCPhysPt, &pGstWalk->pPt);
     793        rc = pgmPhysGCPhys2CCPtrLockless(pVCpu, GCPhysPt, (void **)&pGstWalk->pPt);
    794794        if (RT_SUCCESS(rc)) { /* probable */ }
    795795        else return PGM_GST_NAME(WalkFastReturnBadPhysAddr)(pVCpu, pWalk, 1, rc);
  • trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp

    r104885 r104935  
    36913691
    36923692    PGM_UNLOCK(pVM);
     3693    Assert(rc <= VINF_SUCCESS);
     3694    return rc;
     3695}
     3696
     3697
     3698/**
     3699 * Special lockless guest physical to current context pointer convertor.
     3700 *
     3701 * This is mainly for the page table walking and such.
     3702 */
     3703int pgmPhysGCPhys2CCPtrLockless(PVMCPUCC pVCpu, RTGCPHYS GCPhys, void **ppv)
     3704{
     3705    VMCPU_ASSERT_EMT(pVCpu);
     3706
     3707    /*
     3708     * Get the RAM range and page structure.
     3709     */
     3710    PVMCC const           pVM = pVCpu->CTX_SUFF(pVM);
     3711    PGMRAMRANGE volatile *pRam;
     3712    PGMPAGE volatile     *pPage;
     3713    int rc = pgmPhysGetPageAndRangeExLockless(pVM, pVCpu, GCPhys, &pPage, &pRam);
     3714    if (RT_SUCCESS(rc))
     3715    {
     3716        /*
     3717         * Now, make sure it's writable (typically it is).
     3718         */
     3719        if (RT_LIKELY(PGM_PAGE_GET_STATE(pPage) == PGM_PAGE_STATE_ALLOCATED))
     3720        { /* likely, typically */ }
     3721        else
     3722        {
     3723            PGM_LOCK_VOID(pVM);
     3724            rc = pgmPhysPageMakeWritable(pVM, (PPGMPAGE)pPage, GCPhys);
     3725            if (RT_SUCCESS(rc))
     3726                rc = pgmPhysGetPageAndRangeExLockless(pVM, pVCpu, GCPhys, &pPage, &pRam);
     3727            PGM_UNLOCK(pVM);
     3728            if (RT_FAILURE(rc))
     3729                return rc;
     3730            AssertMsg(rc == VINF_SUCCESS || rc == VINF_PGM_SYNC_CR3 /* not returned */, ("%Rrc\n", rc));
     3731        }
     3732        Assert(PGM_PAGE_GET_HCPHYS(pPage) != 0);
     3733
     3734        /*
     3735         * Get the mapping address.
     3736         */
     3737        uint8_t *pb;
     3738#ifdef IN_RING3
     3739        if (PGM_IS_IN_NEM_MODE(pVM))
     3740            pb = &pRam->pbR3[(RTGCPHYS)(uintptr_t)(pPage - &pRam->aPages[0]) << GUEST_PAGE_SHIFT];
     3741        else
     3742#endif
     3743        {
     3744#ifdef IN_RING3
     3745            PPGMPAGEMAPTLBE pTlbe;
     3746            rc = pgmPhysPageQueryLocklessTlbeWithPage(pVCpu, (PPGMPAGE)pPage, GCPhys, &pTlbe);
     3747            AssertLogRelRCReturn(rc, rc);
     3748            pb = (uint8_t *)pTlbe->pv;
     3749            RT_NOREF(pVM);
     3750#else /** @todo a safe lockless page TLB in ring-0 needs the to ensure it gets the right invalidations. later. */
     3751            PGM_LOCK(pVM);
     3752            PPGMPAGEMAPTLBE pTlbe;
     3753            rc = pgmPhysPageQueryTlbeWithPage(pVM, (PPGMPAGE)pPage, GCPhys, &pTlbe);
     3754            AssertLogRelRCReturnStmt(rc, PGM_UNLOCK(pVM), rc);
     3755            pb = (uint8_t *)pTlbe->pv;
     3756            PGM_UNLOCK(pVM);
     3757            RT_NOREF(pVCpu);
     3758#endif
     3759        }
     3760        *ppv = (void *)((uintptr_t)pb | (uintptr_t)(GCPhys & GUEST_PAGE_OFFSET_MASK));
     3761        return VINF_SUCCESS;
     3762    }
    36933763    Assert(rc <= VINF_SUCCESS);
    36943764    return rc;
     
    54355505 * @param   pvUser          User argument to pass to pfnChecker.
    54365506 */
    5437 VMM_INT_DECL(int) PGMPhysNemPageInfoChecker(PVMCC pVM, PVMCPUCC pVCpu, RTGCPHYS GCPhys, bool fMakeWritable, PPGMPHYSNEMPAGEINFO pInfo,
    5438                                             PFNPGMPHYSNEMCHECKPAGE pfnChecker, void *pvUser)
     5507VMM_INT_DECL(int) PGMPhysNemPageInfoChecker(PVMCC pVM, PVMCPUCC pVCpu, RTGCPHYS GCPhys, bool fMakeWritable,
     5508                                            PPGMPHYSNEMPAGEINFO pInfo, PFNPGMPHYSNEMCHECKPAGE pfnChecker, void *pvUser)
    54395509{
    54405510    PGM_LOCK_VOID(pVM);
  • trunk/src/VBox/VMM/include/PGMInternal.h

    r104932 r104935  
    39063906int             pgmPhysPageMapByPageID(PVMCC pVM, uint32_t idPage, RTHCPHYS HCPhys, void **ppv);
    39073907int             pgmPhysGCPhys2R3Ptr(PVMCC pVM, RTGCPHYS GCPhys, PRTR3PTR pR3Ptr);
     3908int             pgmPhysGCPhys2CCPtrLockless(PVMCPUCC pVCpu, RTGCPHYS GCPhys, void **ppv);
    39083909int             pgmPhysCr3ToHCPtr(PVM pVM, RTGCPHYS GCPhys, PRTR3PTR pR3Ptr);
    39093910int             pgmPhysGCPhys2CCPtrInternalDepr(PVMCC pVM, PPGMPAGE pPage, RTGCPHYS GCPhys, void **ppv);
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