[ros-diffs] [ros-arm-bringup] 41527: - Initialize the ARM pool (MiInitializeArmPool): - Do some additional accounting to keep track of initial nonpaged pool range and size. - Create and initialize the free page lists, and free page entries. - Validate that the initial nonpaged pool address space was properly mapped. - Validate that the expansion nonpaged pool address space is unmapped, and prepare to map it.

ros-arm-bringup at svn.reactos.org ros-arm-bringup at svn.reactos.org
Mon Jun 22 10:22:42 CEST 2009


Author: ros-arm-bringup
Date: Mon Jun 22 12:22:41 2009
New Revision: 41527

URL: http://svn.reactos.org/svn/reactos?rev=41527&view=rev
Log:
- Initialize the ARM pool (MiInitializeArmPool):
  - Do some additional accounting to keep track of initial nonpaged pool range and size.
  - Create and initialize the free page lists, and free page entries.
  - Validate that the initial nonpaged pool address space was properly mapped.
  - Validate that the expansion nonpaged pool address space is unmapped, and prepare to map it.


Added:
    trunk/reactos/ntoskrnl/mm/ARM3/pool.c   (with props)
Modified:
    trunk/reactos/ntoskrnl/mm/ARM3/init.c
    trunk/reactos/ntoskrnl/mm/ARM3/miarm.h
    trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild

Modified: trunk/reactos/ntoskrnl/mm/ARM3/init.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/init.c?rev=41527&r1=41526&r2=41527&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/init.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/init.c [iso-8859-1] Mon Jun 22 12:22:41 2009
@@ -362,6 +362,11 @@
                                     0,
                                     BoundaryAddressMultiple);
         ASSERT(Status == STATUS_SUCCESS);
+        
+        //
+        // Now go ahead and initialize the ARM pool
+        //
+        MiInitializeArmPool();
     }
     
     //

Modified: trunk/reactos/ntoskrnl/mm/ARM3/miarm.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/miarm.h?rev=41527&r1=41526&r2=41527&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/miarm.h [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/miarm.h [iso-8859-1] Mon Jun 22 12:22:41 2009
@@ -9,7 +9,19 @@
 #define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING ((255*1024*1024) >> PAGE_SHIFT)
 #define MI_MAX_INIT_NONPAGED_POOL_SIZE         (128 * 1024 * 1024)
 #define MI_MAX_NONPAGED_POOL_SIZE              (128 * 1024 * 1024)
+#define MI_MAX_FREE_PAGE_LISTS                 4
 
 extern MMPTE HyperTemplatePte;
 
+extern ULONG MmSizeOfNonPagedPoolInBytes;
+extern ULONG MmMaximumNonPagedPoolInBytes;
+extern PVOID MmNonPagedPoolStart;
+extern PVOID MmNonPagedPoolExpansionStart;
+
+VOID
+NTAPI
+MiInitializeArmPool(
+    VOID
+);
+
 /* EOF */

Added: trunk/reactos/ntoskrnl/mm/ARM3/pool.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/pool.c?rev=41527&view=auto
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/pool.c (added)
+++ trunk/reactos/ntoskrnl/mm/ARM3/pool.c [iso-8859-1] Mon Jun 22 12:22:41 2009
@@ -1,0 +1,125 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            ntoskrnl/mm/ARM3/pool.c
+ * PURPOSE:         ARM Memory Manager Pool Allocator
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <debug.h>
+
+#line 15 "ARM³::POOL"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../ARM3/miarm.h"
+
+/* GLOBALS ********************************************************************/
+
+LIST_ENTRY MmNonPagedPoolFreeListHead[MI_MAX_FREE_PAGE_LISTS];
+PFN_NUMBER MmNumberOfFreeNonPagedPool, MiExpansionPoolPagesInitialCharge;
+PVOID MmNonPagedPoolEnd0;
+PFN_NUMBER MiStartOfInitialPoolFrame, MiEndOfInitialPoolFrame;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+VOID
+NTAPI
+MiInitializeArmPool(VOID)
+{
+    ULONG i;
+    PFN_NUMBER PoolPages;
+    PMMFREE_POOL_ENTRY FreeEntry, FirstEntry;
+    PMMPTE PointerPte;
+    PAGED_CODE();
+
+    //
+    // We keep 4 lists of free pages (4 lists help avoid contention)
+    //
+    for (i = 0; i < MI_MAX_FREE_PAGE_LISTS; i++)
+    {
+        //
+        // Initialize each of them
+        //
+        InitializeListHead(&MmNonPagedPoolFreeListHead[i]);
+    }
+
+    //
+    // Calculate how many pages the initial nonpaged pool has
+    //
+    PoolPages = BYTES_TO_PAGES(MmSizeOfNonPagedPoolInBytes);
+    MmNumberOfFreeNonPagedPool = PoolPages;
+       
+    //
+    // Initialize the first free entry
+    //
+    FreeEntry = MmNonPagedPoolStart;
+    FirstEntry = FreeEntry;
+    FreeEntry->Size = PoolPages;
+    FreeEntry->Owner = FirstEntry;
+
+    //
+    // Insert it into the last list
+    //
+    InsertHeadList(&MmNonPagedPoolFreeListHead[MI_MAX_FREE_PAGE_LISTS - 1],
+                   &FreeEntry->List);
+    
+    //
+    // Now create free entries for every single other page
+    //
+    while (PoolPages-- > 1)
+    {
+        //
+        // Link them all back to the original entry
+        //
+        FreeEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)FreeEntry + PAGE_SIZE);
+        FreeEntry->Owner = FirstEntry;
+    }
+
+    //
+    // Validate and remember first allocated pool page
+    //
+    PointerPte = MiAddressToPte(MmNonPagedPoolStart);
+    ASSERT(PointerPte->u.Hard.Valid == 1);
+    MiStartOfInitialPoolFrame = PFN_FROM_PTE(PointerPte);
+    
+    //
+    // Keep track of where initial nonpaged pool ends
+    //
+    MmNonPagedPoolEnd0 = (PVOID)((ULONG_PTR)MmNonPagedPoolStart +
+                                 MmSizeOfNonPagedPoolInBytes);
+    
+    //
+    // Validate and remember last allocated pool page
+    //
+    PointerPte = MiAddressToPte((PVOID)((ULONG_PTR)MmNonPagedPoolEnd0 - 1));
+    ASSERT(PointerPte->u.Hard.Valid == 1);
+    MiEndOfInitialPoolFrame = PFN_FROM_PTE(PointerPte);
+    
+    //
+    // Validate the first nonpaged pool expansion page (which is a guard page)
+    //
+    PointerPte = MiAddressToPte(MmNonPagedPoolExpansionStart);
+    ASSERT(PointerPte->u.Hard.Valid == 0);
+    
+    //
+    // Calculate the size of the expansion region alone
+    //
+    MiExpansionPoolPagesInitialCharge =
+    BYTES_TO_PAGES(MmMaximumNonPagedPoolInBytes - MmSizeOfNonPagedPoolInBytes);
+    
+    //
+    // Remove 2 pages, since there's a guard page on top and on the bottom
+    //
+    MiExpansionPoolPagesInitialCharge -= 2;
+    
+    //
+    // Now initialize the nonpaged pool expansion PTE space. Remember there's a
+    // 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.
+    //
+}
+
+/* EOF */

Propchange: trunk/reactos/ntoskrnl/mm/ARM3/pool.c
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: trunk/reactos/ntoskrnl/mm/ARM3/pool.c
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild?rev=41527&r1=41526&r2=41527&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild [iso-8859-1] Mon Jun 22 12:22:41 2009
@@ -361,6 +361,7 @@
 		</if>
 		<directory name="ARM3">
 			<file>init.c</file>
+			<file>pool.c</file>
 		</directory>
 		<file>anonmem.c</file>
 		<file>balance.c</file>



More information about the Ros-diffs mailing list