+ base = (ppnum_t) (mptr->PhysicalStart >> I386_PGSHIFT);
+ num = (ppnum_t) mptr->NumberOfPages;
+
+ if (base > max_ppnum)
+ continue;
+ if ((base + num - 1) > max_ppnum)
+ num = max_ppnum - base + 1;
+ if (!num)
+ continue;
+
+ switch (mptr->Type)
+ {
+ // any kind of dram
+ case kEfiACPIMemoryNVS:
+ case kEfiPalCode:
+ non_os_pagecount += num;
+
+ // OS used dram
+ case kEfiLoaderCode:
+ case kEfiLoaderData:
+ case kEfiBootServicesCode:
+ case kEfiBootServicesData:
+ case kEfiConventionalMemory:
+
+ for (bank = 0; bank < num_banks; bank++)
+ {
+ if (dram_ranges[bank].first_page <= base)
+ continue;
+ if ((base + num) == dram_ranges[bank].first_page)
+ {
+ dram_ranges[bank].first_page = base;
+ num = 0;
+ }
+ break;
+ }
+ if (!num) break;
+
+ if (bank && (base == (1 + dram_ranges[bank - 1].last_page)))
+ bank--;
+ else
+ {
+ num_banks++;
+ if (num_banks >= MAX_BANKS) break;
+ bcopy(&dram_ranges[bank],
+ &dram_ranges[bank + 1],
+ (num_banks - bank - 1) * sizeof(hibernate_bitmap_t));
+ dram_ranges[bank].first_page = base;
+ }
+ dram_ranges[bank].last_page = base + num - 1;
+ break;
+
+ // runtime services will be restarted, so no save
+ case kEfiRuntimeServicesCode:
+ case kEfiRuntimeServicesData:
+ // contents are volatile once the platform expert starts
+ case kEfiACPIReclaimMemory:
+ // non dram
+ case kEfiReservedMemoryType:
+ case kEfiUnusableMemory:
+ case kEfiMemoryMappedIO:
+ case kEfiMemoryMappedIOPortSpace:
+ default:
+ break;
+ }