From 25f3f80f1e214706331c49ee265b7835546b4495 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 13 Aug 2001 16:39:01 +0000 Subject: [PATCH] Fixed interpretation of BIOS memory map. Patch by Hartmut Birr. svn path=/trunk/; revision=2167 --- reactos/ntoskrnl/mm/freelist.c | 4 ++-- reactos/ntoskrnl/mm/mminit.c | 32 +++++++++++++++++++++++++------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index d982505897c..6ab6e5f8738 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -130,7 +130,7 @@ VOID MiParseRangeToFreeList( Range->Type); first = (Range->BaseAddrLow + PAGESIZE - 1) / PAGESIZE; - last = first + ((Range->LengthLow + PAGESIZE - 1) / PAGESIZE) + 1; + last = first + ((Range->LengthLow + PAGESIZE - 1) / PAGESIZE); for (i = first; i < last; i++) { if (MmPageArray[i].Flags == 0) @@ -156,7 +156,7 @@ VOID MiParseRangeToBiosList( Range->Type); first = (Range->BaseAddrLow + PAGESIZE - 1) / PAGESIZE; - last = first + ((Range->LengthLow + PAGESIZE - 1) / PAGESIZE) + 1; + last = first + ((Range->LengthLow + PAGESIZE - 1) / PAGESIZE); for (i = first; i < last; i++) { /* Remove the page from the free list if it is there */ diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 278e9a3aeb6..649066e6411 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -1,4 +1,4 @@ -/* $Id: mminit.c,v 1.23 2001/08/03 09:36:18 ei Exp $ +/* $Id: mminit.c,v 1.24 2001/08/13 16:39:01 ekohl Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -187,26 +187,44 @@ VOID MmInitVirtualMemory(ULONG LastKernelAddress, DPRINT("MmInitVirtualMemory() done\n"); } -VOID MmInit1(ULONG FirstKrnlPhysAddr, +VOID MmInit1(ULONG FirstKrnlPhysAddr, ULONG LastKrnlPhysAddr, ULONG LastKernelAddress, - PADDRESS_RANGE BIOSMemoryMap, - ULONG AddressRangeCount) + PADDRESS_RANGE BIOSMemoryMap, + ULONG AddressRangeCount) /* * FUNCTION: Initalize memory managment */ { ULONG i; ULONG kernel_len; - #ifndef MP +#ifndef MP extern unsigned int unmap_me, unmap_me2, unmap_me3; -#endif +#endif DPRINT("MmInit1(FirstKrnlPhysAddr, %x, LastKrnlPhysAddr %x, LastKernelAddress %x)\n", FirstKrnlPhysAddr, LastKrnlPhysAddr, LastKernelAddress); - + + if ((BIOSMemoryMap != NULL) && (AddressRangeCount > 0)) + { + // If we have a bios memory map, recalulate the the memory size + ULONG last = 0; + for (i = 0; i < AddressRangeCount; i++) + { + if (BIOSMemoryMap[i].Type == 1 + && (BIOSMemoryMap[i].BaseAddrLow + BIOSMemoryMap[i].LengthLow + PAGESIZE -1) / PAGESIZE > last) + { + last = (BIOSMemoryMap[i].BaseAddrLow + BIOSMemoryMap[i].LengthLow + PAGESIZE -1) / PAGESIZE; + } + } + if ((last - 256) * 4 > KeLoaderBlock.MemHigher) + { + KeLoaderBlock.MemHigher = (last - 256) * 4; + } + } + /* * FIXME: Set this based on the system command line */