unsigned long flags;
                pgdat_resize_lock(pgdat, &flags);
                for (i = 0; i < pgdat->node_spanned_pages; i++) {
+                       if (!pfn_valid(pgdat->node_start_pfn + i))
+                               continue;
                        page = pgdat_page_nr(pgdat, i);
                        total++;
                        if (PageHighMem(page))
        struct page *page;
        unsigned long reservedpages = 0, codesize, initsize, datasize, bsssize;
 
-       num_physpages = max_pfn;        /* RAM is assumed contiguous */
+       num_physpages = lmb.memory.size >> PAGE_SHIFT;
        high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
 
 #ifdef CONFIG_NEED_MULTIPLE_NODES
                }
        }
 #else
-       max_mapnr = num_physpages;
+       max_mapnr = max_pfn;
        totalram_pages += free_all_bootmem();
 #endif
        for_each_pgdat(pgdat) {
                for (i = 0; i < pgdat->node_spanned_pages; i++) {
+                       if (!pfn_valid(pgdat->node_start_pfn + i))
+                               continue;
                        page = pgdat_page_nr(pgdat, i);
                        if (PageReserved(page))
                                reservedpages++;
 
 {
        unsigned long top_of_ram = lmb_end_of_DRAM();
        unsigned long total_ram = lmb_phys_mem_size();
+       unsigned int i;
 
        printk(KERN_INFO "Top of RAM: 0x%lx, Total RAM: 0x%lx\n",
               top_of_ram, total_ram);
               (top_of_ram - total_ram) >> 20);
 
        map_cpu_to_node(boot_cpuid, 0);
-       add_region(0, 0, lmb_end_of_DRAM() >> PAGE_SHIFT);
+       for (i = 0; i < lmb.memory.cnt; ++i)
+               add_region(0, lmb.memory.region[i].base >> PAGE_SHIFT,
+                          lmb_size_pages(&lmb.memory, i));
        node_set_online(0);
 }