From b807bc63c056897e23536365336dbe2cba4f6f6a Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Fri, 8 Feb 2008 10:55:40 +0000 Subject: [PATCH] - Implement MiCountFreePagesInLoaderBlock() to correctly count free pages (instead of using a variable introduced somewhere below r2000 (MemHigher), and later converted to MmFreeLdrMemHigher). - Get rid of MmFreeLdrMemHigher and MmFreeLdrMemLower (they were not actually used for anything except getting number of free pages). svn path=/trunk/; revision=32214 --- reactos/include/reactos/rosldr.h | 1 - reactos/ntoskrnl/ke/freeldr.c | 2 - reactos/ntoskrnl/mm/mminit.c | 63 ++++++++++++++++---------------- 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/reactos/include/reactos/rosldr.h b/reactos/include/reactos/rosldr.h index fbbd187edf3..fc3eac54cf0 100644 --- a/reactos/include/reactos/rosldr.h +++ b/reactos/include/reactos/rosldr.h @@ -45,7 +45,6 @@ typedef struct _ROS_LOADER_PARAMETER_BLOCK ULONG ArchExtra; } ROS_LOADER_PARAMETER_BLOCK, *PROS_LOADER_PARAMETER_BLOCK; -extern ULONG MmFreeLdrMemHigher, MmFreeLdrMemLower; extern BOOLEAN AcpiTableDetected; extern ULONG MmFreeLdrPageDirectoryStart, MmFreeLdrPageDirectoryEnd; diff --git a/reactos/ntoskrnl/ke/freeldr.c b/reactos/ntoskrnl/ke/freeldr.c index c0aefed8a18..ebee6beeddf 100644 --- a/reactos/ntoskrnl/ke/freeldr.c +++ b/reactos/ntoskrnl/ke/freeldr.c @@ -32,7 +32,6 @@ typedef struct _BIOS_MEMORY_DESCRIPTOR /* FreeLDR Memory Data */ ULONG_PTR MmFreeLdrFirstKrnlPhysAddr, MmFreeLdrLastKrnlPhysAddr; ULONG_PTR MmFreeLdrLastKernelAddress; -ULONG MmFreeLdrMemHigher; ULONG MmFreeLdrPageDirectoryEnd; /* FreeLDR Loader Data */ @@ -926,7 +925,6 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, /* First get some kernel-loader globals */ AcpiTableDetected = (RosLoaderBlock->Flags & MB_FLAGS_ACPI_TABLE) ? TRUE : FALSE; - MmFreeLdrMemHigher = RosLoaderBlock->MemHigher; MmFreeLdrPageDirectoryEnd = RosLoaderBlock->PageDirectoryEnd; if (!MmFreeLdrPageDirectoryEnd) MmFreeLdrPageDirectoryEnd = 0x40000; diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 6a0c70ad38a..ad6d3d86d6d 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -205,6 +205,35 @@ MmInitVirtualMemory(ULONG_PTR LastKernelAddress, MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory); } +ULONG +NTAPI +MiCountFreePagesInLoaderBlock(PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PLIST_ENTRY NextEntry; + PMEMORY_ALLOCATION_DESCRIPTOR Md; + ULONG TotalPages = 0; + + for (NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink; + NextEntry != &KeLoaderBlock->MemoryDescriptorListHead; + NextEntry = NextEntry->Flink) + { + Md = CONTAINING_RECORD(NextEntry, MEMORY_ALLOCATION_DESCRIPTOR, ListEntry); + + if (Md->MemoryType == LoaderBad || + Md->MemoryType == LoaderFirmwarePermanent || + Md->MemoryType == LoaderSpecialMemory || + Md->MemoryType == LoaderBBTMemory) + { + /* Don't count these blocks */ + continue; + } + + TotalPages += Md->PageCount; + } + + return TotalPages; +} + PCHAR MemType[] = { "ExceptionBlock ", // ? @@ -247,7 +276,6 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr, * FUNCTION: Initalize memory managment */ { - ULONG i; ULONG kernel_len; ULONG_PTR MappingAddress; PLDR_DATA_TABLE_ENTRY LdrEntry; @@ -280,26 +308,7 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr, DPRINT("CurrentProcess: %x\n", PsGetCurrentProcess()); PsGetCurrentProcess()->Pcb.DirectoryTableBase.LowPart = (ULONG)MmGetPageDirectory(); - if ((BIOSMemoryMap != NULL) && (AddressRangeCount > 0)) - { - // If we have a bios memory map, recalulate the memory size - ULONG last = 0; - for (i = 0; i < AddressRangeCount; i++) - { - if (BIOSMemoryMap[i].Type == 1 - && (BIOSMemoryMap[i].BaseAddrLow + BIOSMemoryMap[i].LengthLow + PAGE_SIZE -1) / PAGE_SIZE > last) - { - last = (BIOSMemoryMap[i].BaseAddrLow + BIOSMemoryMap[i].LengthLow + PAGE_SIZE -1) / PAGE_SIZE; - } - } - if ((last - 256) * 4 > MmFreeLdrMemHigher) - { - MmFreeLdrMemHigher = (last - 256) * 4; - } - } - /* NTLDR Hacks */ - if (!MmFreeLdrMemHigher) MmFreeLdrMemHigher = 65536; if (!MmFreeLdrPageDirectoryEnd) MmFreeLdrPageDirectoryEnd = 0x40000; if (!FirstKrnlPhysAddr) { @@ -314,11 +323,6 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr, /* FIXME: How do we get the last address? */ } - if (MmFreeLdrMemHigher >= (MaxMem - 1) * 1024) - { - MmFreeLdrMemHigher = (MaxMem - 1) * 1024; - } - /* Set memory limits */ MmSystemRangeStart = (PVOID)KSEG0_BASE; MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000; @@ -346,13 +350,13 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr, * (we assume the kernel occupies a continuous range of physical * memory) */ - DPRINT("first krnl %x\nlast krnl %x\n",FirstKrnlPhysAddr, + DPRINT("first krnl %x, last krnl %x\n",FirstKrnlPhysAddr, LastKrnlPhysAddr); /* * Free physical memory not used by the kernel */ - MmStats.NrTotalPages = MmFreeLdrMemHigher/4; + MmStats.NrTotalPages = MiCountFreePagesInLoaderBlock(KeLoaderBlock); MmNumberOfPhysicalPages = MmStats.NrTotalPages; if (!MmStats.NrTotalPages) { @@ -361,12 +365,9 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr, } else { - /* add 1MB for standard memory (not extended) */ + /* HACK: add 1MB for standard memory (not extended). Why? */ MmStats.NrTotalPages += 256; } -#ifdef BIOS_MEM_FIX - MmStats.NrTotalPages += 16; -#endif /* * Initialize the kernel address space