]>
git.saurik.com Git - apple/xnu.git/blob - osfmk/kern/hibernate.c
c88c0fd1e3c414ee2356a54f804cd5fb568b6a6e
   2  * Copyright (c) 2004-2005 Apple Computer, Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. The rights granted to you under the License 
  10  * may not be used to create, or enable the creation or redistribution of, 
  11  * unlawful or unlicensed copies of an Apple operating system, or to 
  12  * circumvent, violate, or enable the circumvention or violation of, any 
  13  * terms of an Apple operating system software license agreement. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  18  * The Original Code and all software distributed under the License are 
  19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  23  * Please see the License for the specific language governing rights and 
  24  * limitations under the License. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  29 #include <kern/kalloc.h> 
  30 #include <kern/machine.h> 
  31 #include <kern/misc_protos.h> 
  32 #include <kern/thread.h> 
  33 #include <kern/processor.h> 
  34 #include <mach/machine.h> 
  35 #include <mach/processor_info.h> 
  36 #include <mach/mach_types.h> 
  37 #include <default_pager/default_pager_internal.h> 
  38 #include <IOKit/IOPlatformExpert.h> 
  40 #include <IOKit/IOHibernatePrivate.h> 
  41 #include <vm/vm_page.h> 
  42 #include <vm/vm_pageout.h> 
  43 #include <vm/vm_purgeable_internal.h> 
  45 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 
  48 hibernate_setup(IOHibernateImageHeader 
* header
, 
  49                         uint32_t  free_page_ratio
, 
  50                         uint32_t  free_page_time
, 
  52                         hibernate_page_list_t 
** page_list_ret
, 
  53                         hibernate_page_list_t 
** page_list_wired_ret
, 
  54                         hibernate_page_list_t 
** page_list_pal_ret
, 
  55                         boolean_t 
* encryptedswap
) 
  57     hibernate_page_list_t 
* page_list 
= NULL
; 
  58     hibernate_page_list_t 
* page_list_wired 
= NULL
; 
  59     hibernate_page_list_t 
* page_list_pal 
= NULL
; 
  60     uint32_t                gobble_count
; 
  62     *page_list_ret       
= NULL
; 
  63     *page_list_wired_ret 
= NULL
; 
  64         *page_list_pal_ret    
= NULL
; 
  67         hibernate_flush_memory(); 
  69     page_list 
= hibernate_page_list_allocate(); 
  71         return (KERN_RESOURCE_SHORTAGE
); 
  72     page_list_wired 
= hibernate_page_list_allocate(); 
  75         kfree(page_list
, page_list
->list_size
); 
  76         return (KERN_RESOURCE_SHORTAGE
); 
  78     page_list_pal 
= hibernate_page_list_allocate(); 
  81         kfree(page_list
, page_list
->list_size
); 
  82         kfree(page_list_wired
, page_list_wired
->list_size
); 
  83         return (KERN_RESOURCE_SHORTAGE
); 
  86     *encryptedswap 
= dp_encryption
; 
  88     // pages we could force out to reduce hibernate image size 
  89     gobble_count 
= (uint32_t)((((uint64_t) page_list
->page_count
) * ((uint64_t) free_page_ratio
)) / 100); 
  91     // no failures hereafter 
  93     hibernate_processor_setup(header
); 
  95     HIBLOG("hibernate_alloc_pages flags %08x, gobbling %d pages\n",  
  96             header
->processorFlags
, gobble_count
); 
  99         hibernate_gobble_pages(gobble_count
, free_page_time
); 
 101     *page_list_ret       
= page_list
; 
 102     *page_list_wired_ret 
= page_list_wired
; 
 103     *page_list_pal_ret    
= page_list_pal
; 
 105     return (KERN_SUCCESS
); 
 109 hibernate_teardown(hibernate_page_list_t 
* page_list
, 
 110                     hibernate_page_list_t 
* page_list_wired
, 
 111                     hibernate_page_list_t 
* page_list_pal
) 
 113     hibernate_free_gobble_pages(); 
 116         kfree(page_list
, page_list
->list_size
); 
 118         kfree(page_list_wired
, page_list_wired
->list_size
); 
 120         kfree(page_list_pal
, page_list_pal
->list_size
); 
 122     return (KERN_SUCCESS
);