Author: tfaber
Date: Sun Jul 19 08:29:58 2015
New Revision: 68421
URL:
http://svn.reactos.org/svn/reactos?rev=68421&view=rev
Log:
[NTOS:MM]
- Simplify MiInitSystemMemoryAreas by introducing a helper, MiCreateArm3StaticMemoryArea.
Patch by Mike Nordell
Modified:
trunk/reactos/ntoskrnl/mm/mminit.c
Modified: trunk/reactos/ntoskrnl/mm/mminit.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/mminit.c?rev=6…
==============================================================================
--- trunk/reactos/ntoskrnl/mm/mminit.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/mminit.c [iso-8859-1] Sun Jul 19 08:29:58 2015
@@ -38,198 +38,83 @@
/* PRIVATE FUNCTIONS *********************************************************/
+//
+// Helper function to create initial memory areas.
+// The created area is always read/write.
+//
VOID
INIT_FUNCTION
NTAPI
-MiInitSystemMemoryAreas()
-{
- PVOID BaseAddress;
+MiCreateArm3StaticMemoryArea(PVOID BaseAddress, ULONG Size, BOOLEAN Executable)
+{
+ const ULONG Protection = Executable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE;
+ PVOID pBaseAddress = BaseAddress;
PMEMORY_AREA MArea;
NTSTATUS Status;
- //
- // Create the memory area to define the loader mappings
- //
- BaseAddress = (PVOID)KSEG0_BASE;
Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
- &BaseAddress,
- MmBootImageSize,
- PAGE_EXECUTE_READWRITE,
+ &pBaseAddress,
+ Size,
+ Protection,
&MArea,
0,
PAGE_SIZE);
ASSERT(Status == STATUS_SUCCESS);
-
- //
- // Create the memory area to define the PTE base
- //
- BaseAddress = (PVOID)PTE_BASE;
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
- &BaseAddress,
- PTE_TOP - PTE_BASE + 1,
- PAGE_READWRITE,
- &MArea,
- 0,
- PAGE_SIZE);
- ASSERT(Status == STATUS_SUCCESS);
-
- //
- // Create the memory area to define Hyperspace
- //
- BaseAddress = (PVOID)HYPER_SPACE;
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
- &BaseAddress,
- HYPER_SPACE_END - HYPER_SPACE + 1,
- PAGE_READWRITE,
- &MArea,
- 0,
- PAGE_SIZE);
- ASSERT(Status == STATUS_SUCCESS);
-
- //
+ // TODO: Perhaps it would be prudent to bugcheck here, not only assert?
+}
+
+VOID
+INIT_FUNCTION
+NTAPI
+MiInitSystemMemoryAreas()
+{
+ //
+ // Create all the static memory areas.
+ //
+
+ // The loader mappings. The only Executable area.
+ MiCreateArm3StaticMemoryArea((PVOID)KSEG0_BASE, MmBootImageSize, TRUE);
+
+ // The PTE base
+ MiCreateArm3StaticMemoryArea((PVOID)PTE_BASE, PTE_TOP - PTE_BASE + 1, FALSE);
+
+ // Hyperspace
+ MiCreateArm3StaticMemoryArea((PVOID)HYPER_SPACE, HYPER_SPACE_END - HYPER_SPACE + 1,
FALSE);
+
// Protect the PFN database
- //
- BaseAddress = MmPfnDatabase;
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
- &BaseAddress,
- (MxPfnAllocation << PAGE_SHIFT),
- PAGE_READWRITE,
- &MArea,
- 0,
- PAGE_SIZE);
- ASSERT(Status == STATUS_SUCCESS);
-
- //
+ MiCreateArm3StaticMemoryArea(MmPfnDatabase, (MxPfnAllocation << PAGE_SHIFT),
FALSE);
+
// ReactOS requires a memory area to keep the initial NP area off-bounds
- //
- BaseAddress = MmNonPagedPoolStart;
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
- &BaseAddress,
- MmSizeOfNonPagedPoolInBytes,
- PAGE_READWRITE,
- &MArea,
- 0,
- PAGE_SIZE);
- ASSERT(Status == STATUS_SUCCESS);
-
- //
- // And we need one more for the system NP
- //
- BaseAddress = MmNonPagedSystemStart;
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
- &BaseAddress,
- MiNonPagedSystemSize,
- PAGE_READWRITE,
- &MArea,
- 0,
- PAGE_SIZE);
- ASSERT(Status == STATUS_SUCCESS);
-
- //
- // We also need one for system view space
- //
- BaseAddress = MiSystemViewStart;
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
- &BaseAddress,
- MmSystemViewSize,
- PAGE_READWRITE,
- &MArea,
- 0,
- PAGE_SIZE);
- ASSERT(Status == STATUS_SUCCESS);
-
- //
- // And another for session space
- //
- BaseAddress = MmSessionBase;
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
- &BaseAddress,
- (ULONG_PTR)MiSessionSpaceEnd -
- (ULONG_PTR)MmSessionBase,
- PAGE_READWRITE,
- &MArea,
- 0,
- PAGE_SIZE);
- ASSERT(Status == STATUS_SUCCESS);
-
- //
- // One more for ARM paged pool
- //
- BaseAddress = MmPagedPoolStart;
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
- &BaseAddress,
- MmSizeOfPagedPoolInBytes,
- PAGE_READWRITE,
- &MArea,
- 0,
- PAGE_SIZE);
- ASSERT(Status == STATUS_SUCCESS);
+ MiCreateArm3StaticMemoryArea(MmNonPagedPoolStart, MmSizeOfNonPagedPoolInBytes,
FALSE);
+
+ // System NP
+ MiCreateArm3StaticMemoryArea(MmNonPagedSystemStart, MiNonPagedSystemSize, FALSE);
+
+ // System view space
+ MiCreateArm3StaticMemoryArea(MiSystemViewStart, MmSystemViewSize, FALSE);
+
+ // Session space
+ MiCreateArm3StaticMemoryArea(MmSessionBase, (ULONG_PTR)MiSessionSpaceEnd -
(ULONG_PTR)MmSessionBase, FALSE);
+
+ // Paged pool
+ MiCreateArm3StaticMemoryArea(MmPagedPoolStart, MmSizeOfPagedPoolInBytes, FALSE);
+
#ifndef _M_AMD64
- //
- // Next, the KPCR
- //
- BaseAddress = (PVOID)PCR;
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
- &BaseAddress,
- PAGE_SIZE * KeNumberProcessors,
- PAGE_READWRITE,
- &MArea,
- 0,
- PAGE_SIZE);
- ASSERT(Status == STATUS_SUCCESS);
+ // KPCR, one page per CPU. Only for 32-bit kernel.
+ MiCreateArm3StaticMemoryArea(PCR, PAGE_SIZE * KeNumberProcessors, FALSE);
#endif
- //
- // Now the KUSER_SHARED_DATA
- //
- BaseAddress = (PVOID)KI_USER_SHARED_DATA;
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
- &BaseAddress,
- PAGE_SIZE,
- PAGE_READWRITE,
- &MArea,
- 0,
- PAGE_SIZE);
- ASSERT(Status == STATUS_SUCCESS);
-
- //
- // And the debugger mapping
- //
- BaseAddress = MI_DEBUG_MAPPING;
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
- &BaseAddress,
- PAGE_SIZE,
- PAGE_READWRITE,
- &MArea,
- 0,
- PAGE_SIZE);
- ASSERT(Status == STATUS_SUCCESS);
+
+ // KUSER_SHARED_DATA
+ MiCreateArm3StaticMemoryArea((PVOID)KI_USER_SHARED_DATA, PAGE_SIZE, FALSE);
+
+ // Debugger mapping
+ MiCreateArm3StaticMemoryArea(MI_DEBUG_MAPPING, PAGE_SIZE, FALSE);
#if defined(_X86_)
- //
- // Finally, reserve the 2 pages we currently make use of for HAL mappings
- //
- BaseAddress = (PVOID)0xFFC00000;
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
- &BaseAddress,
- PAGE_SIZE * 2,
- PAGE_READWRITE,
- &MArea,
- 0,
- PAGE_SIZE);
- ASSERT(Status == STATUS_SUCCESS);
+ // Reserve the 2 pages we currently make use of for HAL mappings.
+ // TODO: Remove hard-coded constant and replace with a define.
+ MiCreateArm3StaticMemoryArea((PVOID)0xFFC00000, PAGE_SIZE * 2, FALSE);
#endif
}