Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | /* * Copyright (c) 2008 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. The rights granted to you under the License * may not be used to create, or enable the creation or redistribution of, * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /*! * i386/x86_64-specific functions required to support hibernation resume. */ #include <i386/pmap.h> #include <i386/proc_reg.h> #include <IOKit/IOHibernatePrivate.h> #include <vm/WKdm_new.h> #include <machine/pal_hibernate.h> extern pd_entry_t BootPTD[2048]; // src is virtually mapped, not page aligned, // dst is a physical 4k page aligned ptr, len is one 4K page // src & dst will not overlap uintptr_t hibernate_restore_phys_page(uint64_t src, uint64_t dst, uint32_t len, uint32_t procFlags) { (void)procFlags; uint64_t * d; uint64_t * s; if (src == 0) { return (uintptr_t)dst; } d = (uint64_t *)pal_hib_map(DEST_COPY_AREA, dst); s = (uint64_t *) (uintptr_t)src; __nosan_memcpy(d, s, len); return (uintptr_t)d; } #undef hibprintf void hibprintf(const char *fmt, ...); uintptr_t pal_hib_map(uintptr_t virt, uint64_t phys) { uintptr_t index; switch (virt) { case DEST_COPY_AREA: case SRC_COPY_AREA: case COPY_PAGE_AREA: case BITMAP_AREA: case IMAGE_AREA: case IMAGE2_AREA: case SCRATCH_AREA: case WKDM_AREA: break; default: asm("cli;hlt;"); break; } if (phys < WKDM_AREA) { // first 4Gb is all mapped, // and do not expect source areas to cross 4Gb return phys; } index = (virt >> I386_LPGSHIFT); virt += (uintptr_t)(phys & I386_LPGMASK); phys = ((phys & ~((uint64_t)I386_LPGMASK)) | INTEL_PTE_PS | INTEL_PTE_VALID | INTEL_PTE_WRITE); if (phys == BootPTD[index]) { return virt; } BootPTD[index] = phys; invlpg(virt); BootPTD[index + 1] = (phys + I386_LPGBYTES); invlpg(virt + I386_LPGBYTES); return virt; } void pal_hib_restore_pal_state(uint32_t *arg) { (void)arg; } void pal_hib_resume_init(__unused pal_hib_ctx_t *ctx, __unused hibernate_page_list_t *map, __unused uint32_t *nextFree) { } void pal_hib_restored_page(__unused pal_hib_ctx_t *ctx, __unused pal_hib_restore_stage_t stage, __unused ppnum_t ppnum) { } void pal_hib_patchup(__unused pal_hib_ctx_t *ctx) { } void pal_hib_decompress_page(void *src, void *dst, void *scratch, unsigned int compressedSize) { WKdm_decompress_new((WK_word*)src, (WK_word*)dst, (WK_word*)scratch, compressedSize); } |