--- 2.3.16/arch/i386/mm/init.c Wed Sep 1 09:29:44 1999 +++ 2.3.16-d117/arch/i386/mm/init.c Sat Sep 4 16:15:20 1999 @@ -375,7 +375,7 @@ int datapages = 0; int initpages = 0; unsigned long tmp; - unsigned long addr; + unsigned long addr, size; int i, avail; end_mem &= PAGE_MASK; @@ -415,14 +415,19 @@ for (avail = i = 0; i < e820.nr_map; i++) { if (e820.map[i].type != 1) /* not usable memory */ continue; - printk("memory region: %luk @ %08lx\n", - ((long)(e820.map[i].size)) / 1024, - (long)(e820.map[i].addr) ); - for (addr=PAGE_ALIGN(((long)(e820.map[i].addr)))+PAGE_OFFSET, - tmp = 0; - tmp < (unsigned long)(e820.map[i].size); - tmp += PAGE_SIZE, - addr += PAGE_SIZE) { + + /* honour page alignment */ + addr = e820.map[i].addr; + size = e820.map[i].size; + size -= PAGE_ALIGN(addr) - addr; + addr = PAGE_ALIGN(addr); + size += addr + 1; + size &= PAGE_MASK; + size -= addr - 1; + + printk("memory region: %luk @ %08lx\n", size / 1024, addr); + for (tmp = PAGE_SIZE-1; tmp <= size; + tmp += PAGE_SIZE, addr += PAGE_SIZE) { /* this little bit of grossness is for dealing * with memory borrowing for system bookkeeping