Changeset 104935 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Jun 15, 2024 1:40:08 AM (8 months ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PGMAllGst.h
r104934 r104935 643 643 RTGCPHYS GCPhysPdpt = Pml4e.u & X86_PML4E_PG_MASK; 644 644 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); 646 646 if (RT_SUCCESS(rc)) { /* probable */ } 647 647 else return PGM_GST_NAME(WalkFastReturnBadPhysAddr)(pVCpu, pWalk, 3, rc); … … 687 687 RTGCPHYS GCPhysPd = Pdpe.u & X86_PDPE_PG_MASK; 688 688 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); 690 690 if (RT_SUCCESS(rc)) { /* probable */ } 691 691 else return PGM_GST_NAME(WalkFastReturnBadPhysAddr)(pVCpu, pWalk, 2, rc); … … 791 791 RTGCPHYS GCPhysPt = GST_GET_PDE_GCPHYS(Pde); 792 792 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); 794 794 if (RT_SUCCESS(rc)) { /* probable */ } 795 795 else return PGM_GST_NAME(WalkFastReturnBadPhysAddr)(pVCpu, pWalk, 1, rc); -
trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp
r104885 r104935 3691 3691 3692 3692 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 */ 3703 int 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 } 3693 3763 Assert(rc <= VINF_SUCCESS); 3694 3764 return rc; … … 5435 5505 * @param pvUser User argument to pass to pfnChecker. 5436 5506 */ 5437 VMM_INT_DECL(int) PGMPhysNemPageInfoChecker(PVMCC pVM, PVMCPUCC pVCpu, RTGCPHYS GCPhys, bool fMakeWritable, PPGMPHYSNEMPAGEINFO pInfo,5438 P FNPGMPHYSNEMCHECKPAGE pfnChecker, void *pvUser)5507 VMM_INT_DECL(int) PGMPhysNemPageInfoChecker(PVMCC pVM, PVMCPUCC pVCpu, RTGCPHYS GCPhys, bool fMakeWritable, 5508 PPGMPHYSNEMPAGEINFO pInfo, PFNPGMPHYSNEMCHECKPAGE pfnChecker, void *pvUser) 5439 5509 { 5440 5510 PGM_LOCK_VOID(pVM); -
trunk/src/VBox/VMM/include/PGMInternal.h
r104932 r104935 3906 3906 int pgmPhysPageMapByPageID(PVMCC pVM, uint32_t idPage, RTHCPHYS HCPhys, void **ppv); 3907 3907 int pgmPhysGCPhys2R3Ptr(PVMCC pVM, RTGCPHYS GCPhys, PRTR3PTR pR3Ptr); 3908 int pgmPhysGCPhys2CCPtrLockless(PVMCPUCC pVCpu, RTGCPHYS GCPhys, void **ppv); 3908 3909 int pgmPhysCr3ToHCPtr(PVM pVM, RTGCPHYS GCPhys, PRTR3PTR pR3Ptr); 3909 3910 int pgmPhysGCPhys2CCPtrInternalDepr(PVMCC pVM, PPGMPAGE pPage, RTGCPHYS GCPhys, void **ppv);
Note:
See TracChangeset
for help on using the changeset viewer.