- Introduce a new MEMORY_AREA flag, MEMORY_AREA_STATIC:
authorReactOS Portable Systems Group <ros-arm-bringup@svn.reactos.org>
Sun, 21 Jun 2009 05:46:50 +0000 (05:46 +0000)
committerReactOS Portable Systems Group <ros-arm-bringup@svn.reactos.org>
Sun, 21 Jun 2009 05:46:50 +0000 (05:46 +0000)
  - MEMORY_AREA structures are typically allocated from nonpaged pool, under the assumption it exists.
  - However, nonpaged pool itself is described by a MEMORY_AREA.  Right now, this MEMORY_AREA is created after nonpaged pool has been initialized (it is a miracle this works).
  - This new flag allows MEMORY_AREA structures to be allocated statically, allowing the description of certain system address space components, themselves prerequisites to nonpaged pool creation, as well as the nonpaged pool component itself, before nonpaged pool has been initialized.
  - This is not yet used.

svn path=/trunk/; revision=41509

reactos/ntoskrnl/include/internal/mm.h
reactos/ntoskrnl/mm/marea.c

index 75fd0e5..cf9a02e 100644 (file)
@@ -29,6 +29,8 @@ struct _MM_PAGEOP;
 typedef ULONG SWAPENTRY;
 typedef ULONG PFN_TYPE, *PPFN_TYPE;
 
+#define MI_STATIC_MEMORY_AREAS              (1)
+
 #define MEMORY_AREA_INVALID                 (0)
 #define MEMORY_AREA_SECTION_VIEW            (1)
 #define MEMORY_AREA_CONTINUOUS_MEMORY       (2)
@@ -43,6 +45,7 @@ typedef ULONG PFN_TYPE, *PPFN_TYPE;
 #define MEMORY_AREA_PAGED_POOL              (12)
 #define MEMORY_AREA_NO_ACCESS               (13)
 #define MEMORY_AREA_PEB_OR_TEB              (14)
+#define MEMORY_AREA_STATIC                  (0x80000000)
 
 #define MM_PHYSICAL_PAGE_MPW_PENDING        (0x8)
 
index 131225f..5fe3097 100644 (file)
@@ -49,6 +49,9 @@
 #pragma alloc_text(INIT, MmInitMemoryAreas)
 #endif
 
+MEMORY_AREA MiStaticMemoryAreas[MI_STATIC_MEMORY_AREAS];
+ULONG MiStaticMemoryAreaCount;
+
 /* #define VALIDATE_MEMORY_AREAS */
 
 /* FUNCTIONS *****************************************************************/
@@ -986,9 +989,28 @@ MmCreateMemoryArea(PMMSUPPORT AddressSpace,
          return STATUS_CONFLICTING_ADDRESSES;
       }
    }
-
-   MemoryArea = ExAllocatePoolWithTag(NonPagedPool, sizeof(MEMORY_AREA),
-                                      TAG_MAREA);
+    
+    //
+    // Is this a static memory area?
+    //
+    if (Type & MEMORY_AREA_STATIC)
+    {
+        //
+        // Use the static array instead of the pool
+        //
+        ASSERT(MiStaticMemoryAreaCount < MI_STATIC_MEMORY_AREAS);
+        MemoryArea = &MiStaticMemoryAreas[MiStaticMemoryAreaCount++];
+    }
+    else
+    {
+        //
+        // Allocate the memory area from nonpaged pool
+        //
+        MemoryArea = ExAllocatePoolWithTag(NonPagedPool,
+                                           sizeof(MEMORY_AREA),
+                                           TAG_MAREA);
+    }
+    
    RtlZeroMemory(MemoryArea, sizeof(MEMORY_AREA));
    MemoryArea->Type = Type;
    MemoryArea->StartingAddress = *BaseAddress;