- Timestamp:
- Sep 8, 2023 4:02:27 AM (13 months ago)
- File:
-
- 1 edited
-
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r101002 r101058 51 51 # if defined(VBOX_WITH_NESTED_HWVIRT_VMX_EPT) && PGM_SHW_TYPE == PGM_TYPE_EPT 52 52 static void PGM_BTH_NAME(NestedSyncPageWorker)(PVMCPUCC pVCpu, PSHWPTE pPte, RTGCPHYS GCPhysPage, PPGMPOOLPAGE pShwPage, 53 unsigned iPte, PCPGMPTWALKGST pGstWalkAll);53 unsigned iPte, SLATPTE GstSlatPte); 54 54 static int PGM_BTH_NAME(NestedSyncPage)(PVMCPUCC pVCpu, RTGCPHYS GCPhysNestedPage, RTGCPHYS GCPhysPage, unsigned cPages, 55 55 uint32_t uErr, PPGMPTWALKGST pGstWalkAll); … … 2580 2580 * @param pShwPage The shadow page of the page table. 2581 2581 * @param iPte The index of the page table entry. 2582 * @param pGst WalkAll The guest page table walk result.2582 * @param pGstSlatPte The guest SLAT page table entry. 2583 2583 * 2584 2584 * @note Not to be used for 2/4MB pages! 2585 2585 */ 2586 2586 static void PGM_BTH_NAME(NestedSyncPageWorker)(PVMCPUCC pVCpu, PSHWPTE pPte, RTGCPHYS GCPhysPage, PPGMPOOLPAGE pShwPage, 2587 unsigned iPte, PCPGMPTWALKGST pGstWalkAll)2587 unsigned iPte, SLATPTE GstSlatPte) 2588 2588 { 2589 /*2590 * Do not make assumptions about anything other than the final PTE entry in the2591 * 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 PSLATPTE2595 * and using that instead of passing the full SLAT translation result.2596 */2597 2589 PGM_A20_ASSERT_MASKED(pVCpu, GCPhysPage); 2598 2590 Assert(PGMPOOL_PAGE_IS_NESTED(pShwPage)); 2599 2591 Assert(!pShwPage->fDirty); 2600 2592 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)); 2604 2596 2605 2597 /* … … 2634 2626 */ 2635 2627 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) 2637 2629 | EPT_E_MEMTYPE_WB | EPT_E_IGNORE_PAT; 2638 2630 if (!PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) || PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage)) … … 2642 2634 if ( PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_RAM 2643 2635 && ( PGM_PAGE_IS_ZERO(pPage) 2644 || ( ( pGstWalkAll->u.Ept.Pte.u & EPT_E_WRITE)2636 || ( (GstSlatPte.u & EPT_E_WRITE) 2645 2637 && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED 2646 2638 # ifdef VBOX_WITH_REAL_WRITE_MONITORED_PAGES … … 2799 2791 uint64_t const fGstShwPteFlags = (pGstWalkAll->u.Ept.Pde.u & pVCpu->pgm.s.fGstEptShadowedBigPdeMask & ~EPT_E_LEAF) 2800 2792 | EPT_E_MEMTYPE_WB | EPT_E_IGNORE_PAT; 2801 pGstWalkAll->u.Ept.Pte.u = GCPhysPage | fGstShwPteFlags; 2793 SLATPTE GstSlatPte; 2794 GstSlatPte.u = GCPhysPage | fGstShwPteFlags; 2802 2795 2803 2796 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); 2805 2798 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;2809 2799 return VINF_SUCCESS; 2810 2800 } … … 2839 2829 &GstWalkPt); 2840 2830 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); 2842 2832 else 2843 2833 { … … 2878 2868 { 2879 2869 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); 2881 2871 Log7Func(("4K: GCPhysPage=%RGp iPte=%u ShwPte=%08llx\n", GCPhysPage, iPte, SHW_PTE_LOG64(pPt->a[iPte]))); 2882 2872 } … … 3054 3044 { 3055 3045 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); 3059 3050 Log7Func(("GstPte=%RGp ShwPte=%RX64 iPte=%u [2M->4K]\n", pGstWalkAll->u.Ept.Pte, pPt->a[iPte].u, iPte)); 3060 3051 if (RT_UNLIKELY(VM_FF_IS_SET(pVM, VM_FF_PGM_NO_MEMORY))) 3061 3052 break; 3062 3053 } 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;3066 3054 } 3067 3055 else … … 3123 3111 /* Sync the page we've already translated through SLAT. */ 3124 3112 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); 3126 3114 Log7Func(("GstPte=%RGp ShwPte=%RX64 iPte=%u\n", pGstWalkAll->u.Ept.Pte.u, pPt->a[iPte].u, iPte)); 3127 3115 … … 3139 3127 if (RT_SUCCESS(rc2)) 3140 3128 { 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); 3142 3131 Log7Func(("GstPte=%RGp ShwPte=%RX64 iPte=%u\n", GstWalkPt.u.Ept.Pte.u, pPt->a[iPteCur].u, iPteCur)); 3143 3132 }
Note:
See TracChangeset
for help on using the changeset viewer.

