]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[pcbios] Merge adjacent memory regions of same type
authorEduardo Habkost <ehabkost@redhat.com>
Wed, 16 Feb 2011 18:41:24 +0000 (16:41 -0200)
committerMichael Brown <mcb30@ipxe.org>
Thu, 17 Feb 2011 01:25:08 +0000 (01:25 +0000)
Some BIOSes can report multiple memory regions which may be adjacent
and the same type.  Since only the first region is used in the
mboot.c32 layer it's possible to run out of memory when loading all of
the boot modules.  One may get around this problem by having iPXE
merge these memory regions internally.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/i386/firmware/pcbios/memmap.c

index 01080c7b8e74b87c2ae516cc7cabcae96fb07c37..493d2c20134bee01205f4e7f61392f56e70a641b 100644 (file)
@@ -156,6 +156,7 @@ unsigned int extmemsize ( void ) {
  */
 static int meme820 ( struct memory_map *memmap ) {
        struct memory_region *region = memmap->regions;
+       struct memory_region *prev_region = NULL;
        uint32_t next = 0;
        uint32_t smap;
        size_t size;
@@ -238,8 +239,15 @@ static int meme820 ( struct memory_map *memmap ) {
 
                region->start = e820buf.start;
                region->end = e820buf.start + e820buf.len;
-               region++;
-               memmap->count++;
+
+               /* Check for adjacent regions and merge them */
+               if ( prev_region && ( region->start == prev_region->end ) ) {
+                       prev_region->end = region->end;
+               } else {
+                       prev_region = region;
+                       region++;
+                       memmap->count++;
+               }
 
                if ( memmap->count >= ( sizeof ( memmap->regions ) /
                                        sizeof ( memmap->regions[0] ) ) ) {