X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/0b4c1975fb5e4eccf1012a35081f7e7799b81046..04b8595b18b1b41ac7a206e4b3d51a635f8413d7:/osfmk/i386/hibernate_i386.c diff --git a/osfmk/i386/hibernate_i386.c b/osfmk/i386/hibernate_i386.c index b333db549..a16994234 100644 --- a/osfmk/i386/hibernate_i386.c +++ b/osfmk/i386/hibernate_i386.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2004-2012 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -48,12 +48,10 @@ extern ppnum_t max_ppnum; #define MAX_BANKS 32 -int hibernate_page_list_allocate_avoided; - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ hibernate_page_list_t * -hibernate_page_list_allocate(void) +hibernate_page_list_allocate(boolean_t log) { ppnum_t base, num; vm_size_t size; @@ -66,6 +64,7 @@ hibernate_page_list_allocate(void) uint32_t mcount, msize, i; hibernate_bitmap_t dram_ranges[MAX_BANKS]; boot_args * args = (boot_args *) PE_state.bootArgs; + uint32_t non_os_pagecount; mptr = (EfiMemoryRange *)ml_static_ptovirt(args->MemoryMap); if (args->MemoryMapDescriptorSize == 0) @@ -73,9 +72,8 @@ hibernate_page_list_allocate(void) msize = args->MemoryMapDescriptorSize; mcount = args->MemoryMapSize / msize; - hibernate_page_list_allocate_avoided = 0; - num_banks = 0; + non_os_pagecount = 0; for (i = 0; i < mcount; i++, mptr = (EfiMemoryRange *)(((vm_offset_t)mptr) + msize)) { base = (ppnum_t) (mptr->PhysicalStart >> I386_PGSHIFT); @@ -86,18 +84,21 @@ hibernate_page_list_allocate(void) if ((base + num - 1) > max_ppnum) num = max_ppnum - base + 1; if (!num) - continue; + 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: - case kEfiACPIMemoryNVS: - case kEfiPalCode: for (bank = 0; bank < num_banks; bank++) { @@ -131,9 +132,6 @@ 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: @@ -174,11 +172,11 @@ hibernate_page_list_allocate(void) bitmap->last_page = dram_ranges[bank].last_page; bitmap->bitmapwords = (bitmap->last_page + 1 - bitmap->first_page + 31) >> 5; - kprintf("hib bank[%d]: 0x%x000 end 0x%xfff\n", bank, - bitmap->first_page, - bitmap->last_page); + if (log) kprintf("hib bank[%d]: 0x%x000 end 0x%xfff\n", + bank, bitmap->first_page, bitmap->last_page); bitmap = (hibernate_bitmap_t *) &bitmap->bitmap[bitmap->bitmapwords]; } + if (log) printf("efi pagecount %d\n", non_os_pagecount); return (list); } @@ -188,6 +186,7 @@ hibernate_page_list_allocate(void) void hibernate_page_list_setall_machine( __unused hibernate_page_list_t * page_list, __unused hibernate_page_list_t * page_list_wired, + __unused boolean_t preflight, __unused uint32_t * pagesOut) { } @@ -200,13 +199,6 @@ hibernate_page_list_set_volatile( hibernate_page_list_t * page_list, { boot_args * args = (boot_args *) PE_state.bootArgs; -#if !defined(x86_64) - hibernate_set_page_state(page_list, page_list_wired, - I386_HIB_PAGETABLE, I386_HIB_PAGETABLE_COUNT, - kIOHibernatePageStateFree); - *pagesOut -= I386_HIB_PAGETABLE_COUNT; -#endif - if (args->efiRuntimeServicesPageStart) { hibernate_set_page_state(page_list, page_list_wired, @@ -227,13 +219,8 @@ hibernate_processor_setup(IOHibernateImageHeader * header) header->runtimePages = args->efiRuntimeServicesPageStart; header->runtimePageCount = args->efiRuntimeServicesPageCount; header->runtimeVirtualPages = args->efiRuntimeServicesVirtualPageStart; - if (args->Version == kBootArgsVersion1 && args->Revision >= kBootArgsRevision1_6) { - header->performanceDataStart = args->performanceDataStart; - header->performanceDataSize = args->performanceDataSize; - } else { - header->performanceDataStart = 0; - header->performanceDataSize = 0; - } + header->performanceDataStart = args->performanceDataStart; + header->performanceDataSize = args->performanceDataSize; return (KERN_SUCCESS); } @@ -241,42 +228,11 @@ hibernate_processor_setup(IOHibernateImageHeader * header) void hibernate_vm_lock(void) { - if (current_cpu_datap()->cpu_hibernate) - { - vm_page_lock_queues(); - lck_mtx_lock(&vm_page_queue_free_lock); - - if (vm_page_local_q) { - uint32_t i; - - for (i = 0; i < vm_page_local_q_count; i++) { - struct vpl *lq; - - lq = &vm_page_local_q[i].vpl_un.vpl; - - VPL_LOCK(&lq->vpl_lock); - } - } - } + if (current_cpu_datap()->cpu_hibernate) hibernate_vm_lock_queues(); } void hibernate_vm_unlock(void) { - if (current_cpu_datap()->cpu_hibernate) - { - if (vm_page_local_q) { - uint32_t i; - - for (i = 0; i < vm_page_local_q_count; i++) { - struct vpl *lq; - - lq = &vm_page_local_q[i].vpl_un.vpl; - - VPL_UNLOCK(&lq->vpl_lock); - } - } - lck_mtx_unlock(&vm_page_queue_free_lock); - vm_page_unlock_queues(); - } + if (current_cpu_datap()->cpu_hibernate) hibernate_vm_unlock_queues(); }