PLIST_ENTRY NextEntry;
PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
ULONG FreePages = 0;
- PMEMORY_AREA MArea;
- PHYSICAL_ADDRESS BoundaryAddressMultiple;
PFN_NUMBER PageFrameIndex;
PMMPTE StartPde, EndPde, PointerPte, LastPte;
MMPTE TempPde = HyperTemplatePte, TempPte = HyperTemplatePte;
- PVOID NonPagedPoolExpansionVa, BaseAddress;
- NTSTATUS Status;
+ PVOID NonPagedPoolExpansionVa;
ULONG OldCount;
BOOLEAN IncludeType[LoaderMaximum];
ULONG i;
PVOID Bitmap;
PPHYSICAL_MEMORY_RUN Run;
PFN_NUMBER FreePage, FreePageCount, PagesLeft, BasePage, PageCount;
- BoundaryAddressMultiple.QuadPart = 0;
if (Phase == 0)
{
*PointerPte++ = TempPte;
}
- //
- // ReactOS requires a memory area to keep the initial NP area off-bounds
- //
- BaseAddress = MmNonPagedPoolStart;
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC,
- &BaseAddress,
- MmSizeOfNonPagedPoolInBytes,
- PAGE_READWRITE,
- &MArea,
- TRUE,
- 0,
- BoundaryAddressMultiple);
- ASSERT(Status == STATUS_SUCCESS);
-
- //
- // And we need one more for the system NP
- //
- BaseAddress = MmNonPagedSystemStart;
- Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC,
- &BaseAddress,
- (ULONG_PTR)MmNonPagedPoolEnd -
- (ULONG_PTR)MmNonPagedSystemStart,
- PAGE_READWRITE,
- &MArea,
- TRUE,
- 0,
- BoundaryAddressMultiple);
- ASSERT(Status == STATUS_SUCCESS);
-
//
// Sanity check: make sure we have properly defined the system PTE space
//
MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1));
MiSyncARM3WithROS(MmPfnDatabase, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1));
MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1));
- }
- else // NOW WE HAVE NONPAGED POOL
- {
+
//
// Instantiate memory that we don't consider RAM/usable
// We use the same exclusions that Windows does, in order to try to be
// Size up paged pool and build the shadow system page directory
//
MiBuildPagedPool();
-
- //
- // Print the memory layout
- //
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- MmSystemRangeStart,
- (ULONG_PTR)MmSystemRangeStart + MmBootImageSize,
- "Boot Loaded Image");
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- MmPagedPoolBase,
- (ULONG_PTR)MmPagedPoolBase + MmPagedPoolSize,
- "Paged Pool");
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- MmPfnDatabase,
- (ULONG_PTR)MmPfnDatabase + (MxPfnAllocation << PAGE_SHIFT),
- "PFN Database");
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- MmNonPagedPoolStart,
- (ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes,
- "ARM³ Non Paged Pool");
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- MiSystemViewStart,
- (ULONG_PTR)MiSystemViewStart + MmSystemViewSize,
- "System View Space");
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- MmSessionBase,
- MiSessionSpaceEnd,
- "Session Space");
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- PTE_BASE, PDE_BASE,
- "Page Tables");
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- PDE_BASE, HYPER_SPACE,
- "Page Directories");
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- HYPER_SPACE, HYPER_SPACE + (4 * 1024 * 1024),
- "Hyperspace");
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- MmPagedPoolStart,
- (ULONG_PTR)MmPagedPoolStart + MmSizeOfPagedPoolInBytes,
- "ARM³ Paged Pool");
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- MmNonPagedSystemStart, MmNonPagedPoolExpansionStart,
- "System PTE Space");
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- MmNonPagedPoolExpansionStart, MmNonPagedPoolEnd,
- "Non Paged Pool Expansion PTE Space");
}
//
#define NDEBUG
#include <debug.h>
+#define MODULE_INVOLVED_IN_ARM3
+#include "ARM3/miarm.h"
+
/* GLOBALS *******************************************************************/
PCHAR
PVOID BaseAddress;
PHYSICAL_ADDRESS BoundaryAddressMultiple;
PMEMORY_AREA MArea;
+ NTSTATUS Status;
BoundaryAddressMultiple.QuadPart = 0;
//
- // First initialize the page table and hyperspace memory areas
+ // 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,
+ 4 * 1024 * 1024,
+ PAGE_READWRITE,
+ &MArea,
+ TRUE,
+ 0,
+ BoundaryAddressMultiple);
+ 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,
+ 4 * 1024 * 1024,
+ PAGE_READWRITE,
+ &MArea,
+ TRUE,
+ 0,
+ BoundaryAddressMultiple);
+ ASSERT(Status == STATUS_SUCCESS);
+
+ //
+ // Protect the PFN database
+ //
+ BaseAddress = MmPfnDatabase;
+ Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
+ MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
+ &BaseAddress,
+ (MxPfnAllocation << PAGE_SHIFT),
+ PAGE_READWRITE,
+ &MArea,
+ TRUE,
+ 0,
+ BoundaryAddressMultiple);
+ ASSERT(Status == STATUS_SUCCESS);
+
+ //
+ // 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,
+ TRUE,
+ 0,
+ BoundaryAddressMultiple);
+ ASSERT(Status == STATUS_SUCCESS);
+
+ //
+ // And we need one more for the system NP
//
- MiInitPageDirectoryMap();
+ BaseAddress = MmNonPagedSystemStart;
+ Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
+ MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
+ &BaseAddress,
+ (ULONG_PTR)MmNonPagedPoolEnd -
+ (ULONG_PTR)MmNonPagedSystemStart,
+ PAGE_READWRITE,
+ &MArea,
+ TRUE,
+ 0,
+ BoundaryAddressMultiple);
+ 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,
+ TRUE,
+ 0,
+ BoundaryAddressMultiple);
+ 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,
+ TRUE,
+ 0,
+ BoundaryAddressMultiple);
+ 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,
+ TRUE,
+ 0,
+ BoundaryAddressMultiple);
+ ASSERT(Status == STATUS_SUCCESS);
+
+ //
+ // And now, ReactOS paged pool
+ //
+ BaseAddress = MmPagedPoolBase;
+ MmCreateMemoryArea(MmGetKernelAddressSpace(),
+ MEMORY_AREA_PAGED_POOL | MEMORY_AREA_STATIC,
+ &BaseAddress,
+ MmPagedPoolSize,
+ PAGE_READWRITE,
+ &MArea,
+ TRUE,
+ 0,
+ BoundaryAddressMultiple);
//
// Next, the KPCR
//
BaseAddress = (PVOID)PCR;
MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC,
+ MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
&BaseAddress,
PAGE_SIZE * KeNumberProcessors,
PAGE_READWRITE,
TRUE,
0,
BoundaryAddressMultiple);
-
+
//
// Now the KUSER_SHARED_DATA
//
BaseAddress = (PVOID)KI_USER_SHARED_DATA;
MmCreateMemoryArea(MmGetKernelAddressSpace(),
- MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC,
+ MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
&BaseAddress,
PAGE_SIZE,
PAGE_READWRITE,
BoundaryAddressMultiple);
}
+VOID
+NTAPI
+MiDbgDumpAddressSpace(VOID)
+{
+ //
+ // Print the memory layout
+ //
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmSystemRangeStart,
+ (ULONG_PTR)MmSystemRangeStart + MmBootImageSize,
+ "Boot Loaded Image");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmPagedPoolBase,
+ (ULONG_PTR)MmPagedPoolBase + MmPagedPoolSize,
+ "Paged Pool");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmPfnDatabase,
+ (ULONG_PTR)MmPfnDatabase + (MxPfnAllocation << PAGE_SHIFT),
+ "PFN Database");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmNonPagedPoolStart,
+ (ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes,
+ "ARM³ Non Paged Pool");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MiSystemViewStart,
+ (ULONG_PTR)MiSystemViewStart + MmSystemViewSize,
+ "System View Space");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmSessionBase,
+ MiSessionSpaceEnd,
+ "Session Space");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ PTE_BASE, PDE_BASE,
+ "Page Tables");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ PDE_BASE, HYPER_SPACE,
+ "Page Directories");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ HYPER_SPACE, HYPER_SPACE + (4 * 1024 * 1024),
+ "Hyperspace");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmPagedPoolStart,
+ (ULONG_PTR)MmPagedPoolStart + MmSizeOfPagedPoolInBytes,
+ "ARM³ Paged Pool");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmNonPagedSystemStart, MmNonPagedPoolExpansionStart,
+ "System PTE Space");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmNonPagedPoolExpansionStart, MmNonPagedPoolEnd,
+ "Non Paged Pool Expansion PTE Space");
+}
+
VOID
NTAPI
MiDbgDumpMemoryDescriptors(VOID)
//
MmArmInitSystem(0, KeLoaderBlock);
- /* Intialize system memory areas */
- MiInitSystemMemoryAreas();
-
/* Initialize the page list */
MmInitializePageList();
MmPagedPoolBase = (PVOID)PAGE_ROUND_UP((ULONG_PTR)MmSystemRangeStart +
MmBootImageSize);
MmPagedPoolSize = MM_PAGED_POOL_SIZE;
-
- //
- // Initialize ARM³ in phase 2
- //
- MmArmInitSystem(2, KeLoaderBlock);
+ /* Intialize system memory areas */
+ MiInitSystemMemoryAreas();
+
+ /* Dump the address space */
+ MiDbgDumpAddressSpace();
+
/* Initialize paged pool */
MmInitializePagedPool();