Sync with trunk (48237)
[reactos.git] / ntoskrnl / mm / ARM3 / i386 / init.c
index 250324c..06afaf2 100644 (file)
 MMPTE ValidKernelPde = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1};
 MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1};
 
+/* Template PDE for a demand-zero page */
+MMPDE DemandZeroPde  = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)};
+
+/* Template PTE for prototype page */
+MMPTE PrototypePte = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) | PTE_PROTOTYPE | 0xFFFFF000};
+                       
 /* PRIVATE FUNCTIONS **********************************************************/
 
 VOID
@@ -151,6 +157,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     MMPTE TempPde, TempPte;
     PVOID NonPagedPoolExpansionVa;
     ULONG OldCount;
+    KIRQL OldIrql;
 
     /* Check for kernel stack size that's too big */
     if (MmLargeStackSize > (KERNEL_LARGE_STACK_SIZE / _1KB))
@@ -305,7 +312,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     // then add the color tables and convert to pages
     //
     MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN);
-    MxPfnAllocation <<= 1;
+    //MxPfnAllocation <<= 1;
     MxPfnAllocation += (MmSecondaryColors * sizeof(MMCOLOR_TABLES) * 2);
     MxPfnAllocation >>= PAGE_SHIFT;
     
@@ -338,7 +345,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedPoolStart -
                                     (MmNumberOfSystemPtes + 1) * PAGE_SIZE);
     MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedSystemStart &
-                                    ~((4 * 1024 * 1024) - 1));
+                                    ~(PDE_MAPPED_VA - 1));
     
     //
     // Don't let it go below the minimum
@@ -379,19 +386,13 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     // with the old memory manager, so we'll create a "Shadow PFN Database"
     // instead, and arbitrarly start it at 0xB0000000.
     //
-    // We actually create two PFN databases, one for ReactOS starting here,
-    // and the next one used for ARM3, which starts right after. The MmPfnAllocation
-    // variable actually holds the size of both (the colored tables come after
-    // the ARM3 PFN database).
-    //
-    MmPfnDatabase[0] = (PVOID)0xB0000000;
-    MmPfnDatabase[1] = &MmPfnDatabase[0][MmHighestPhysicalPage];
-    ASSERT(((ULONG_PTR)MmPfnDatabase[0] & ((4 * 1024 * 1024) - 1)) == 0);
+    MmPfnDatabase = (PVOID)0xB0000000;
+    ASSERT(((ULONG_PTR)MmPfnDatabase & (PDE_MAPPED_VA - 1)) == 0);
             
     //
     // Non paged pool comes after the PFN database
     //
-    MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmPfnDatabase[0] +
+    MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmPfnDatabase +
                                   (MxPfnAllocation << PAGE_SHIFT));
 
     //
@@ -415,17 +416,11 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1));
     while (StartPde <= EndPde)
     {
-        //
-        // Sanity check
-        //
-        ASSERT(StartPde->u.Hard.Valid == 0);
-        
         //
         // Get a page
         //
         TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1);
-        ASSERT(TempPde.u.Hard.Valid == 1);
-        *StartPde = TempPde;
+        MI_WRITE_VALID_PTE(StartPde, TempPde);
         
         //
         // Zero out the page table
@@ -442,23 +437,17 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     //
     // Now we need pages for the page tables which will map initial NP
     //
-    StartPde = MiAddressToPde(MmPfnDatabase[0]);
+    StartPde = MiAddressToPde(MmPfnDatabase);
     EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolStart +
                                     MmSizeOfNonPagedPoolInBytes - 1));
     while (StartPde <= EndPde)
     {
-        //
-        // Sanity check
-        //
-        ASSERT(StartPde->u.Hard.Valid == 0);
-        
         //
         // Get a page
         //
         TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1);
-        ASSERT(TempPde.u.Hard.Valid == 1);
-        *StartPde = TempPde;
-        
+        MI_WRITE_VALID_PTE(StartPde, TempPde);
+
         //
         // Zero out the page table
         //
@@ -488,9 +477,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
         // Use one of our contigous pages
         //
         TempPte.u.Hard.PageFrameNumber = PageFrameIndex++;
-        ASSERT(PointerPte->u.Hard.Valid == 0);
-        ASSERT(TempPte.u.Hard.Valid == 1);
-        *PointerPte++ = TempPte;
+        MI_WRITE_VALID_PTE(PointerPte++, TempPte);
     }
     
     //
@@ -509,12 +496,14 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     /* Initialize the color tables */
     MiInitializeColorTables();
     
+    /* ReactOS Stuff */
+    extern KEVENT ZeroPageThreadEvent;
+    KeInitializeEvent(&ZeroPageThreadEvent, NotificationEvent, TRUE);
+    
     /* Build the PFN Database */
     MiInitializePfnDatabase(LoaderBlock);
+    MmInitializeBalancer(MmAvailablePages, 0);
 
-    /* Call back into shitMM to setup the ReactOS PFN database */
-    MmInitializePageList();
-        
     //
     // Reset the descriptor back so we can create the correct memory blocks
     //
@@ -541,20 +530,23 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     //
     MiInitializeSystemPtes(PointerPte, MmNumberOfSystemPtes, SystemPteSpace);
     
-    //
-    // Get the PDE For hyperspace
-    //
+    /* Get the PDE For hyperspace */
     StartPde = MiAddressToPde(HYPER_SPACE);
     
-    //
-    // Allocate a page for it and create it
-    //
-    PageFrameIndex = MmAllocPage(MC_SYSTEM);
+    /* Lock PFN database */
+    OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+    
+    /* Allocate a page for hyperspace and create it */
+    PageFrameIndex = MiRemoveAnyPage(0);
     TempPde.u.Hard.PageFrameNumber = PageFrameIndex;
     TempPde.u.Hard.Global = FALSE; // Hyperspace is local!
-    ASSERT(StartPde->u.Hard.Valid == 0);
-    ASSERT(TempPde.u.Hard.Valid == 1);
-    *StartPde = TempPde;
+    MI_WRITE_VALID_PTE(StartPde, TempPde);
+    
+    /* Flush the TLB */
+    KeFlushCurrentTb();
+    
+    /* Release the lock */
+    KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
     
     //
     // Zero out the page table now