[ros-diffs] [fireball] 32400: - Zero early-allocated pages for PFN DB itself, as suggested on the ros-dev mailing list, and hyperspace mapping seems to work, at least on x86. Fixes the "warm reboot-bug" in 2nd stage.

fireball at svn.reactos.org fireball at svn.reactos.org
Sun Feb 17 14:08:29 CET 2008


Author: fireball
Date: Sun Feb 17 16:08:28 2008
New Revision: 32400

URL: http://svn.reactos.org/svn/reactos?rev=32400&view=rev
Log:
- Zero early-allocated pages for PFN DB itself, as suggested on the ros-dev mailing list, and hyperspace mapping seems to work, at least on x86. Fixes the "warm reboot-bug" in 2nd stage.

Modified:
    trunk/reactos/ntoskrnl/mm/freelist.c

Modified: trunk/reactos/ntoskrnl/mm/freelist.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/freelist.c?rev=32400&r1=32399&r2=32400&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/freelist.c (original)
+++ trunk/reactos/ntoskrnl/mm/freelist.c Sun Feb 17 16:08:28 2008
@@ -242,11 +242,11 @@
 MmAllocEarlyPage(VOID)
 {
     PFN_TYPE Pfn;
-    
+
     /* Use one of our highest usable pages */
     Pfn = MiFreeDescriptor->BasePage + MiFreeDescriptor->PageCount - 1;
     MiFreeDescriptor->PageCount--;
-    
+
     /* Return it */
     return Pfn;
 }
@@ -285,7 +285,7 @@
         {
             /* Use one of our highest usable pages */
             Pfn = MmAllocEarlyPage();
-            
+
             /* Set the PFN */
             Status = MmCreateVirtualMappingForKernel(Address,
                                                      PAGE_READWRITE,
@@ -303,7 +303,7 @@
             MmSetPageProtect(NULL, Address, PAGE_READWRITE);
         }
     }
-    
+
     /* Clear the PFN database */
     RtlZeroMemory(MmPageArray, (MmPageArraySize + 1) * sizeof(PHYSICAL_PAGE));
 
@@ -386,8 +386,7 @@
     MmStats.NrTotalPages = MmStats.NrFreePages + MmStats.NrSystemPages + MmStats.NrUserPages;
     MmInitializeBalancer(MmStats.NrFreePages, MmStats.NrSystemPages);
 }
-#endif
-
+#else
 VOID
 NTAPI
 MmInitializePageList()
@@ -427,9 +426,8 @@
         if (!MmIsPagePresent(NULL, Address))
         {
             /* Use one of our highest usable pages */
-            Pfn = MiFreeDescriptor->BasePage + MiFreeDescriptor->PageCount - 1;
-            MiFreeDescriptor->PageCount--;
-            
+            Pfn = MmAllocEarlyPage();
+
             /* Set the PFN */
             Status = MmCreateVirtualMappingForKernel(Address,
                                                      PAGE_READWRITE,
@@ -579,6 +577,7 @@
     MmStats.NrTotalPages = MmStats.NrFreePages + MmStats.NrSystemPages + MmStats.NrUserPages;
     MmInitializeBalancer(MmStats.NrFreePages, MmStats.NrSystemPages);
 }
+#endif
 
 VOID
 NTAPI
@@ -945,7 +944,9 @@
          {
              /* Allocate an early page -- we'll account for it later */
              KeReleaseSpinLock(&PageListLock, oldIrql);
-             return MmAllocEarlyPage();
+             PfnOffset = MmAllocEarlyPage();
+             MiZeroPage(PfnOffset);
+             return PfnOffset;
          }
           
          DPRINT1("MmAllocPage(): Out of memory\n");




More information about the Ros-diffs mailing list