[NTOSKRNL/FREELDR/NDK]
[reactos.git] / reactos / ntoskrnl / mm / amd64 / init.c
index 37e8d33..00606e3 100644 (file)
 //#define NDEBUG
 #include <debug.h>
 
-#include "../ARM3/miarm.h"
+#include <mm/ARM3/miarm.h>
 
 #ifdef _WINKD_
 extern PMMPTE MmDebugPte;
 #endif
 
+/* Helper macros */
+#define IS_ALIGNED(addr, align) (((ULONG64)(addr) & (align - 1)) == 0)
+#define IS_PAGE_ALIGNED(addr) IS_ALIGNED(addr, PAGE_SIZE)
+
 /* GLOBALS *****************************************************************/
 
 /* Template PTE and PDE for a kernel page */
 MMPTE ValidKernelPde = {{PTE_VALID|PTE_READWRITE|PTE_DIRTY|PTE_ACCESSED}};
 MMPTE ValidKernelPte = {{PTE_VALID|PTE_READWRITE|PTE_DIRTY|PTE_ACCESSED}};
 
+/* The same, but for local pages */
+MMPTE ValidKernelPdeLocal = {{PTE_VALID|PTE_READWRITE|PTE_DIRTY|PTE_ACCESSED}};
+MMPTE ValidKernelPteLocal = {{PTE_VALID|PTE_READWRITE|PTE_DIRTY|PTE_ACCESSED}};
+
 /* Template PDE for a demand-zero page */
 MMPDE DemandZeroPde  = {{MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS}};
 MMPTE DemandZeroPte  = {{MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS}};
@@ -34,6 +42,9 @@ MMPTE DemandZeroPte  = {{MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS}};
 MMPTE PrototypePte = {{(MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) |
                       PTE_PROTOTYPE | (MI_PTE_LOOKUP_NEEDED << 32)}};
 
+/* Template PTE for decommited page */
+MMPTE MmDecommittedPte = {{MM_DECOMMIT << MM_PTE_SOFTWARE_PROTECTION_BITS}};
+
 /* Address ranges */
 PVOID MiSessionViewEnd;
 PVOID MiSystemPteSpaceStart;
@@ -239,6 +250,9 @@ MiInitializePageTable()
     /* Setup 1 PPE for hyper space */
     MiMapPPEs((PVOID)HYPER_SPACE, (PVOID)HYPER_SPACE_END);
 
+    /* Setup PPEs for system space view */
+    MiMapPPEs(MiSystemViewStart, (PCHAR)MiSystemViewStart + MmSystemViewSize);
+
     /* Setup the mapping PDEs */
     MiMapPDEs((PVOID)MI_MAPPING_RANGE_START, (PVOID)MI_MAPPING_RANGE_END);
 
@@ -348,8 +362,6 @@ MiBuildNonPagedPool(VOID)
     MiInitializeNonPagedPool();
     MiInitializeNonPagedPoolThresholds();
 
-    /* Initialize the nonpaged pool */
-    InitializePool(NonPagedPool, 0);
 }
 
 VOID
@@ -652,7 +664,7 @@ MiBuildPfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     PageCount = MxFreeDescriptor->BasePage - BasePage;
     MiAddDescriptorToDatabase(BasePage, PageCount, LoaderMemoryData);
 
-    // Reset the descriptor back so we can create the correct memory blocks
+    /* Reset the descriptor back so we can create the correct memory blocks */
     *MxFreeDescriptor = MxOldFreeDescriptor;
 }
 
@@ -695,8 +707,17 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     /* Now process the page tables */
     MiBuildPfnDatabaseFromPageTables();
 
+    /* PFNs are initialized now! */
     MiPfnsInitialized = TRUE;
 
+    //KeLowerIrql(OldIrql);
+
+    /* Need to be at DISPATCH_LEVEL for InitializePool */
+    //KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
+
+    /* Initialize the nonpaged pool */
+    InitializePool(NonPagedPool, 0);
+
     KeLowerIrql(OldIrql);
 
     /* Initialize the balancer */