From e86380de7f464836e3aace24c51b088e1d9138dc Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 17 Feb 2008 13:08:28 +0000 Subject: [PATCH] - 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. svn path=/trunk/; revision=32400 --- reactos/ntoskrnl/mm/freelist.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index aba8aefb40c..58b58a13fa9 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -242,11 +242,11 @@ NTAPI 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 @@ MmInitializePageList(VOID) { /* Use one of our highest usable pages */ Pfn = MmAllocEarlyPage(); - + /* Set the PFN */ Status = MmCreateVirtualMappingForKernel(Address, PAGE_READWRITE, @@ -303,7 +303,7 @@ MmInitializePageList(VOID) MmSetPageProtect(NULL, Address, PAGE_READWRITE); } } - + /* Clear the PFN database */ RtlZeroMemory(MmPageArray, (MmPageArraySize + 1) * sizeof(PHYSICAL_PAGE)); @@ -386,8 +386,7 @@ MmInitializePageList(VOID) MmStats.NrTotalPages = MmStats.NrFreePages + MmStats.NrSystemPages + MmStats.NrUserPages; MmInitializeBalancer(MmStats.NrFreePages, MmStats.NrSystemPages); } -#endif - +#else VOID NTAPI MmInitializePageList() @@ -427,9 +426,8 @@ MmInitializePageList() 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 @@ MmInitializePageList() MmStats.NrTotalPages = MmStats.NrFreePages + MmStats.NrSystemPages + MmStats.NrUserPages; MmInitializeBalancer(MmStats.NrFreePages, MmStats.NrSystemPages); } +#endif VOID NTAPI @@ -945,7 +944,9 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SavedSwapEntry) { /* 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");