# HG changeset patch # User John Tsiombikas # Date 1301808187 -10800 # Node ID 3ba93d8f586c09902e52a7231631d8024fb0eaf3 # Parent 369adbbd4bddf2d5df73071e1dbd2746ecc6604d now ignoring parts of the memory map beyond 4gb instead of silently wrapping around and marking all holes as usable :) diff -r 369adbbd4bdd -r 3ba93d8f586c src/mem.c --- a/src/mem.c Wed Mar 30 23:14:29 2011 +0300 +++ b/src/mem.c Sun Apr 03 08:23:07 2011 +0300 @@ -59,22 +59,31 @@ printf("memory map:\n"); while(mem < mmap_end) { - char *type; - unsigned int end = mem->base_low + mem->length_low; + /* ignore memory ranges that start beyond the 4gb mark */ + if(mem->base_high == 0 && mem->base_low != 0xffffffff) { + char *type; + unsigned int end, rest = 0xffffffff - mem->base_low; - if(mem->type == MB_MEM_VALID) { - type = "free:"; - add_memory(mem->base_low, mem->length_low); + /* make sure the length does not extend beyond 4gb */ + if(mem->length_high || mem->length_low > rest) { + mem->length_low = rest; + } + end = mem->base_low + mem->length_low; - num_pages = ADDR_TO_PAGE(mem->base_low + mem->length_low); - if(max_pg < num_pages) { - max_pg = num_pages; + if(mem->type == MB_MEM_VALID) { + type = "free:"; + add_memory(mem->base_low, mem->length_low); + + num_pages = ADDR_TO_PAGE(mem->base_low + mem->length_low); + if(max_pg < num_pages) { + max_pg = num_pages; + } + } else { + type = "hole:"; } - } else { - type = "hole:"; + + printf(" %s %x - %x (%u bytes)\n", type, mem->base_low, end, mem->length_low); } - - printf(" %s %x - %x (%u bytes)\n", type, mem->base_low, end, mem->length_low); mem = (struct mboot_mmap*)((char*)mem + mem->skip + sizeof mem->skip); } } else if(mb->flags & MB_MEM) {