From 076a3c9cb7e04feb8a91002564d2c5bf48379042 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Fri, 30 Sep 2016 15:58:23 +0000 Subject: [PATCH 1/1] [NTOS:MM] - Get rid of MiNonPagedSystemSize, which is misleading because MmNumberOfSystemPtes can change throughout the startup process, thus invalidating this size variable - Correctly reserve the system PTE space and nonpaged pool expansion space in MiInitSystemMemoryAreas Should fix the remaining "Bad PTE" bug checks when running out of kernel address space. CORE-11533 #resolve CORE-11160 CORE-10611 CORE-11926 CORE-11873 CORE-11554 #comment This should be fixed with r72869, please retest. svn path=/trunk/; revision=72869 --- reactos/ntoskrnl/mm/ARM3/i386/init.c | 5 +++-- reactos/ntoskrnl/mm/ARM3/miarm.h | 1 - reactos/ntoskrnl/mm/ARM3/mminit.c | 1 - reactos/ntoskrnl/mm/amd64/init.c | 7 ++++--- reactos/ntoskrnl/mm/mminit.c | 7 +++++-- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index abb01a9a0b6..05c1007d519 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -245,6 +245,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) PMMPTE StartPde, EndPde, PointerPte, LastPte; MMPTE TempPde, TempPte; PVOID NonPagedPoolExpansionVa; + SIZE_T NonPagedSystemSize; KIRQL OldIrql; PMMPFN Pfn1; ULONG Flags; @@ -298,9 +299,9 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) // nonpaged pool expansion (above) and the system PTEs. Note that it is // then aligned to a PDE boundary (4MB). // - MiNonPagedSystemSize = (MmNumberOfSystemPtes + 1) * PAGE_SIZE; + NonPagedSystemSize = (MmNumberOfSystemPtes + 1) * PAGE_SIZE; MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedPoolStart - - MiNonPagedSystemSize); + NonPagedSystemSize); MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedSystemStart & ~(PDE_MAPPED_VA - 1)); diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 9d264043096..af8c8302c3b 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -527,7 +527,6 @@ extern SIZE_T MmMaximumNonPagedPoolInBytes; extern PFN_NUMBER MmMaximumNonPagedPoolInPages; extern PFN_NUMBER MmSizeOfPagedPoolInPages; extern PVOID MmNonPagedSystemStart; -extern SIZE_T MiNonPagedSystemSize; extern PVOID MmNonPagedPoolStart; extern PVOID MmNonPagedPoolExpansionStart; extern PVOID MmNonPagedPoolEnd; diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index d29e5b72757..cd7b130ffef 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -94,7 +94,6 @@ ULONG MmMaxAdditionNonPagedPoolPerMb = 400 * 1024; // http://www.ditii.com/2007/09/28/windows-memory-management-x86-virtual-address-space/ // PVOID MmNonPagedSystemStart; -SIZE_T MiNonPagedSystemSize; PVOID MmNonPagedPoolStart; PVOID MmNonPagedPoolExpansionStart; PVOID MmNonPagedPoolEnd = MI_NONPAGED_POOL_END; diff --git a/reactos/ntoskrnl/mm/amd64/init.c b/reactos/ntoskrnl/mm/amd64/init.c index bff3d27d4f1..f8d820acb79 100644 --- a/reactos/ntoskrnl/mm/amd64/init.c +++ b/reactos/ntoskrnl/mm/amd64/init.c @@ -370,14 +370,15 @@ INIT_FUNCTION MiBuildSystemPteSpace(VOID) { PMMPTE PointerPte; + SIZE_T NonPagedSystemSize; - /* Use the default numer of system PTEs */ + /* Use the default number of system PTEs */ MmNumberOfSystemPtes = MI_NUMBER_SYSTEM_PTES; - MiNonPagedSystemSize = (MmNumberOfSystemPtes + 1) * PAGE_SIZE; + NonPagedSystemSize = (MmNumberOfSystemPtes + 1) * PAGE_SIZE; /* Put system PTEs at the start of the system VA space */ MiSystemPteSpaceStart = MmNonPagedSystemStart; - MiSystemPteSpaceEnd = (PUCHAR)MiSystemPteSpaceStart + MiNonPagedSystemSize; + MiSystemPteSpaceEnd = (PUCHAR)MiSystemPteSpaceStart + NonPagedSystemSize; /* Map the PPEs and PDEs for the system PTEs */ MiMapPPEs(MiSystemPteSpaceStart, MiSystemPteSpaceEnd); diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 76cf00e138b..5e066c426b6 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -88,8 +88,11 @@ MiInitSystemMemoryAreas(VOID) // ReactOS requires a memory area to keep the initial NP area off-bounds MiCreateArm3StaticMemoryArea(MmNonPagedPoolStart, MmSizeOfNonPagedPoolInBytes, FALSE); - // System NP - MiCreateArm3StaticMemoryArea(MmNonPagedSystemStart, MiNonPagedSystemSize, FALSE); + // System PTE space + MiCreateArm3StaticMemoryArea(MmNonPagedSystemStart, (MmNumberOfSystemPtes + 1) * PAGE_SIZE, FALSE); + + // Nonpaged pool expansion space + MiCreateArm3StaticMemoryArea(MmNonPagedPoolExpansionStart, (ULONG_PTR)MmNonPagedPoolEnd - (ULONG_PTR)MmNonPagedPoolExpansionStart, FALSE); // System view space MiCreateArm3StaticMemoryArea(MiSystemViewStart, MmSystemViewSize, FALSE); -- 2.17.1