[NTOS]
authorStefan Ginsberg <stefanginsberg@gmail.com>
Thu, 15 Oct 2015 01:49:26 +0000 (01:49 +0000)
committerStefan Ginsberg <stefanginsberg@gmail.com>
Thu, 15 Oct 2015 01:49:26 +0000 (01:49 +0000)
Fix mapping of working set list page -- it should be local.
Get rid of MI_MAKE_LOCAL_PAGE and use ValidKernelPdeLocal/ValidKernelPteLocal consistently. This is what they exist for!
We should now hopefully not be creating any global pages when we don't want them.
Next step; fix flushing.
Bonus: Use the right lock in MiSessionLeader

svn path=/trunk/; revision=69532

reactos/ntoskrnl/include/internal/amd64/mm.h
reactos/ntoskrnl/include/internal/arm/mm.h
reactos/ntoskrnl/include/internal/i386/mm.h
reactos/ntoskrnl/mm/ARM3/hypermap.c
reactos/ntoskrnl/mm/ARM3/i386/init.c
reactos/ntoskrnl/mm/ARM3/procsup.c
reactos/ntoskrnl/mm/ARM3/session.c

index a945244..0f5f3b7 100644 (file)
@@ -85,7 +85,6 @@
 #define PFN_FROM_PXE(v) ((v)->u.Hard.PageFrameNumber)
 
 /* Macros for portable PTE modification */
-#define MI_MAKE_LOCAL_PAGE(x)      ((x)->u.Hard.Global = 0)
 #define MI_MAKE_DIRTY_PAGE(x)      ((x)->u.Hard.Dirty = 1)
 #define MI_MAKE_CLEAN_PAGE(x)      ((x)->u.Hard.Dirty = 0)
 #define MI_MAKE_ACCESSED_PAGE(x)   ((x)->u.Hard.Accessed = 1)
index e7021b1..ade2bff 100644 (file)
@@ -74,7 +74,6 @@
 #define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber)
 
 /* Macros for portable PTE modification */
-#define MI_MAKE_LOCAL_PAGE(x)      ((x)->u.Hard.NonGlobal = 1)
 #define MI_MAKE_DIRTY_PAGE(x)
 #define MI_MAKE_CLEAN_PAGE(x)
 #define MI_MAKE_ACCESSED_PAGE(x)
index 5376dd5..aae223c 100644 (file)
@@ -89,7 +89,6 @@
 #define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber)
 
 /* Macros for portable PTE modification */
-#define MI_MAKE_LOCAL_PAGE(x)      ((x)->u.Hard.Global = 0)
 #define MI_MAKE_DIRTY_PAGE(x)      ((x)->u.Hard.Dirty = 1)
 #define MI_MAKE_CLEAN_PAGE(x)      ((x)->u.Hard.Dirty = 0)
 #define MI_MAKE_ACCESSED_PAGE(x)   ((x)->u.Hard.Accessed = 1)
index 7197d59..9391cee 100644 (file)
@@ -44,9 +44,8 @@ MiMapPageInHyperSpace(IN PEPROCESS Process,
     //
     // Build the PTE
     //
-    TempPte = ValidKernelPte;
+    TempPte = ValidKernelPteLocal;
     TempPte.u.Hard.PageFrameNumber = Page;
-    MI_MAKE_LOCAL_PAGE(&TempPte); // Hyperspace is local!
 
     //
     // Pick the first hyperspace PTE
index 5a42219..abb01a9 100644 (file)
@@ -492,8 +492,8 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     MI_SET_USAGE(MI_USAGE_PAGE_TABLE);
     MI_SET_PROCESS2("Kernel");
     PageFrameIndex = MiRemoveAnyPage(0);
+    TempPde = ValidKernelPdeLocal;
     TempPde.u.Hard.PageFrameNumber = PageFrameIndex;
-    TempPde.u.Hard.Global = FALSE; // Hyperspace is local!
     MI_WRITE_VALID_PTE(StartPde, TempPde);
 
     /* Flush the TLB */
@@ -542,6 +542,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     MI_SET_USAGE(MI_USAGE_PAGE_TABLE);
     MI_SET_PROCESS2("Kernel WS List");
     PageFrameIndex = MiRemoveAnyPage(0);
+    TempPte = ValidKernelPteLocal;
     TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
 
     /* Map the working set list */
index 4b4adfd..6e5a48f 100644 (file)
@@ -1163,10 +1163,8 @@ MmCreateProcessAddressSpace(IN ULONG MinWs,
     HyperTable = MiPteToAddress(PointerPte);
 
     /* Now write the PTE/PDE entry for the working set list index itself */
-    TempPte = ValidKernelPte;
+    TempPte = ValidKernelPteLocal;
     TempPte.u.Hard.PageFrameNumber = WsListIndex;
-    /* Hyperspace is local */
-    MI_MAKE_LOCAL_PAGE(&TempPte);
     PdeOffset = MiAddressToPteOffset(MmWorkingSetList);
     HyperTable[PdeOffset] = TempPte;
 
index b794bdb..4f6f11a 100644 (file)
@@ -162,9 +162,9 @@ MiSessionLeader(IN PEPROCESS Process)
     KIRQL OldIrql;
 
     /* Set the flag while under the expansion lock */
-    OldIrql = KeAcquireQueuedSpinLock(LockQueueExpansionLock);
+    OldIrql = MiAcquireExpansionLock();
     Process->Vm.Flags.SessionLeader = TRUE;
-    KeReleaseQueuedSpinLock(LockQueueExpansionLock, OldIrql);
+    MiReleaseExpansionLock(OldIrql);
 }
 
 ULONG
@@ -517,7 +517,7 @@ MiSessionInitializeWorkingSetList(VOID)
         }
 
         /* Write a valid PDE for it */
-        TempPde.u.Long = ValidKernelPdeLocal.u.Long;
+        TempPde = ValidKernelPdeLocal;
         TempPde.u.Hard.PageFrameNumber = PageFrameIndex;
         MI_WRITE_VALID_PDE(PointerPde, TempPde);
 
@@ -548,7 +548,7 @@ MiSessionInitializeWorkingSetList(VOID)
     }
 
     /* Write a valid PTE for it */
-    TempPte.u.Long = ValidKernelPteLocal.u.Long;
+    TempPte = ValidKernelPteLocal;
     MI_MAKE_DIRTY_PAGE(&TempPte);
     TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
 
@@ -667,7 +667,7 @@ MiSessionCreateInternal(OUT PULONG SessionId)
     OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
 
     /* Loop the global PTEs */
-    TempPte.u.Long = ValidKernelPte.u.Long;
+    TempPte = ValidKernelPte;
     for (i = 0; i < MiSessionDataPages; i++)
     {
         /* Get a zeroed colored zero page */
@@ -707,7 +707,7 @@ MiSessionCreateInternal(OUT PULONG SessionId)
     }
 
     /* Fill the PTE out */
-    TempPde.u.Long = ValidKernelPdeLocal.u.Long;
+    TempPde = ValidKernelPdeLocal;
     TempPde.u.Hard.PageFrameNumber = SessionPageDirIndex;
 
     /* Setup, allocate, fill out the MmSessionSpace PTE */
@@ -720,7 +720,7 @@ MiSessionCreateInternal(OUT PULONG SessionId)
     ASSERT(MI_PFN_ELEMENT(SessionPageDirIndex)->u1.WsIndex == 0);
 
      /* Loop all the local PTEs for it */
-    TempPte.u.Long = ValidKernelPteLocal.u.Long;
+    TempPte = ValidKernelPteLocal;
     PointerPte = MiAddressToPte(MmSessionSpace);
     for (i = 0; i < MiSessionDataPages; i++)
     {