[pcbios] Add additional sanity check for bogus e820 map
authorMarty Connor <mdc@etherboot.org>
Thu, 18 Dec 2008 04:28:27 +0000 (23:28 -0500)
committerMichael Brown <mcb30@etherboot.org>
Thu, 18 Dec 2008 17:28:57 +0000 (17:28 +0000)
At POST time some BIOSes return invalid e820 maps even though
they indicate that the data is valid.  We add a check that the first
region returned by e820 is RAM type and declare the map to be invalid
if it is not.

This extends the sanity checks from 8b20e5d ("[pcbios] Sanity-check
the INT15,e820 and INT15,e801 memory maps").

src/arch/i386/firmware/pcbios/memmap.c

index 3546dc6..ff387d9 100644 (file)
@@ -201,6 +201,13 @@ static int meme820 ( struct memory_map *memmap ) {
                        break;
                }
 
                        break;
                }
 
+               /* If first region is not RAM, assume map is invalid */
+               if ( ( memmap->count == 0 ) &&
+                    ( e820buf.type != E820_TYPE_RAM ) ) {
+                      DBG ( "INT 15,e820 failed, first entry not RAM\n" );
+                      return -EINVAL;
+               }
+
                DBG ( "INT 15,e820 region [%llx,%llx) type %d",
                      e820buf.start, ( e820buf.start + e820buf.len ),
                      ( int ) e820buf.type );
                DBG ( "INT 15,e820 region [%llx,%llx) type %d",
                      e820buf.start, ( e820buf.start + e820buf.len ),
                      ( int ) e820buf.type );