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
This commit is contained in:
Stefan Ginsberg 2015-10-15 01:49:26 +00:00
parent caccb5cc8f
commit b7d35a7776
7 changed files with 11 additions and 16 deletions

View file

@ -85,7 +85,6 @@
#define PFN_FROM_PXE(v) ((v)->u.Hard.PageFrameNumber) #define PFN_FROM_PXE(v) ((v)->u.Hard.PageFrameNumber)
/* Macros for portable PTE modification */ /* 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_DIRTY_PAGE(x) ((x)->u.Hard.Dirty = 1)
#define MI_MAKE_CLEAN_PAGE(x) ((x)->u.Hard.Dirty = 0) #define MI_MAKE_CLEAN_PAGE(x) ((x)->u.Hard.Dirty = 0)
#define MI_MAKE_ACCESSED_PAGE(x) ((x)->u.Hard.Accessed = 1) #define MI_MAKE_ACCESSED_PAGE(x) ((x)->u.Hard.Accessed = 1)

View file

@ -74,7 +74,6 @@
#define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber) #define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber)
/* Macros for portable PTE modification */ /* 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_DIRTY_PAGE(x)
#define MI_MAKE_CLEAN_PAGE(x) #define MI_MAKE_CLEAN_PAGE(x)
#define MI_MAKE_ACCESSED_PAGE(x) #define MI_MAKE_ACCESSED_PAGE(x)

View file

@ -89,7 +89,6 @@
#define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber) #define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber)
/* Macros for portable PTE modification */ /* 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_DIRTY_PAGE(x) ((x)->u.Hard.Dirty = 1)
#define MI_MAKE_CLEAN_PAGE(x) ((x)->u.Hard.Dirty = 0) #define MI_MAKE_CLEAN_PAGE(x) ((x)->u.Hard.Dirty = 0)
#define MI_MAKE_ACCESSED_PAGE(x) ((x)->u.Hard.Accessed = 1) #define MI_MAKE_ACCESSED_PAGE(x) ((x)->u.Hard.Accessed = 1)

View file

@ -44,9 +44,8 @@ MiMapPageInHyperSpace(IN PEPROCESS Process,
// //
// Build the PTE // Build the PTE
// //
TempPte = ValidKernelPte; TempPte = ValidKernelPteLocal;
TempPte.u.Hard.PageFrameNumber = Page; TempPte.u.Hard.PageFrameNumber = Page;
MI_MAKE_LOCAL_PAGE(&TempPte); // Hyperspace is local!
// //
// Pick the first hyperspace PTE // Pick the first hyperspace PTE

View file

@ -492,8 +492,8 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
MI_SET_USAGE(MI_USAGE_PAGE_TABLE); MI_SET_USAGE(MI_USAGE_PAGE_TABLE);
MI_SET_PROCESS2("Kernel"); MI_SET_PROCESS2("Kernel");
PageFrameIndex = MiRemoveAnyPage(0); PageFrameIndex = MiRemoveAnyPage(0);
TempPde = ValidKernelPdeLocal;
TempPde.u.Hard.PageFrameNumber = PageFrameIndex; TempPde.u.Hard.PageFrameNumber = PageFrameIndex;
TempPde.u.Hard.Global = FALSE; // Hyperspace is local!
MI_WRITE_VALID_PTE(StartPde, TempPde); MI_WRITE_VALID_PTE(StartPde, TempPde);
/* Flush the TLB */ /* Flush the TLB */
@ -542,6 +542,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
MI_SET_USAGE(MI_USAGE_PAGE_TABLE); MI_SET_USAGE(MI_USAGE_PAGE_TABLE);
MI_SET_PROCESS2("Kernel WS List"); MI_SET_PROCESS2("Kernel WS List");
PageFrameIndex = MiRemoveAnyPage(0); PageFrameIndex = MiRemoveAnyPage(0);
TempPte = ValidKernelPteLocal;
TempPte.u.Hard.PageFrameNumber = PageFrameIndex; TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
/* Map the working set list */ /* Map the working set list */

View file

@ -1163,10 +1163,8 @@ MmCreateProcessAddressSpace(IN ULONG MinWs,
HyperTable = MiPteToAddress(PointerPte); HyperTable = MiPteToAddress(PointerPte);
/* Now write the PTE/PDE entry for the working set list index itself */ /* Now write the PTE/PDE entry for the working set list index itself */
TempPte = ValidKernelPte; TempPte = ValidKernelPteLocal;
TempPte.u.Hard.PageFrameNumber = WsListIndex; TempPte.u.Hard.PageFrameNumber = WsListIndex;
/* Hyperspace is local */
MI_MAKE_LOCAL_PAGE(&TempPte);
PdeOffset = MiAddressToPteOffset(MmWorkingSetList); PdeOffset = MiAddressToPteOffset(MmWorkingSetList);
HyperTable[PdeOffset] = TempPte; HyperTable[PdeOffset] = TempPte;

View file

@ -162,9 +162,9 @@ MiSessionLeader(IN PEPROCESS Process)
KIRQL OldIrql; KIRQL OldIrql;
/* Set the flag while under the expansion lock */ /* Set the flag while under the expansion lock */
OldIrql = KeAcquireQueuedSpinLock(LockQueueExpansionLock); OldIrql = MiAcquireExpansionLock();
Process->Vm.Flags.SessionLeader = TRUE; Process->Vm.Flags.SessionLeader = TRUE;
KeReleaseQueuedSpinLock(LockQueueExpansionLock, OldIrql); MiReleaseExpansionLock(OldIrql);
} }
ULONG ULONG
@ -517,7 +517,7 @@ MiSessionInitializeWorkingSetList(VOID)
} }
/* Write a valid PDE for it */ /* Write a valid PDE for it */
TempPde.u.Long = ValidKernelPdeLocal.u.Long; TempPde = ValidKernelPdeLocal;
TempPde.u.Hard.PageFrameNumber = PageFrameIndex; TempPde.u.Hard.PageFrameNumber = PageFrameIndex;
MI_WRITE_VALID_PDE(PointerPde, TempPde); MI_WRITE_VALID_PDE(PointerPde, TempPde);
@ -548,7 +548,7 @@ MiSessionInitializeWorkingSetList(VOID)
} }
/* Write a valid PTE for it */ /* Write a valid PTE for it */
TempPte.u.Long = ValidKernelPteLocal.u.Long; TempPte = ValidKernelPteLocal;
MI_MAKE_DIRTY_PAGE(&TempPte); MI_MAKE_DIRTY_PAGE(&TempPte);
TempPte.u.Hard.PageFrameNumber = PageFrameIndex; TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
@ -667,7 +667,7 @@ MiSessionCreateInternal(OUT PULONG SessionId)
OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
/* Loop the global PTEs */ /* Loop the global PTEs */
TempPte.u.Long = ValidKernelPte.u.Long; TempPte = ValidKernelPte;
for (i = 0; i < MiSessionDataPages; i++) for (i = 0; i < MiSessionDataPages; i++)
{ {
/* Get a zeroed colored zero page */ /* Get a zeroed colored zero page */
@ -707,7 +707,7 @@ MiSessionCreateInternal(OUT PULONG SessionId)
} }
/* Fill the PTE out */ /* Fill the PTE out */
TempPde.u.Long = ValidKernelPdeLocal.u.Long; TempPde = ValidKernelPdeLocal;
TempPde.u.Hard.PageFrameNumber = SessionPageDirIndex; TempPde.u.Hard.PageFrameNumber = SessionPageDirIndex;
/* Setup, allocate, fill out the MmSessionSpace PTE */ /* Setup, allocate, fill out the MmSessionSpace PTE */
@ -720,7 +720,7 @@ MiSessionCreateInternal(OUT PULONG SessionId)
ASSERT(MI_PFN_ELEMENT(SessionPageDirIndex)->u1.WsIndex == 0); ASSERT(MI_PFN_ELEMENT(SessionPageDirIndex)->u1.WsIndex == 0);
/* Loop all the local PTEs for it */ /* Loop all the local PTEs for it */
TempPte.u.Long = ValidKernelPteLocal.u.Long; TempPte = ValidKernelPteLocal;
PointerPte = MiAddressToPte(MmSessionSpace); PointerPte = MiAddressToPte(MmSessionSpace);
for (i = 0; i < MiSessionDataPages; i++) for (i = 0; i < MiSessionDataPages; i++)
{ {