From 73e043f5b5da27e4f14e7d42c6b4a1f25a2d0303 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 10 May 2015 19:35:00 +0000 Subject: [PATCH] [NTOSKRNL] - Fix MMPTE vs MMPDE usage - Use MiPteToPde instead of MiAddressToPte svn path=/trunk/; revision=67632 --- reactos/ntoskrnl/mm/ARM3/miarm.h | 12 ++++++------ reactos/ntoskrnl/mm/ARM3/pagfault.c | 9 +++++++-- reactos/ntoskrnl/mm/ARM3/pfnlist.c | 14 +++++++------- reactos/ntoskrnl/mm/ARM3/pool.c | 5 +++-- reactos/ntoskrnl/mm/ARM3/section.c | 16 ++++++++-------- reactos/ntoskrnl/mm/ARM3/session.c | 25 +++++++++++++++---------- reactos/ntoskrnl/mm/ARM3/virtual.c | 29 +++++++++++++++++------------ 7 files changed, 63 insertions(+), 47 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index bb807bd41d9..3b3165b5355 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -459,7 +459,7 @@ typedef struct _MM_SESSION_SPACE SIZE_T CommittedPages; PVOID PagedPoolStart; PVOID PagedPoolEnd; - PMMPTE PagedPoolBasePde; + PMMPDE PagedPoolBasePde; ULONG Color; LONG ResidentProcessCount; ULONG SessionPoolAllocationFailures[4]; @@ -479,9 +479,9 @@ typedef struct _MM_SESSION_SPACE PDRIVER_UNLOAD Win32KDriverUnload; POOL_DESCRIPTOR PagedPool; #if defined (_M_AMD64) - MMPTE PageDirectory; + MMPDE PageDirectory; #else - PMMPTE PageTables; + PMMPDE PageTables; #endif #if defined (_M_AMD64) PMMPTE SpecialPoolFirstPte; @@ -1887,7 +1887,7 @@ NTSTATUS NTAPI MiInitializeAndChargePfn( OUT PPFN_NUMBER PageFrameIndex, - IN PMMPTE PointerPde, + IN PMMPDE PointerPde, IN PFN_NUMBER ContainingPageFrame, IN BOOLEAN SessionAllocation ); @@ -1904,7 +1904,7 @@ VOID NTAPI MiInitializePfnForOtherProcess( IN PFN_NUMBER PageFrameIndex, - IN PMMPTE PointerPte, + IN PVOID PteAddress, IN PFN_NUMBER PteFrame ); @@ -2210,7 +2210,7 @@ MmDeterminePoolType( VOID NTAPI MiMakePdeExistAndMakeValid( - IN PMMPTE PointerPde, + IN PMMPDE PointerPde, IN PEPROCESS TargetProcess, IN KIRQL OldIrql ); diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index 7d645ce49de..272ea92aee9 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -336,7 +336,7 @@ FASTCALL MiCheckPdeForSessionSpace(IN PVOID Address) { MMPTE TempPde; - PMMPTE PointerPde; + PMMPDE PointerPde; PVOID SessionAddress; ULONG Index; @@ -1959,7 +1959,7 @@ UserFault: } /* Write a demand-zero PDE */ - MI_WRITE_INVALID_PTE(PointerPde, DemandZeroPde); + MI_WRITE_INVALID_PDE(PointerPde, DemandZeroPde); /* Dispatch the fault */ Status = MiDispatchFault(TRUE, @@ -2087,7 +2087,12 @@ UserFault: if (PointerPde == MiAddressToPde(PTE_BASE)) { /* Then it's really a demand-zero PDE (on behalf of user-mode) */ +#ifdef _M_ARM + _WARN("This is probably completely broken!"); + MI_WRITE_INVALID_PDE((PMMPDE)PointerPte, DemandZeroPde); +#else MI_WRITE_INVALID_PTE(PointerPte, DemandZeroPde); +#endif } else { diff --git a/reactos/ntoskrnl/mm/ARM3/pfnlist.c b/reactos/ntoskrnl/mm/ARM3/pfnlist.c index 959f2612a2c..6977f0e7fc8 100644 --- a/reactos/ntoskrnl/mm/ARM3/pfnlist.c +++ b/reactos/ntoskrnl/mm/ARM3/pfnlist.c @@ -1083,15 +1083,15 @@ MiInitializePfnAndMakePteValid(IN PFN_NUMBER PageFrameIndex, NTSTATUS NTAPI MiInitializeAndChargePfn(OUT PPFN_NUMBER PageFrameIndex, - IN PMMPTE PointerPde, + IN PMMPDE PointerPde, IN PFN_NUMBER ContainingPageFrame, IN BOOLEAN SessionAllocation) { - MMPTE TempPte; + MMPDE TempPde; KIRQL OldIrql; /* Use either a global or local PDE */ - TempPte = SessionAllocation ? ValidKernelPdeLocal : ValidKernelPde; + TempPde = SessionAllocation ? ValidKernelPdeLocal : ValidKernelPde; /* Lock the PFN database */ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); @@ -1106,8 +1106,8 @@ MiInitializeAndChargePfn(OUT PPFN_NUMBER PageFrameIndex, /* Grab a zero page and set the PFN, then make it valid */ *PageFrameIndex = MiRemoveZeroPage(MI_GET_NEXT_COLOR()); - TempPte.u.Hard.PageFrameNumber = *PageFrameIndex; - MI_WRITE_VALID_PTE(PointerPde, TempPte); + TempPde.u.Hard.PageFrameNumber = *PageFrameIndex; + MI_WRITE_VALID_PDE(PointerPde, TempPde); /* Initialize the PFN */ MiInitializePfnForOtherProcess(*PageFrameIndex, @@ -1270,14 +1270,14 @@ MiDecrementReferenceCount(IN PMMPFN Pfn1, VOID NTAPI MiInitializePfnForOtherProcess(IN PFN_NUMBER PageFrameIndex, - IN PMMPTE PointerPte, + IN PVOID PteAddress, IN PFN_NUMBER PteFrame) { PMMPFN Pfn1; /* Setup the PTE */ Pfn1 = MI_PFN_ELEMENT(PageFrameIndex); - Pfn1->PteAddress = PointerPte; + Pfn1->PteAddress = PteAddress; /* Make this a software PTE */ MI_MAKE_SOFTWARE_PTE(&Pfn1->OriginalPte, MM_READWRITE); diff --git a/reactos/ntoskrnl/mm/ARM3/pool.c b/reactos/ntoskrnl/mm/ARM3/pool.c index b7139db19ac..7f1ca3d9aed 100644 --- a/reactos/ntoskrnl/mm/ARM3/pool.c +++ b/reactos/ntoskrnl/mm/ARM3/pool.c @@ -507,7 +507,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // // We can only support this much then // - PointerPde = MiAddressToPte(MmPagedPoolInfo.LastPteForPagedPool); + PointerPde = MiPteToPde(MmPagedPoolInfo.LastPteForPagedPool); PageTableCount = (PFN_COUNT)(PointerPde + 1 - MmPagedPoolInfo.NextPdeForPagedPoolExpansion); ASSERT(PageTableCount < i); @@ -1277,7 +1277,8 @@ NTSTATUS NTAPI MiInitializeSessionPool(VOID) { - PMMPTE PointerPde, PointerPte, LastPte, LastPde; + PMMPTE PointerPte, LastPte; + PMMPDE PointerPde, LastPde; PFN_NUMBER PageFrameIndex, PdeCount; PPOOL_DESCRIPTOR PoolDescriptor; PMM_SESSION_SPACE SessionGlobal; diff --git a/reactos/ntoskrnl/mm/ARM3/section.c b/reactos/ntoskrnl/mm/ARM3/section.c index 436554540c4..de509fb5147 100644 --- a/reactos/ntoskrnl/mm/ARM3/section.c +++ b/reactos/ntoskrnl/mm/ARM3/section.c @@ -937,8 +937,8 @@ MiSessionCommitPageTables(IN PVOID StartVa, { KIRQL OldIrql; ULONG Color, Index; - PMMPTE StartPde, EndPde; - MMPTE TempPte = ValidKernelPdeLocal; + PMMPDE StartPde, EndPde; + MMPDE TempPde = ValidKernelPdeLocal; PMMPFN Pfn1; PFN_NUMBER PageCount = 0, ActualPages = 0, PageFrameNumber; @@ -976,7 +976,7 @@ MiSessionCommitPageTables(IN PVOID StartVa, _WARN("MiSessionCommitPageTables halfplemented for amd64") DBG_UNREFERENCED_LOCAL_VARIABLE(OldIrql); DBG_UNREFERENCED_LOCAL_VARIABLE(Color); - DBG_UNREFERENCED_LOCAL_VARIABLE(TempPte); + DBG_UNREFERENCED_LOCAL_VARIABLE(TempPde); DBG_UNREFERENCED_LOCAL_VARIABLE(Pfn1); DBG_UNREFERENCED_LOCAL_VARIABLE(PageFrameNumber); ASSERT(FALSE); @@ -996,12 +996,12 @@ _WARN("MiSessionCommitPageTables halfplemented for amd64") OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Color = (++MmSessionSpace->Color) & MmSecondaryColorMask; PageFrameNumber = MiRemoveZeroPage(Color); - TempPte.u.Hard.PageFrameNumber = PageFrameNumber; - MI_WRITE_VALID_PTE(StartPde, TempPte); + TempPde.u.Hard.PageFrameNumber = PageFrameNumber; + MI_WRITE_VALID_PDE(StartPde, TempPde); /* Write the page table in session space structure */ ASSERT(MmSessionSpace->PageTables[Index].u.Long == 0); - MmSessionSpace->PageTables[Index] = TempPte; + MmSessionSpace->PageTables[Index] = TempPde; /* Initialize the PFN */ MiInitializePfnForOtherProcess(PageFrameNumber, @@ -2053,7 +2053,7 @@ MiSetProtectionOnSection(IN PEPROCESS Process, // if ((((ULONG_PTR)PointerPte) & (SYSTEM_PD_SIZE - 1)) == 0) { - PointerPde = MiAddressToPte(PointerPte); + PointerPde = MiPteToPde(PointerPte); MiMakePdeExistAndMakeValid(PointerPde, Process, MM_NOIRQL); } @@ -2157,7 +2157,7 @@ MiRemoveMappedPtes(IN PVOID BaseAddress, Pfn1 = MiGetPfnEntry(PFN_FROM_PTE(&PteContents)); /* Get the PTE */ - PointerPde = MiAddressToPte(PointerPte); + PointerPde = MiPteToPde(PointerPte); /* Lock the PFN database and make sure this isn't a mapped file */ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); diff --git a/reactos/ntoskrnl/mm/ARM3/session.c b/reactos/ntoskrnl/mm/ARM3/session.c index a0a23f20aa4..dd5948c2a15 100644 --- a/reactos/ntoskrnl/mm/ARM3/session.c +++ b/reactos/ntoskrnl/mm/ARM3/session.c @@ -480,8 +480,10 @@ NTAPI MiSessionInitializeWorkingSetList(VOID) { KIRQL OldIrql; - PMMPTE PointerPte, PointerPde; + PMMPTE PointerPte; + PMMPDE PointerPde; MMPTE TempPte; + MMPDE TempPde; ULONG Color, Index; PFN_NUMBER PageFrameIndex; PMM_SESSION_SPACE SessionGlobal; @@ -501,7 +503,9 @@ MiSessionInitializeWorkingSetList(VOID) if (PointerPde->u.Hard.Valid == 1) { /* Nope, we'll have to do it */ +#ifndef _M_ARM ASSERT(PointerPde->u.Hard.Global == 0); +#endif AllocatedPageTable = FALSE; } else @@ -536,14 +540,14 @@ MiSessionInitializeWorkingSetList(VOID) } /* Write a valid PDE for it */ - TempPte.u.Long = ValidKernelPdeLocal.u.Long; - TempPte.u.Hard.PageFrameNumber = PageFrameIndex; - MI_WRITE_VALID_PTE(PointerPde, TempPte); + TempPde.u.Long = ValidKernelPdeLocal.u.Long; + TempPde.u.Hard.PageFrameNumber = PageFrameIndex; + MI_WRITE_VALID_PDE(PointerPde, TempPde); /* Add this into the list */ Index = ((ULONG_PTR)WorkingSetList - (ULONG_PTR)MmSessionBase) >> 22; #ifndef _M_AMD64 - MmSessionSpace->PageTables[Index] = TempPte; + MmSessionSpace->PageTables[Index] = TempPde; #endif /* Initialize the page directory page, and now zero the working set list itself */ MiInitializePfnForOtherProcess(PageFrameIndex, @@ -614,10 +618,11 @@ MiSessionCreateInternal(OUT PULONG SessionId) PEPROCESS Process = PsGetCurrentProcess(); ULONG NewFlags, Flags, Size, i, Color; KIRQL OldIrql; - PMMPTE PointerPte, PageTables, SessionPte; - PMMPDE PointerPde; + PMMPTE PointerPte, SessionPte; + PMMPDE PointerPde, PageTables; PMM_SESSION_SPACE SessionGlobal; MMPTE TempPte; + MMPDE TempPde; NTSTATUS Status; BOOLEAN Result; PFN_NUMBER SessionPageDirIndex; @@ -725,13 +730,13 @@ MiSessionCreateInternal(OUT PULONG SessionId) } /* Fill the PTE out */ - TempPte.u.Long = ValidKernelPdeLocal.u.Long; - TempPte.u.Hard.PageFrameNumber = SessionPageDirIndex; + TempPde.u.Long = ValidKernelPdeLocal.u.Long; + TempPde.u.Hard.PageFrameNumber = SessionPageDirIndex; /* Setup, allocate, fill out the MmSessionSpace PTE */ PointerPde = MiAddressToPde(MmSessionSpace); ASSERT(PointerPde->u.Long == 0); - MI_WRITE_VALID_PTE(PointerPde, TempPte); + MI_WRITE_VALID_PDE(PointerPde, TempPde); MiInitializePfnForOtherProcess(SessionPageDirIndex, PointerPde, SessionPageDirIndex); diff --git a/reactos/ntoskrnl/mm/ARM3/virtual.c b/reactos/ntoskrnl/mm/ARM3/virtual.c index ee3ecc01c82..35583e73529 100644 --- a/reactos/ntoskrnl/mm/ARM3/virtual.c +++ b/reactos/ntoskrnl/mm/ARM3/virtual.c @@ -45,7 +45,8 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress, IN PMMVAD Vad, IN PEPROCESS Process) { - PMMPTE PointerPte, LastPte, PointerPde; + PMMPTE PointerPte, LastPte; + PMMPDE PointerPde; ULONG CommittedPages; /* Compute starting and ending PTE and PDE addresses */ @@ -60,7 +61,7 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress, CommittedPages = (ULONG)BYTES_TO_PAGES(EndingAddress - StartingAddress); /* Is the PDE demand-zero? */ - PointerPde = MiAddressToPte(PointerPte); + PointerPde = MiPteToPde(PointerPte); if (PointerPde->u.Long != 0) { /* It is not. Is it valid? */ @@ -86,7 +87,7 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress, if (MiIsPteOnPdeBoundary(PointerPte)) { /* Is this PDE demand zero? */ - PointerPde = MiAddressToPte(PointerPte); + PointerPde = MiPteToPde(PointerPte); if (PointerPde->u.Long != 0) { /* It isn't -- is it valid? */ @@ -132,7 +133,7 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress, CommittedPages = 0; /* Is the PDE demand-zero? */ - PointerPde = MiAddressToPte(PointerPte); + PointerPde = MiPteToPde(PointerPte); if (PointerPde->u.Long != 0) { /* It isn't -- is it invalid? */ @@ -158,7 +159,7 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress, if (MiIsPteOnPdeBoundary(PointerPte)) { /* Is this new PDE demand-zero? */ - PointerPde = MiAddressToPte(PointerPte); + PointerPde = MiPteToPde(PointerPte); if (PointerPde->u.Long != 0) { /* It isn't. Is it valid? */ @@ -1978,7 +1979,8 @@ MiIsEntireRangeCommitted(IN ULONG_PTR StartingAddress, IN PMMVAD Vad, IN PEPROCESS Process) { - PMMPTE PointerPte, LastPte, PointerPde; + PMMPTE PointerPte, LastPte; + PMMPDE PointerPde; BOOLEAN OnBoundary = TRUE; PAGED_CODE(); @@ -2098,7 +2100,8 @@ MiProtectVirtualMemory(IN PEPROCESS Process, PMMVAD Vad; PMMSUPPORT AddressSpace; ULONG_PTR StartingAddress, EndingAddress; - PMMPTE PointerPde, PointerPte, LastPte; + PMMPTE PointerPte, LastPte; + PMMPDE PointerPde; MMPTE PteContents; PMMPFN Pfn1; ULONG ProtectionMask, OldProtect; @@ -2273,7 +2276,7 @@ MiProtectVirtualMemory(IN PEPROCESS Process, /* Check if we've crossed a PDE boundary and make the new PDE valid too */ if (MiIsPteOnPdeBoundary(PointerPte)) { - PointerPde = MiAddressToPte(PointerPte); + PointerPde = MiPteToPde(PointerPte); MiMakePdeExistAndMakeValid(PointerPde, Process, MM_NOIRQL); } @@ -2366,7 +2369,7 @@ FailPath: VOID NTAPI -MiMakePdeExistAndMakeValid(IN PMMPTE PointerPde, +MiMakePdeExistAndMakeValid(IN PMMPDE PointerPde, IN PEPROCESS TargetProcess, IN KIRQL OldIrql) { @@ -2502,7 +2505,8 @@ MiDecommitPages(IN PVOID StartingAddress, IN PEPROCESS Process, IN PMMVAD Vad) { - PMMPTE PointerPde, PointerPte, CommitPte = NULL; + PMMPTE PointerPte, CommitPte = NULL; + PMMPDE PointerPde; ULONG CommitReduction = 0; PMMPTE ValidPteList[256]; ULONG PteCount = 0; @@ -4316,7 +4320,8 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, ULONG ProtectionMask, QuotaCharge = 0, QuotaFree = 0; BOOLEAN Attached = FALSE, ChangeProtection = FALSE; MMPTE TempPte; - PMMPTE PointerPte, PointerPde, LastPte; + PMMPTE PointerPte, LastPte; + PMMPDE PointerPde; TABLE_SEARCH_RESULT Result; PAGED_CODE(); @@ -4891,7 +4896,7 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, // // Get the PDE and now make it valid too // - PointerPde = MiAddressToPte(PointerPte); + PointerPde = MiPteToPde(PointerPte); MiMakePdeExistAndMakeValid(PointerPde, Process, MM_NOIRQL); }