mirror of
https://github.com/xcat2/xNBA.git
synced 2025-08-23 19:50:24 +00:00
[relocate] Guard against systems that report empty memory regions
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.
This commit is contained in:
@@ -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",
|
||||
|
Reference in New Issue
Block a user