- part = IOCopyMediaForDev(block_dev);
- if (!part)
- {
- err = kIOReturnNotFound;
- break;
- }
- err = part->callPlatformFunction(PLATFORM_FUNCTION_GET_MEDIA_ENCRYPTION_KEY_UUID, false,
- (void *) &keyUUID, (void *) &keyStoreUUID, NULL, NULL);
- if ((kIOReturnSuccess == err) && keyUUID && keyStoreUUID)
- {
-// IOLog("got volume key %s\n", keyStoreUUID->getCStringNoCopy());
- uuid_t volumeKeyUUID;
- aks_volume_key_t vek;
- static IOService * sKeyStore;
- static const OSSymbol * sAKSGetKey;
-
- if (!sAKSGetKey)
- sAKSGetKey = OSSymbol::withCStringNoCopy(AKS_PLATFORM_FUNCTION_GETKEY);
- if (!sKeyStore)
- sKeyStore = (IOService *) IORegistryEntry::fromPath(AKS_SERVICE_PATH, gIOServicePlane);
- if (sKeyStore)
- err = uuid_parse(keyStoreUUID->getCStringNoCopy(), volumeKeyUUID);
- else
- err = kIOReturnNoResources;
- if (kIOReturnSuccess == err)
- err = sKeyStore->callPlatformFunction(sAKSGetKey, true, volumeKeyUUID, &vek, NULL, NULL);
- if (kIOReturnSuccess != err)
- IOLog("volume key err 0x%x\n", err);
- else
- {
- size_t bytes = (kIOHibernateAESKeySize / 8);
- if (vek.key.keybytecount < bytes)
- bytes = vek.key.keybytecount;
- bcopy(&vek.key.keybytes[0], volumeCryptKey, bytes);
- }
- bzero(&vek, sizeof(vek));
- }
- part->release();
-
- part = IOCopyMediaForDev(hibernate_image_dev);
- if (!part)
- {
- err = kIOReturnNotFound;
- break;
- }
-
- vars->pollers = OSArray::withCapacity(4);
- if (!vars->pollers)
- {
- err = kIOReturnNoMemory;
- break;
- }
-
- err = GetImageBlockSize(part, vars->pollers, &vars->blockSize);
-
- HIBLOG("hibernate image major %d, minor %d, blocksize %ld, pollers %d\n",
- major(hibernate_image_dev), minor(hibernate_image_dev), (long)vars->blockSize,
- vars->pollers->getCount());
-
- if (err != kIOReturnSuccess)
- break;
-
- IORegistryEntry * next;
- OSData * data;
- if (vars->blockSize < sizeof(IOHibernateImageHeader))
- {
- err = kIOReturnError;
- continue;
- }
-
- err = IOHibernatePollerProbe(vars, (IOService *) part);
- if (kIOReturnSuccess != err) break;
-
- err = IOHibernatePollerOpen(vars, kIOPolledPreflightState, ioBuffer);
- if (kIOReturnSuccess != err) break;
-
- vars->media = part;
- next = part;
- while (next)
- {
- next->setProperty(kIOPolledInterfaceActiveKey, kOSBooleanTrue);
- next = next->getParentEntry(gIOServicePlane);
- }
-
- *fileVars = vars;
- *fileExtents = extentsData;
-
- // make imagePath
-
- if ((extentsData->getLength() >= sizeof(IOPolledFileExtent)))
- {
- char str2[24 + sizeof(uuid_string_t) + 2];
-
-#if defined(__i386__) || defined(__x86_64__)
- if (!gIOCreateEFIDevicePathSymbol)
- gIOCreateEFIDevicePathSymbol = OSSymbol::withCString("CreateEFIDevicePath");
-
- if (keyUUID)
- snprintf(str2, sizeof(str2), "%qx:%s",
- vars->extentMap[0].start, keyUUID->getCStringNoCopy());
- else
- snprintf(str2, sizeof(str2), "%qx", vars->extentMap[0].start);
-
- err = IOService::getPlatform()->callPlatformFunction(
- gIOCreateEFIDevicePathSymbol, false,
- (void *) part, (void *) str2,
- (void *) (uintptr_t) true, (void *) &data);
-#else
- char str1[256];
- int len = sizeof(str1);
-
- if (!part->getPath(str1, &len, gIODTPlane))
- err = kIOReturnNotFound;
- else
- {
- snprintf(str2, sizeof(str2), ",%qx", vars->extentMap[0].start);
- // (strip the plane name)
- char * tail = strchr(str1, ':');
- if (!tail)
- tail = str1 - 1;
- data = OSData::withBytes(tail + 1, strlen(tail + 1));
- data->appendBytes(str2, strlen(str2));
- }
-#endif
- if (kIOReturnSuccess == err)
- *imagePath = data;
- else
- HIBLOG("error 0x%x getting path\n", err);
- }
- }
- while (false);
-
- if (kIOReturnSuccess != err)
- {
- HIBLOG("error 0x%x opening hibernation file\n", err);
- if (vars->fileRef)
- {
- kern_close_file_for_direct_io(vars->fileRef, 0, 0, 0, 0, 0);
- vars->fileRef = NULL;
- }
- }
- else
- {
- WriteExtentsToFile(vars->fileRef, kIOHibernateHeaderOpenSignature, vars->blockSize,
- (IOPolledFileExtent *)extentsData->getBytesNoCopy(),
- extentsData->getLength());
- }
-
- if (part)
- part->release();
-
- return (err);
-}
-
-IOReturn
-IOPolledFileClose( IOPolledFileIOVars * vars )
-{
- if (vars->pollers)
- {
- IOHibernatePollerClose(vars, kIOPolledPostflightState);
- vars->pollers->release();
- }
-
- bzero(vars, sizeof(IOPolledFileIOVars));
-
- return (kIOReturnSuccess);
-}
-
-static IOReturn
-IOPolledFileSeek(IOPolledFileIOVars * vars, uint64_t position)
-{
- IOPolledFileExtent * extentMap;
-
- extentMap = vars->extentMap;
-
- vars->position = position;
-
- while (position >= extentMap->length)
- {
- position -= extentMap->length;
- extentMap++;
- }
-
- vars->currentExtent = extentMap;
- vars->extentRemaining = extentMap->length - position;
- vars->extentPosition = vars->position - position;
-
- if (vars->bufferSize <= vars->extentRemaining)
- vars->bufferLimit = vars->bufferSize;
- else
- vars->bufferLimit = vars->extentRemaining;
-
- return (kIOReturnSuccess);
-}
-
-static IOReturn
-IOPolledFileWrite(IOPolledFileIOVars * vars,
- const uint8_t * bytes, IOByteCount size,
- hibernate_cryptvars_t * cryptvars)
-{
- IOReturn err = kIOReturnSuccess;
- IOByteCount copy;
- bool flush = false;
-
- do
- {
- if (!bytes && !size)
- {
- // seek to end of block & flush
- size = vars->position & (vars->blockSize - 1);
- if (size)
- size = vars->blockSize - size;
- flush = true;
- // use some garbage for the fill
- bytes = vars->buffer + vars->bufferOffset;
- }
-
- copy = vars->bufferLimit - vars->bufferOffset;
- if (copy > size)
- copy = size;
- else
- flush = true;
-
- if (bytes)
- {
- bcopy(bytes, vars->buffer + vars->bufferHalf + vars->bufferOffset, copy);
- bytes += copy;
- }
- else
- bzero(vars->buffer + vars->bufferHalf + vars->bufferOffset, copy);
-
- size -= copy;
- vars->bufferOffset += copy;
- vars->position += copy;
-
- if (flush && vars->bufferOffset)
- {
- uint64_t offset = (vars->position - vars->bufferOffset
- - vars->extentPosition + vars->currentExtent->start);
- uint32_t length = (vars->bufferOffset);
-
-#if CRYPTO
- if (cryptvars && vars->encryptStart
- && (vars->position > vars->encryptStart)
- && ((vars->position - length) < vars->encryptEnd))
- {
- AbsoluteTime startTime, endTime;
-
- uint64_t encryptLen, encryptStart;
- encryptLen = vars->position - vars->encryptStart;
- if (encryptLen > length)
- encryptLen = length;
- encryptStart = length - encryptLen;
- if (vars->position > vars->encryptEnd)
- encryptLen -= (vars->position - vars->encryptEnd);
-
- clock_get_uptime(&startTime);
-
- // encrypt the buffer
- aes_encrypt_cbc(vars->buffer + vars->bufferHalf + encryptStart,
- &cryptvars->aes_iv[0],
- encryptLen / AES_BLOCK_SIZE,
- vars->buffer + vars->bufferHalf + encryptStart,
- &cryptvars->ctx.encrypt);
-
- clock_get_uptime(&endTime);
- ADD_ABSOLUTETIME(&vars->cryptTime, &endTime);
- SUB_ABSOLUTETIME(&vars->cryptTime, &startTime);
- vars->cryptBytes += encryptLen;
-
- // save initial vector for following encrypts
- bcopy(vars->buffer + vars->bufferHalf + encryptStart + encryptLen - AES_BLOCK_SIZE,
- &cryptvars->aes_iv[0],
- AES_BLOCK_SIZE);
- }
-#endif /* CRYPTO */
-
- if (vars->io)
- {
- err = IOHibernatePollerIODone(vars, true);
- if (kIOReturnSuccess != err)
- break;
- }
-
-if (vars->position & (vars->blockSize - 1)) HIBLOG("misaligned file pos %qx\n", vars->position);
-//if (length != vars->bufferSize) HIBLOG("short write of %qx ends@ %qx\n", length, offset + length);
-
- err = IOHibernatePollerIO(vars, kIOPolledWrite, vars->bufferHalf, offset, length);
- if (kIOReturnSuccess != err)
- break;
- vars->io = true;
-
- vars->extentRemaining -= vars->bufferOffset;
- if (!vars->extentRemaining)
- {
- vars->currentExtent++;
- vars->extentRemaining = vars->currentExtent->length;
- vars->extentPosition = vars->position;
- if (!vars->extentRemaining)
- {
- err = kIOReturnOverrun;
- break;
- }
- }
-
- vars->bufferHalf = vars->bufferHalf ? 0 : vars->bufferSize;
- vars->bufferOffset = 0;
- if (vars->bufferSize <= vars->extentRemaining)
- vars->bufferLimit = vars->bufferSize;
- else
- vars->bufferLimit = vars->extentRemaining;
-
- flush = false;
- }
- }
- while (size);
-
- return (err);
-}
-
-static IOReturn
-IOPolledFileRead(IOPolledFileIOVars * vars,
- uint8_t * bytes, IOByteCount size,
- hibernate_cryptvars_t * cryptvars)
-{
- IOReturn err = kIOReturnSuccess;
- IOByteCount copy;
-
-// bytesWritten += size;
-
- do
- {
- copy = vars->bufferLimit - vars->bufferOffset;
- if (copy > size)
- copy = size;
-
- if (bytes)
- {
- bcopy(vars->buffer + vars->bufferHalf + vars->bufferOffset, bytes, copy);
- bytes += copy;
- }
- size -= copy;
- vars->bufferOffset += copy;
-// vars->position += copy;
-
- if ((vars->bufferOffset == vars->bufferLimit) && (vars->position < vars->readEnd))
- {
- if (vars->io)
- {
- err = IOHibernatePollerIODone(vars, false);
- if (kIOReturnSuccess != err)
- break;
- }
- else
- cryptvars = 0;
-
-if (vars->position & (vars->blockSize - 1)) HIBLOG("misaligned file pos %qx\n", vars->position);
-
- vars->position += vars->lastRead;
- vars->extentRemaining -= vars->lastRead;
- vars->bufferLimit = vars->lastRead;
-
- if (!vars->extentRemaining)
- {
- vars->currentExtent++;
- vars->extentRemaining = vars->currentExtent->length;
- vars->extentPosition = vars->position;
- if (!vars->extentRemaining)
- {
- err = kIOReturnOverrun;
- break;
- }
- }
-
- uint64_t length;
- uint64_t lastReadLength = vars->lastRead;
- uint64_t offset = (vars->position
- - vars->extentPosition + vars->currentExtent->start);
- if (vars->extentRemaining <= vars->bufferSize)
- length = vars->extentRemaining;
- else
- length = vars->bufferSize;
- if ((length + vars->position) > vars->readEnd)
- length = vars->readEnd - vars->position;
-
- vars->lastRead = length;
- if (length)
- {
-//if (length != vars->bufferSize) HIBLOG("short read of %qx ends@ %qx\n", length, offset + length);
- err = IOHibernatePollerIO(vars, kIOPolledRead, vars->bufferHalf, offset, length);
- if (kIOReturnSuccess != err)
- break;
- vars->io = true;
- }
-
- vars->bufferHalf = vars->bufferHalf ? 0 : vars->bufferSize;
- vars->bufferOffset = 0;
-
-#if CRYPTO
- if (cryptvars)
- {
- uint8_t thisVector[AES_BLOCK_SIZE];
- AbsoluteTime startTime, endTime;
-
- // save initial vector for following decrypts
- bcopy(&cryptvars->aes_iv[0], &thisVector[0], AES_BLOCK_SIZE);
- bcopy(vars->buffer + vars->bufferHalf + lastReadLength - AES_BLOCK_SIZE,
- &cryptvars->aes_iv[0], AES_BLOCK_SIZE);
-
- // decrypt the buffer
- clock_get_uptime(&startTime);
-
- aes_decrypt_cbc(vars->buffer + vars->bufferHalf,
- &thisVector[0],
- lastReadLength / AES_BLOCK_SIZE,
- vars->buffer + vars->bufferHalf,
- &cryptvars->ctx.decrypt);
-
- clock_get_uptime(&endTime);
- ADD_ABSOLUTETIME(&vars->cryptTime, &endTime);
- SUB_ABSOLUTETIME(&vars->cryptTime, &startTime);
- vars->cryptBytes += lastReadLength;
- }
-#endif /* CRYPTO */
- }
- }
- while (size);
-
- return (err);
-}
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#if HIBERNATION
-IOReturn
-IOHibernateOpenForDebugData( )
-{
- dev_t image_dev;
- OSData *extentsData = NULL;
- OSObject *obj;
- OSString *str;
- IOByteCount blockSize = 0;
- IOByteCount size;
- IOService * part = 0;
- OSData * data = NULL;
-
- IOPolledFileExtent * fileExtents;
- IOReturn err = kIOReturnSuccess;
- IORegistryEntry * regEntry;
- OSArray * pollers = NULL;
-
- _OpenFileContext ctx;
-
- if (gDebugImageFileRef != NULL)
- return kIOReturnError;
-
- if ((obj = IOService::getPMRootDomain()->copyProperty(kIOHibernateFileKey)))
- {
- if ((str = OSDynamicCast(OSString, obj)))
- strlcpy(gIOHibernateFilename, str->getCStringNoCopy(),
- sizeof(gIOHibernateFilename));
- obj->release();
- }
-
- if (!gIOHibernateFilename[0]) {
- HIBLOG("Failed to get hibernate image filename\n");
- return (kIOReturnUnsupported);
- }
-
- extentsData = OSData::withCapacity(32);
- ctx.extents = extentsData;
- ctx.size = 0;
-
- bzero(gIOHibernateCurrentHeader, sizeof(IOHibernateImageHeader));
- gIOHibernateCurrentHeader->debugFlags = gIOHibernateDebugFlags;
- gIOHibernateCurrentHeader->signature = kIOHibernateHeaderInvalidSignature;
-
- gDebugImageFileRef = kern_open_file_for_direct_io(gIOHibernateFilename,
- false,
- &file_extent_callback, &ctx,
- 0, 0,
- (caddr_t)gIOHibernateCurrentHeader,
- sizeof(IOHibernateImageHeader),
- NULL, &image_dev, NULL, NULL, NULL);
-
- if (gDebugImageFileRef == NULL)
- {
- HIBLOG("Failed to open the file \n");
- err = kIOReturnError;
- goto exit;
- }
- fileExtents = (IOPolledFileExtent *)extentsData->getBytesNoCopy();
- size = extentsData->getLength();
-
- part = IOCopyMediaForDev(image_dev);
- if (!part)
- {
- HIBLOG("Failed to get the media device\n");
- err = kIOReturnNotFound;
- goto exit;
- }
-
-
- pollers = OSArray::withCapacity(4);
- if (!pollers)
- {
- err = kIOReturnNoMemory;
- goto exit;
- }
-
- err = GetImageBlockSize(part, pollers, &blockSize);
- if (err != kIOReturnSuccess)
- {
- HIBLOG("Failed to get block size\n");
- goto exit;
- }
- if (blockSize < sizeof(IOHibernateImageHeader))
- {
- HIBLOG("block size %llu is less than the size of the header\n", blockSize);
- err = kIOReturnError;
- goto exit;
- }
-
- WriteExtentsToFile(gDebugImageFileRef, kIOHibernateHeaderOpenSignature,
- blockSize, fileExtents, size);
-
- char str2[24 + sizeof(uuid_string_t) + 2];
-
- if (!gIOCreateEFIDevicePathSymbol)
- gIOCreateEFIDevicePathSymbol = OSSymbol::withCString("CreateEFIDevicePath");
-
- snprintf(str2, sizeof(str2), "%qx", fileExtents[0].start);
-
- err = IOService::getPlatform()->callPlatformFunction(
- gIOCreateEFIDevicePathSymbol, false,
- (void *) part, (void *) str2,
- (void *) (uintptr_t) true, (void *) &data);
-
- if (!gIOOptionsEntry)
- {
- regEntry = IORegistryEntry::fromPath("/options", gIODTPlane);
- gIOOptionsEntry = OSDynamicCast(IODTNVRAM, regEntry);
- if (regEntry && !gIOOptionsEntry)
- regEntry->release();
- }
- if (gIOOptionsEntry)
- {
- const OSSymbol * sym;
-
- sym = OSSymbol::withCStringNoCopy(kIOHibernateBootImageKey);
- if (sym)
- {
- gIOOptionsEntry->setProperty(sym, data);
- sym->release();
- }
- }
-
-
-exit:
-
- if ( (err != kIOReturnSuccess) && gDebugImageFileRef) {
- kern_close_file_for_direct_io(gDebugImageFileRef, 0, 0, 0, 0, 0);
- gDebugImageFileRef = NULL;
- }
- if (extentsData) extentsData->release();
- if (part) part->release();
- if (pollers) pollers->release();
- if (data) data->release();
-
- return err;
-}
-#endif
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-IOReturn
-IOHibernateSystemSleep(void)
-{
- IOReturn err;
- OSData * data;
- OSObject * obj;
- OSString * str;
- OSNumber * num;
- bool dsSSD, vmflush;
- IOHibernateVars * vars;
-
- gIOHibernateState = kIOHibernateStateInactive;
-
- if (!gIOChosenEntry)
- gIOChosenEntry = IORegistryEntry::fromPath("/chosen", gIODTPlane);
-
- gIOHibernateDebugFlags = 0;
- if (kIOLogHibernate & gIOKitDebug)
- gIOHibernateDebugFlags |= kIOHibernateDebugRestoreLogs;
-
- if (IOService::getPMRootDomain()->getHibernateSettings(
- &gIOHibernateMode, &gIOHibernateFreeRatio, &gIOHibernateFreeTime))
- {
- if (kIOHibernateModeSleep & gIOHibernateMode)
- // default to discard clean for safe sleep
- gIOHibernateMode ^= (kIOHibernateModeDiscardCleanInactive
- | kIOHibernateModeDiscardCleanActive);
- }
-
- if ((obj = IOService::getPMRootDomain()->copyProperty(kIOHibernateFileKey)))
- {
- if ((str = OSDynamicCast(OSString, obj)))
- strlcpy(gIOHibernateFilename, str->getCStringNoCopy(),
- sizeof(gIOHibernateFilename));
- obj->release();
- }
-
- if (!gIOHibernateMode || !gIOHibernateFilename[0])
- return (kIOReturnUnsupported);
-
- HIBLOG("hibernate image path: %s\n", gIOHibernateFilename);
-
- vars = IONew(IOHibernateVars, 1);
- if (!vars) return (kIOReturnNoMemory);
- bzero(vars, sizeof(*vars));
-
- IOLockLock(gFSLock);
- if (kFSIdle != gFSState)
- {
- HIBLOG("hibernate file busy\n");
- IOLockUnlock(gFSLock);
- IODelete(vars, IOHibernateVars, 1);
- return (kIOReturnBusy);
- }
- gFSState = kFSOpening;
- IOLockUnlock(gFSLock);
-
- do
- {
- vars->srcBuffer = IOBufferMemoryDescriptor::withOptions(kIODirectionOutIn,
- 2 * page_size + WKdm_SCRATCH_BUF_SIZE, page_size);
- vars->ioBuffer = IOBufferMemoryDescriptor::withOptions(kIODirectionOutIn,
- 2 * kDefaultIOSize, page_size);
-
- vars->handoffBuffer = IOBufferMemoryDescriptor::withOptions(kIODirectionOutIn,
- ptoa_64(gIOHibernateHandoffPageCount), page_size);
-
- if (!vars->srcBuffer || !vars->ioBuffer || !vars->handoffBuffer)
- {
- err = kIOReturnNoMemory;
- break;
- }
-
- if ((obj = IOService::getPMRootDomain()->copyProperty(kIOHibernateFileMinSizeKey)))
- {
- if ((num = OSDynamicCast(OSNumber, obj))) vars->fileMinSize = num->unsigned64BitValue();
- obj->release();
- }
- if ((obj = IOService::getPMRootDomain()->copyProperty(kIOHibernateFileMaxSizeKey)))
- {
- if ((num = OSDynamicCast(OSNumber, obj))) vars->fileMaxSize = num->unsigned64BitValue();
- obj->release();
- }
-
- boolean_t encryptedswap = true;
- uint32_t pageCount;
- AbsoluteTime startTime, endTime;
- uint64_t nsec;
-
- bzero(gIOHibernateCurrentHeader, sizeof(IOHibernateImageHeader));
- gIOHibernateCurrentHeader->debugFlags = gIOHibernateDebugFlags;
- gIOHibernateCurrentHeader->signature = kIOHibernateHeaderInvalidSignature;
-
- vmflush = (kOSBooleanTrue == IOService::getPMRootDomain()->getProperty(kIOPMDeepSleepEnabledKey));
- uint64_t setFileSize = 0;
- err = hibernate_alloc_page_lists(&vars->page_list,
- &vars->page_list_wired,
- &vars->page_list_pal);
- if (KERN_SUCCESS != err)
- break;
-
- if (vars->fileMinSize || (kIOHibernateModeFileResize & gIOHibernateMode))
- {
- hibernate_page_list_setall(vars->page_list,
- vars->page_list_wired,
- vars->page_list_pal,
- true /* preflight */,
- vmflush /* discard */,
- &pageCount);
- PE_Video consoleInfo;
- bzero(&consoleInfo, sizeof(consoleInfo));
- IOService::getPlatform()->getConsoleInfo(&consoleInfo);
-
- // estimate: 6% increase in pages compressed
- // screen preview 2 images compressed 0%
- setFileSize = ((ptoa_64((106 * pageCount) / 100) * gIOHibernateCompression) >> 8)
- + vars->page_list->list_size
- + (consoleInfo.v_width * consoleInfo.v_height * 8);
- enum { setFileRound = 1024*1024ULL };
- setFileSize = ((setFileSize + setFileRound) & ~(setFileRound - 1));
-
- HIBLOG("hibernate_page_list_setall preflight pageCount %d est comp %qd setfile %qd min %qd\n",
- pageCount, (100ULL * gIOHibernateCompression) >> 8,
- setFileSize, vars->fileMinSize);
-
- if (!(kIOHibernateModeFileResize & gIOHibernateMode)
- && (setFileSize < vars->fileMinSize))
- {
- setFileSize = vars->fileMinSize;
- }
- }
-
- // open & invalidate the image file
-
- if (gDebugImageFileRef) {
- kern_close_file_for_direct_io(gDebugImageFileRef, 0, 0, 0, 0, 0);
- gDebugImageFileRef = NULL;
- }
-
- err = IOPolledFileOpen(gIOHibernateFilename, setFileSize, vars->ioBuffer,
- &vars->fileVars, &vars->fileExtents, &data,
- &vars->volumeCryptKey[0]);
-
- if (KERN_SUCCESS != err)
- {
- HIBLOG("IOPolledFileOpen(%x)\n", err);
- break;
- }
-
- clock_get_uptime(&startTime);
- err = hibernate_setup(gIOHibernateCurrentHeader,
- gIOHibernateFreeRatio, gIOHibernateFreeTime,
- vmflush,
- vars->page_list, vars->page_list_wired, vars->page_list_pal);
- clock_get_uptime(&endTime);
- SUB_ABSOLUTETIME(&endTime, &startTime);
- absolutetime_to_nanoseconds(endTime, &nsec);
- HIBLOG("hibernate_setup(%d) took %qd ms\n", err, nsec / 1000000ULL);
-
- dsSSD = ((0 != (kIOHibernateOptionSSD & vars->fileVars->flags))
- && (kOSBooleanTrue == IOService::getPMRootDomain()->getProperty(kIOPMDeepSleepEnabledKey)));
- if (dsSSD)
- {
- gIOHibernateCurrentHeader->options |=
- kIOHibernateOptionSSD
- | kIOHibernateOptionColor;
-
-#if defined(__i386__) || defined(__x86_64__)
- if (!uuid_is_null(vars->volumeCryptKey) &&
- (kOSBooleanTrue != IOService::getPMRootDomain()->getProperty(kIOPMDestroyFVKeyOnStandbyKey)))
- {
- uintptr_t smcVars[2];
- smcVars[0] = sizeof(vars->volumeCryptKey);
- smcVars[1] = (uintptr_t)(void *) &gIOHibernateVars.volumeCryptKey[0];
-
- IOService::getPMRootDomain()->setProperty(kIOHibernateSMCVariablesKey, smcVars, sizeof(smcVars));
- bzero(smcVars, sizeof(smcVars));
- }
-#endif
- }
- else
- {
- gIOHibernateCurrentHeader->options |= kIOHibernateOptionProgress;
- }
-
-
- if (KERN_SUCCESS != err)
- break;
-
- if (encryptedswap || !uuid_is_null(vars->volumeCryptKey))
- gIOHibernateMode ^= kIOHibernateModeEncrypt;