Hi, I have noticed that the original submission of this patch had issues (diff was corrupted), so I am resubmitting it to make sure a good version of the patch is queued for inclusion.
Original submission: http://article.gmane.org/gmane.network.etherboot.gpxe/1362 Test report: http://article.gmane.org/gmane.network.etherboot.gpxe/1502 Original patch description: From: Casey Dahlin <cdah...@redhat.com> 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 gPXE merge these memory regions internally. --- Index: gpxe/src/arch/i386/firmware/pcbios/memmap.c =================================================================== --- gpxe.orig/src/arch/i386/firmware/pcbios/memmap.c +++ gpxe/src/arch/i386/firmware/pcbios/memmap.c @@ -154,6 +154,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; @@ -236,8 +237,15 @@ static int meme820 ( struct memory_map * 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] ) ) ) { -- Eduardo _______________________________________________ gPXE mailing list gPXE@etherboot.org http://etherboot.org/mailman/listinfo/gpxe