[relocate] Guard against systems that report empty memory regions
authorMichael Brown <mcb30@etherboot.org>
Tue, 23 Sep 2008 00:13:28 +0000 (01:13 +0100)
committerMichael Brown <mcb30@etherboot.org>
Tue, 23 Sep 2008 00:13:28 +0000 (01:13 +0100)
If the INT 15,e820 memory map reports a region [0,0), this confuses
the "truncate to even megabytes" logic, which ends up rounding the
region 'down' to [0,fff00000).

Fix by ensuring that the region's end address is at least 1, before we
subtract 1 to obtain the "last byte in region" address.

src/arch/i386/core/relocate.c

index 39d00b0..aa58ad6 100644 (file)
@@ -93,11 +93,16 @@ __cdecl void relocate ( struct i386_all_regs *ix86 ) {
                        /* If last byte that might be used (r_end-1)
                         * is in an odd megabyte, round down r_end to
                         * the top of the next even megabyte.
+                        *
+                        * Make sure that we don't accidentally wrap
+                        * r_end below 0.
                         */
-                       r_end = ( r_end - 1 ) & ~0xfffff;
-                       DBG ( "...end truncated to %lx "
-                             "(avoid ending in odd megabyte)\n",
-                             r_end );
+                       if ( r_end >= 1 ) {
+                               r_end = ( r_end - 1 ) & ~0xfffff;
+                               DBG ( "...end truncated to %lx "
+                                     "(avoid ending in odd megabyte)\n",
+                                     r_end );
+                       }
                } else if ( ( r_end - size ) & 0x100000 ) {
                        /* If the last byte that might be used
                         * (r_end-1) is in an even megabyte, but the
@@ -108,7 +113,7 @@ __cdecl void relocate ( struct i386_all_regs *ix86 ) {
                         * Make sure that we don't accidentally wrap
                         * r_end below 0.
                         */
-                       if ( r_end > 0x100000 ) {
+                       if ( r_end >= 0x100000 ) {
                                r_end = ( r_end - 0x100000 ) & ~0xfffff;
                                DBG ( "...end truncated to %lx "
                                      "(avoid starting in odd megabyte)\n",