--- bootmem.c 7 Apr 2005 16:39:24 -0000 1.2 +++ bootmem.c 8 Apr 2005 13:20:02 -0000 @@ -58,8 +58,8 @@ static unsigned long __init init_bootmem pgdat_list = pgdat; mapsize = (mapsize + (sizeof(long) - 1UL)) & ~(sizeof(long) - 1UL); - bdata->node_bootmem_map = phys_to_virt(mapstart << PAGE_SHIFT); - bdata->node_boot_start = (start << PAGE_SHIFT); + bdata->node_bootmem_map = phys_to_virt(pfn_to_phys(mapstart)); + bdata->node_boot_start = pfn_to_phys(start); bdata->node_low_pfn = end; /* @@ -86,11 +86,11 @@ static void __init reserve_bootmem_core( unsigned long sidx = (addr - bdata->node_boot_start)/PAGE_SIZE; unsigned long eidx = (addr + size - bdata->node_boot_start + PAGE_SIZE-1)/PAGE_SIZE; - unsigned long end = (addr + size + PAGE_SIZE-1)/PAGE_SIZE; + unsigned long end = phys_to_pfn(PAGE_ALIGN(addr + size)); BUG_ON(!size); BUG_ON(sidx >= eidx); - BUG_ON((addr >> PAGE_SHIFT) >= bdata->node_low_pfn); + BUG_ON(phys_to_pfn(addr) >= bdata->node_low_pfn); BUG_ON(end > bdata->node_low_pfn); for (i = sidx; i < eidx; i++) @@ -111,7 +111,7 @@ static void __init free_bootmem_core(boo */ unsigned long sidx; unsigned long eidx = (addr + size - bdata->node_boot_start)/PAGE_SIZE; - unsigned long end = (addr + size)/PAGE_SIZE; + unsigned long end = phys_to_pfn(addr + size); BUG_ON(!size); BUG_ON(end > bdata->node_low_pfn); @@ -260,6 +260,7 @@ static unsigned long __init free_all_boo unsigned long i, count, total = 0; unsigned long idx; unsigned long *map; + unsigned long mapsize; int gofast = 0; BUG_ON(!bdata->node_bootmem_map); @@ -267,7 +268,7 @@ static unsigned long __init free_all_boo count = 0; /* first extant page of the node */ page = virt_to_page(phys_to_virt(bdata->node_boot_start)); - idx = bdata->node_low_pfn - (bdata->node_boot_start >> PAGE_SHIFT); + idx = bdata->node_low_pfn - phys_to_pfn(bdata->node_boot_start); map = bdata->node_bootmem_map; /* Check physaddr is O(LOG2(BITS_PER_LONG)) page aligned */ if (bdata->node_boot_start == 0 || @@ -313,7 +314,9 @@ static unsigned long __init free_all_boo */ page = virt_to_page(bdata->node_bootmem_map); count = 0; - for (i = 0; i < ((bdata->node_low_pfn-(bdata->node_boot_start >> PAGE_SHIFT))/8 + PAGE_SIZE-1)/PAGE_SIZE; i++,page++) { + mapsize = (bdata->node_low_pfn - phys_to_pfn(bdata->node_boot_start)+7)/8; + mapsize = (mapsize + PAGE_SIZE-1)/PAGE_SIZE; + for (i = 0; i < mapsize; i++, page++) { count++; __ClearPageReserved(page); set_page_count(page, 1);