]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kern/hibernate.c
xnu-2050.24.15.tar.gz
[apple/xnu.git] / osfmk / kern / hibernate.c
index 3bf72594e5d7b6e32f1b145cd6764b2e0fc4de63..431c4795cfe0008c9cc73a3b50d92626b46d4bc6 100644 (file)
 #include <vm/vm_pageout.h>
 #include <vm/vm_purgeable_internal.h>
 
-
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 kern_return_t 
 hibernate_setup(IOHibernateImageHeader * header,
-                        uint32_t free_page_ratio,
-                        uint32_t free_page_time,
+                        uint32_t  free_page_ratio,
+                        uint32_t  free_page_time,
+                        boolean_t vmflush,
                        hibernate_page_list_t ** page_list_ret,
                        hibernate_page_list_t ** page_list_wired_ret,
-                        boolean_t * encryptedswap)
+                       hibernate_page_list_t ** page_list_pal_ret)
 {
     hibernate_page_list_t * page_list = NULL;
     hibernate_page_list_t * page_list_wired = NULL;
+    hibernate_page_list_t * page_list_pal = NULL;
     uint32_t               gobble_count;
 
     *page_list_ret       = NULL;
     *page_list_wired_ret = NULL;
+       *page_list_pal_ret    = NULL;
+    
+    if (vmflush && dp_isssd)
+        hibernate_flush_memory();
 
-
-    page_list = hibernate_page_list_allocate();
+    page_list = hibernate_page_list_allocate(TRUE);
     if (!page_list)
         return (KERN_RESOURCE_SHORTAGE);
-    page_list_wired = hibernate_page_list_allocate();
+    page_list_wired = hibernate_page_list_allocate(FALSE);
     if (!page_list_wired)
     {
         kfree(page_list, page_list->list_size);
         return (KERN_RESOURCE_SHORTAGE);
     }
-
-    *encryptedswap = dp_encryption;
+    page_list_pal = hibernate_page_list_allocate(FALSE);
+    if (!page_list_pal)
+    {
+        kfree(page_list, page_list->list_size);
+        kfree(page_list_wired, page_list_wired->list_size);
+        return (KERN_RESOURCE_SHORTAGE);
+    }
 
     // pages we could force out to reduce hibernate image size
     gobble_count = (uint32_t)((((uint64_t) page_list->page_count) * ((uint64_t) free_page_ratio)) / 100);
@@ -80,21 +89,25 @@ hibernate_setup(IOHibernateImageHeader * header,
 
     hibernate_processor_setup(header);
 
-    HIBLOG("hibernate_alloc_pages flags %08x, gobbling %d pages\n", 
-           header->processorFlags, gobble_count);
-
     if (gobble_count)
        hibernate_gobble_pages(gobble_count, free_page_time);
 
-    *page_list_ret       = page_list;
-    *page_list_wired_ret = page_list_wired;
+    HIBLOG("hibernate_alloc_pages act %d, inact %d, anon %d, throt %d, spec %d, wire %d, wireinit %d\n",
+           vm_page_active_count, vm_page_inactive_count, 
+           vm_page_anonymous_count,  vm_page_throttled_count, vm_page_speculative_count,
+           vm_page_wire_count, vm_page_wire_count_initial);
+
+    *page_list_ret        = page_list;
+    *page_list_wired_ret  = page_list_wired;
+    *page_list_pal_ret    = page_list_pal;
 
     return (KERN_SUCCESS);
 }
 
 kern_return_t 
 hibernate_teardown(hibernate_page_list_t * page_list,
-                    hibernate_page_list_t * page_list_wired)
+                    hibernate_page_list_t * page_list_wired,
+                   hibernate_page_list_t * page_list_pal)
 {
     hibernate_free_gobble_pages();
 
@@ -102,6 +115,8 @@ hibernate_teardown(hibernate_page_list_t * page_list,
         kfree(page_list, page_list->list_size);
     if (page_list_wired)
         kfree(page_list_wired, page_list_wired->list_size);
+    if (page_list_pal)
+        kfree(page_list_pal, page_list_pal->list_size);
 
     return (KERN_SUCCESS);
 }