- 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)
- hibernate_flush_memory();
-
- page_list = hibernate_page_list_allocate();
- if (!page_list)
- return (KERN_RESOURCE_SHORTAGE);
- page_list_wired = hibernate_page_list_allocate();
- if (!page_list_wired)
- {
- kfree(page_list, page_list->list_size);
- return (KERN_RESOURCE_SHORTAGE);
- }
- page_list_pal = hibernate_page_list_allocate();
- if (!page_list_pal)
- {
- kfree(page_list, page_list->list_size);
- kfree(page_list_wired, page_list_wired->list_size);
- return (KERN_RESOURCE_SHORTAGE);
- }
-
- *encryptedswap = dp_encryption;
-
- // 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);
-
- // no failures hereafter
-
- 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;
- *page_list_pal_ret = page_list_pal;
-
- return (KERN_SUCCESS);
+ kern_return_t retval = KERN_SUCCESS;
+
+ hibernate_page_list_t * page_list = NULL;
+ hibernate_page_list_t * page_list_wired = NULL;
+ hibernate_page_list_t * page_list_pal = NULL;
+
+ page_list = hibernate_page_list_allocate(TRUE);
+ if (!page_list) {
+ HIBLOG("%s: failed for page_list\n", __FUNCTION__);
+ retval = KERN_RESOURCE_SHORTAGE;
+ goto done;
+ }
+ page_list_wired = hibernate_page_list_allocate(FALSE);
+ if (!page_list_wired) {
+ kfree(page_list, page_list->list_size);
+ HIBLOG("%s: failed for page_list_wired\n", __FUNCTION__);
+ retval = KERN_RESOURCE_SHORTAGE;
+ goto done;
+ }
+ 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);
+ HIBLOG("%s: failed for page_list_pal\n", __FUNCTION__);
+ retval = KERN_RESOURCE_SHORTAGE;
+ goto done;
+ }
+ *page_list_ret = page_list;
+ *page_list_wired_ret = page_list_wired;
+ *page_list_pal_ret = page_list_pal;
+
+done:
+ return retval;