diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index cdc2881ef3b..ab52df06ef2 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -11,6 +11,13 @@ #define MI_MAX_NONPAGED_POOL_SIZE (128 * 1024 * 1024) #define MI_MAX_FREE_PAGE_LISTS 4 +typedef enum _MMSYSTEM_PTE_POOL_TYPE +{ + SystemPteSpace, + NonPagedPoolExpansion, + MaximumPtePoolTypes +} MMSYSTEM_PTE_POOL_TYPE; + extern MMPTE HyperTemplatePte; extern ULONG MmSizeOfNonPagedPoolInBytes; @@ -24,4 +31,12 @@ MiInitializeArmPool( VOID ); +VOID +NTAPI +MiInitializeSystemPtes( + IN PMMPTE StartingPte, + IN ULONG NumberOfPtes, + IN MMSYSTEM_PTE_POOL_TYPE PoolType +); + /* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/pool.c b/reactos/ntoskrnl/mm/ARM3/pool.c index 63e0b536359..32f377b8b2b 100644 --- a/reactos/ntoskrnl/mm/ARM3/pool.c +++ b/reactos/ntoskrnl/mm/ARM3/pool.c @@ -120,6 +120,9 @@ MiInitializeArmPool(VOID) // guard page on top so make sure to skip it. The bottom guard page will be // guaranteed by the fact our size is off by one. // + MiInitializeSystemPtes(PointerPte + 1, + MiExpansionPoolPagesInitialCharge, + NonPagedPoolExpansion); } /* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/syspte.c b/reactos/ntoskrnl/mm/ARM3/syspte.c new file mode 100644 index 00000000000..a9a09ed7b57 --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/syspte.c @@ -0,0 +1,76 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/syspte.c + * PURPOSE: ARM Memory Manager System PTE Allocator + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARM³::SYSPTE" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + +/* GLOBALS ********************************************************************/ + +PMMPTE MmSystemPteBase; +PMMPTE MmSystemPtesStart[MaximumPtePoolTypes]; +PMMPTE MmSystemPtesEnd[MaximumPtePoolTypes]; +MMPTE MmFirstFreeSystemPte[MaximumPtePoolTypes]; +ULONG MmTotalFreeSystemPtes[MaximumPtePoolTypes]; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +NTAPI +MiInitializeSystemPtes(IN PMMPTE StartingPte, + IN ULONG NumberOfPtes, + IN MMSYSTEM_PTE_POOL_TYPE PoolType) +{ + // + // Sanity checks + // + ASSERT(NumberOfPtes >= 1); + ASSERT(PoolType == NonPagedPoolExpansion); + + // + // Set the starting and ending PTE addresses for this space + // + MmSystemPteBase = (PVOID)PAGETABLE_MAP; + MmSystemPtesStart[PoolType] = StartingPte; + MmSystemPtesEnd[PoolType] = StartingPte + NumberOfPtes - 1; + DPRINT1("System PTE space for %d starting at: %p and ending at: %p\n", + PoolType, MmSystemPtesStart[PoolType], MmSystemPtesEnd[PoolType]); + + // + // Clear all the PTEs to start with + // + RtlZeroMemory(StartingPte, NumberOfPtes * sizeof(MMPTE)); + + // + // Make the first entry free and link it + // + StartingPte->u.List.NextEntry = -1; + MmFirstFreeSystemPte[PoolType].u.Long = 0; + MmFirstFreeSystemPte[PoolType].u.List.NextEntry = StartingPte - + MmSystemPteBase; + + // + // The second entry stores the size of this PTE space + // + StartingPte++; + StartingPte->u.Long = 0; + StartingPte->u.List.NextEntry = NumberOfPtes; + + // + // We also keep a global for it + // + MmTotalFreeSystemPtes[PoolType] = NumberOfPtes; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index 5240db23593..e35eedac8aa 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -362,6 +362,7 @@ init.c pool.c + syspte.c anonmem.c balance.c