[NTOSKRNL]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Sun, 10 May 2015 19:35:00 +0000 (19:35 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Sun, 10 May 2015 19:35:00 +0000 (19:35 +0000)
- Fix MMPTE vs MMPDE usage
- Use MiPteToPde instead of MiAddressToPte

svn path=/trunk/; revision=67632

reactos/ntoskrnl/mm/ARM3/miarm.h
reactos/ntoskrnl/mm/ARM3/pagfault.c
reactos/ntoskrnl/mm/ARM3/pfnlist.c
reactos/ntoskrnl/mm/ARM3/pool.c
reactos/ntoskrnl/mm/ARM3/section.c
reactos/ntoskrnl/mm/ARM3/session.c
reactos/ntoskrnl/mm/ARM3/virtual.c

index bb807bd..3b3165b 100644 (file)
@@ -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
 );
index 7d645ce..272ea92 100644 (file)
@@ -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
             {
index 959f261..6977f0e 100644 (file)
@@ -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);
index b7139db..7f1ca3d 100644 (file)
@@ -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;
index 4365545..de509fb 100644 (file)
@@ -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);
index a0a23f2..dd5948c 100644 (file)
@@ -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);
index ee3ecc0..35583e7 100644 (file)
@@ -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);
         }