- 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; ULONG ArchExtra;
} ROS_LOADER_PARAMETER_BLOCK, *PROS_LOADER_PARAMETER_BLOCK; } ROS_LOADER_PARAMETER_BLOCK, *PROS_LOADER_PARAMETER_BLOCK;
extern ULONG MmFreeLdrMemHigher, MmFreeLdrMemLower;
extern BOOLEAN AcpiTableDetected; extern BOOLEAN AcpiTableDetected;
extern ULONG MmFreeLdrPageDirectoryStart, MmFreeLdrPageDirectoryEnd; extern ULONG MmFreeLdrPageDirectoryStart, MmFreeLdrPageDirectoryEnd;

View file

@ -32,7 +32,6 @@ typedef struct _BIOS_MEMORY_DESCRIPTOR
/* FreeLDR Memory Data */ /* FreeLDR Memory Data */
ULONG_PTR MmFreeLdrFirstKrnlPhysAddr, MmFreeLdrLastKrnlPhysAddr; ULONG_PTR MmFreeLdrFirstKrnlPhysAddr, MmFreeLdrLastKrnlPhysAddr;
ULONG_PTR MmFreeLdrLastKernelAddress; ULONG_PTR MmFreeLdrLastKernelAddress;
ULONG MmFreeLdrMemHigher;
ULONG MmFreeLdrPageDirectoryEnd; ULONG MmFreeLdrPageDirectoryEnd;
/* FreeLDR Loader Data */ /* FreeLDR Loader Data */
@ -926,7 +925,6 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock,
/* First get some kernel-loader globals */ /* First get some kernel-loader globals */
AcpiTableDetected = (RosLoaderBlock->Flags & MB_FLAGS_ACPI_TABLE) ? TRUE : FALSE; AcpiTableDetected = (RosLoaderBlock->Flags & MB_FLAGS_ACPI_TABLE) ? TRUE : FALSE;
MmFreeLdrMemHigher = RosLoaderBlock->MemHigher;
MmFreeLdrPageDirectoryEnd = RosLoaderBlock->PageDirectoryEnd; MmFreeLdrPageDirectoryEnd = RosLoaderBlock->PageDirectoryEnd;
if (!MmFreeLdrPageDirectoryEnd) MmFreeLdrPageDirectoryEnd = 0x40000; if (!MmFreeLdrPageDirectoryEnd) MmFreeLdrPageDirectoryEnd = 0x40000;

View file

@ -205,6 +205,35 @@ MmInitVirtualMemory(ULONG_PTR LastKernelAddress,
MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory); 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 PCHAR
MemType[] = { MemType[] = {
"ExceptionBlock ", // ? "ExceptionBlock ", // ?
@ -247,7 +276,6 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
* FUNCTION: Initalize memory managment * FUNCTION: Initalize memory managment
*/ */
{ {
ULONG i;
ULONG kernel_len; ULONG kernel_len;
ULONG_PTR MappingAddress; ULONG_PTR MappingAddress;
PLDR_DATA_TABLE_ENTRY LdrEntry; PLDR_DATA_TABLE_ENTRY LdrEntry;
@ -280,26 +308,7 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
DPRINT("CurrentProcess: %x\n", PsGetCurrentProcess()); DPRINT("CurrentProcess: %x\n", PsGetCurrentProcess());
PsGetCurrentProcess()->Pcb.DirectoryTableBase.LowPart = (ULONG)MmGetPageDirectory(); 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 */ /* NTLDR Hacks */
if (!MmFreeLdrMemHigher) MmFreeLdrMemHigher = 65536;
if (!MmFreeLdrPageDirectoryEnd) MmFreeLdrPageDirectoryEnd = 0x40000; if (!MmFreeLdrPageDirectoryEnd) MmFreeLdrPageDirectoryEnd = 0x40000;
if (!FirstKrnlPhysAddr) if (!FirstKrnlPhysAddr)
{ {
@ -314,11 +323,6 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
/* FIXME: How do we get the last address? */ /* FIXME: How do we get the last address? */
} }
if (MmFreeLdrMemHigher >= (MaxMem - 1) * 1024)
{
MmFreeLdrMemHigher = (MaxMem - 1) * 1024;
}
/* Set memory limits */ /* Set memory limits */
MmSystemRangeStart = (PVOID)KSEG0_BASE; MmSystemRangeStart = (PVOID)KSEG0_BASE;
MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000; MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000;
@ -346,13 +350,13 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
* (we assume the kernel occupies a continuous range of physical * (we assume the kernel occupies a continuous range of physical
* memory) * memory)
*/ */
DPRINT("first krnl %x\nlast krnl %x\n",FirstKrnlPhysAddr, DPRINT("first krnl %x, last krnl %x\n",FirstKrnlPhysAddr,
LastKrnlPhysAddr); LastKrnlPhysAddr);
/* /*
* Free physical memory not used by the kernel * Free physical memory not used by the kernel
*/ */
MmStats.NrTotalPages = MmFreeLdrMemHigher/4; MmStats.NrTotalPages = MiCountFreePagesInLoaderBlock(KeLoaderBlock);
MmNumberOfPhysicalPages = MmStats.NrTotalPages; MmNumberOfPhysicalPages = MmStats.NrTotalPages;
if (!MmStats.NrTotalPages) if (!MmStats.NrTotalPages)
{ {
@ -361,12 +365,9 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
} }
else else
{ {
/* add 1MB for standard memory (not extended) */ /* HACK: add 1MB for standard memory (not extended). Why? */
MmStats.NrTotalPages += 256; MmStats.NrTotalPages += 256;
} }
#ifdef BIOS_MEM_FIX
MmStats.NrTotalPages += 16;
#endif
/* /*
* Initialize the kernel address space * Initialize the kernel address space