- 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
This commit is contained in:
Aleksey Bragin 2008-02-08 10:55:40 +00:00
parent 82d29cb087
commit b807bc63c0
3 changed files with 32 additions and 34 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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