]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/i386/hibernate_i386.c
xnu-1504.9.17.tar.gz
[apple/xnu.git] / osfmk / i386 / hibernate_i386.c
index f164b8ec9cb1673aa29c27da771cab7a991d6c17..b333db5494eb9ccc5379b33b648a18690711f285 100644 (file)
 #include <vm/vm_page.h>
 #include <i386/i386_lowmem.h>
 
+extern ppnum_t max_ppnum;
+
 #define MAX_BANKS      32
 
+int hibernate_page_list_allocate_avoided;
+
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 hibernate_page_list_t *
@@ -69,11 +73,18 @@ hibernate_page_list_allocate(void)
     msize = args->MemoryMapDescriptorSize;
     mcount = args->MemoryMapSize / msize;
 
+    hibernate_page_list_allocate_avoided = 0;
+
     num_banks = 0;
     for (i = 0; i < mcount; i++, mptr = (EfiMemoryRange *)(((vm_offset_t)mptr) + msize))
     {
        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;
 
@@ -120,6 +131,9 @@ hibernate_page_list_allocate(void)
            case kEfiRuntimeServicesData:
            // contents are volatile once the platform expert starts
            case kEfiACPIReclaimMemory:
+               hibernate_page_list_allocate_avoided += num;
+               break;
+
            // non dram
            case kEfiReservedMemoryType:
            case kEfiUnusableMemory: