[ros-diffs] [tkreuzer] 53797: [FREELDR] Patch by Brian Palmer: Fix problems that could occur, when the BIOS returns memory regions that are not page aligned, by fixing up the bios memory map before using it.

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Wed Sep 21 23:02:25 UTC 2011


Author: tkreuzer
Date: Wed Sep 21 23:02:24 2011
New Revision: 53797

URL: http://svn.reactos.org/svn/reactos?rev=53797&view=rev
Log:
[FREELDR]
Patch by Brian Palmer:
Fix problems that could occur, when the BIOS returns memory regions that are not page aligned, by fixing up the bios memory map before using it.

Modified:
    trunk/reactos/boot/freeldr/freeldr/arcemul/mm.c

Modified: trunk/reactos/boot/freeldr/freeldr/arcemul/mm.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arcemul/mm.c?rev=53797&r1=53796&r2=53797&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arcemul/mm.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arcemul/mm.c [iso-8859-1] Wed Sep 21 23:02:24 2011
@@ -35,6 +35,49 @@
 
 #endif
 };
+
+static
+VOID MmFixupSystemMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG* MapCount)
+{
+	int		Index;
+	int		Index2;
+	ULONGLONG BaseAddressOffset;
+
+	// Loop through each entry in the array
+	for (Index=0; Index<*MapCount; Index++)
+	{
+		// Correct all the addresses to be aligned on page boundaries
+		BaseAddressOffset = ROUND_UP(BiosMemoryMap[Index].BaseAddress, MM_PAGE_SIZE) - BiosMemoryMap[Index].BaseAddress;
+		BiosMemoryMap[Index].BaseAddress += BaseAddressOffset;
+		if (BiosMemoryMap[Index].Length < BaseAddressOffset)
+		{
+			BiosMemoryMap[Index].Length = 0;
+		}
+		else
+		{
+			BiosMemoryMap[Index].Length -= BaseAddressOffset;
+		}
+		BiosMemoryMap[Index].Length = ROUND_DOWN(BiosMemoryMap[Index].Length, MM_PAGE_SIZE);
+
+		// If the entry type isn't usable then remove
+		// it from the memory map (this will help reduce
+		// the size of our lookup table)
+		// If the length is less than a full page then
+		// get rid of it also.
+		if (BiosMemoryMap[Index].Type != BiosMemoryUsable ||
+			BiosMemoryMap[Index].Length < MM_PAGE_SIZE)
+		{
+			// Slide every entry after this down one
+			for (Index2=Index; Index2<(*MapCount - 1); Index2++)
+			{
+				BiosMemoryMap[Index2] = BiosMemoryMap[Index2 + 1];
+			}
+			(*MapCount)--;
+			Index--;
+		}
+	}
+}
+
 const MEMORY_DESCRIPTOR*
 ArcGetMemoryDescriptor(const MEMORY_DESCRIPTOR* Current)
 {
@@ -57,6 +100,11 @@
         BiosMemoryMapEntryCount = MachVtbl.GetMemoryMap(BiosMemoryMap,
                                                         sizeof(BiosMemoryMap) /
                                                         sizeof(BIOS_MEMORY_MAP));
+
+        //
+        // Fix entries that are not page aligned
+        //
+        MmFixupSystemMemoryMap(BiosMemoryMap, &BiosMemoryMapEntryCount);
 
         //
         // Copy the entries to our structure




More information about the Ros-diffs mailing list