1*0f4c859eSApple OSS Distributions /* 2*0f4c859eSApple OSS Distributions * Copyright (c) 2004 Apple Computer, Inc. All rights reserved. 3*0f4c859eSApple OSS Distributions * 4*0f4c859eSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*0f4c859eSApple OSS Distributions * 6*0f4c859eSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*0f4c859eSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*0f4c859eSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*0f4c859eSApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*0f4c859eSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*0f4c859eSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*0f4c859eSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*0f4c859eSApple OSS Distributions * terms of an Apple operating system software license agreement. 14*0f4c859eSApple OSS Distributions * 15*0f4c859eSApple OSS Distributions * Please obtain a copy of the License at 16*0f4c859eSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*0f4c859eSApple OSS Distributions * 18*0f4c859eSApple OSS Distributions * The Original Code and all software distributed under the License are 19*0f4c859eSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*0f4c859eSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*0f4c859eSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*0f4c859eSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*0f4c859eSApple OSS Distributions * Please see the License for the specific language governing rights and 24*0f4c859eSApple OSS Distributions * limitations under the License. 25*0f4c859eSApple OSS Distributions * 26*0f4c859eSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*0f4c859eSApple OSS Distributions */ 28*0f4c859eSApple OSS Distributions 29*0f4c859eSApple OSS Distributions #ifndef _IOPOLLEDINTERFACE_H_ 30*0f4c859eSApple OSS Distributions #define _IOPOLLEDINTERFACE_H_ 31*0f4c859eSApple OSS Distributions 32*0f4c859eSApple OSS Distributions enum{ 33*0f4c859eSApple OSS Distributions kIOPolledPreflightState = 1, 34*0f4c859eSApple OSS Distributions kIOPolledBeforeSleepState = 2, 35*0f4c859eSApple OSS Distributions kIOPolledAfterSleepState = 3, 36*0f4c859eSApple OSS Distributions kIOPolledPostflightState = 4, 37*0f4c859eSApple OSS Distributions 38*0f4c859eSApple OSS Distributions kIOPolledPreflightCoreDumpState = 5, 39*0f4c859eSApple OSS Distributions kIOPolledPostflightCoreDumpState = 6, 40*0f4c859eSApple OSS Distributions 41*0f4c859eSApple OSS Distributions kIOPolledBeforeSleepStateAborted = 7, 42*0f4c859eSApple OSS Distributions }; 43*0f4c859eSApple OSS Distributions 44*0f4c859eSApple OSS Distributions #if defined(__cplusplus) 45*0f4c859eSApple OSS Distributions 46*0f4c859eSApple OSS Distributions #include <libkern/c++/OSObject.h> 47*0f4c859eSApple OSS Distributions #include <libkern/c++/OSPtr.h> 48*0f4c859eSApple OSS Distributions #include <IOKit/IOMemoryDescriptor.h> 49*0f4c859eSApple OSS Distributions 50*0f4c859eSApple OSS Distributions #define kIOPolledInterfaceSupportKey "IOPolledInterface" 51*0f4c859eSApple OSS Distributions #define kIOPolledInterfaceActiveKey "IOPolledInterfaceActive" 52*0f4c859eSApple OSS Distributions #define kIOPolledInterfaceStackKey "IOPolledInterfaceStack" 53*0f4c859eSApple OSS Distributions 54*0f4c859eSApple OSS Distributions enum{ 55*0f4c859eSApple OSS Distributions kIOPolledWrite = 1, 56*0f4c859eSApple OSS Distributions kIOPolledRead = 2, 57*0f4c859eSApple OSS Distributions kIOPolledFlush = 3 58*0f4c859eSApple OSS Distributions }; 59*0f4c859eSApple OSS Distributions 60*0f4c859eSApple OSS Distributions typedef void (*IOPolledCompletionAction)( void * target, 61*0f4c859eSApple OSS Distributions void * parameter, 62*0f4c859eSApple OSS Distributions IOReturn status, 63*0f4c859eSApple OSS Distributions uint64_t actualByteCount); 64*0f4c859eSApple OSS Distributions struct IOPolledCompletion { 65*0f4c859eSApple OSS Distributions void * target; 66*0f4c859eSApple OSS Distributions IOPolledCompletionAction action; 67*0f4c859eSApple OSS Distributions void * parameter; 68*0f4c859eSApple OSS Distributions }; 69*0f4c859eSApple OSS Distributions 70*0f4c859eSApple OSS Distributions class IOPolledInterface : public OSObject 71*0f4c859eSApple OSS Distributions { 72*0f4c859eSApple OSS Distributions OSDeclareAbstractStructors(IOPolledInterface); 73*0f4c859eSApple OSS Distributions 74*0f4c859eSApple OSS Distributions protected: 75*0f4c859eSApple OSS Distributions struct ExpansionData { }; 76*0f4c859eSApple OSS Distributions ExpansionData * reserved; 77*0f4c859eSApple OSS Distributions 78*0f4c859eSApple OSS Distributions public: 79*0f4c859eSApple OSS Distributions virtual IOReturn probe(IOService * target) = 0; 80*0f4c859eSApple OSS Distributions 81*0f4c859eSApple OSS Distributions virtual IOReturn open( IOOptionBits state, IOMemoryDescriptor * buffer) = 0; 82*0f4c859eSApple OSS Distributions virtual IOReturn close(IOOptionBits state) = 0; 83*0f4c859eSApple OSS Distributions 84*0f4c859eSApple OSS Distributions virtual IOReturn startIO(uint32_t operation, 85*0f4c859eSApple OSS Distributions uint32_t bufferOffset, 86*0f4c859eSApple OSS Distributions uint64_t deviceOffset, 87*0f4c859eSApple OSS Distributions uint64_t length, 88*0f4c859eSApple OSS Distributions IOPolledCompletion completion) = 0; 89*0f4c859eSApple OSS Distributions 90*0f4c859eSApple OSS Distributions virtual IOReturn checkForWork(void) = 0; 91*0f4c859eSApple OSS Distributions 92*0f4c859eSApple OSS Distributions virtual IOReturn setEncryptionKey(const uint8_t * key, size_t keySize); 93*0f4c859eSApple OSS Distributions 94*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUsedX86(IOPolledInterface, 0); 95*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 1); 96*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 2); 97*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 3); 98*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 4); 99*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 5); 100*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 6); 101*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 7); 102*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 8); 103*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 9); 104*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 10); 105*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 11); 106*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 12); 107*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 13); 108*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 14); 109*0f4c859eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOPolledInterface, 15); 110*0f4c859eSApple OSS Distributions }; 111*0f4c859eSApple OSS Distributions 112*0f4c859eSApple OSS Distributions #endif /* defined(__cplusplus) */ 113*0f4c859eSApple OSS Distributions 114*0f4c859eSApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 115*0f4c859eSApple OSS Distributions 116*0f4c859eSApple OSS Distributions #include <libkern/crypto/aes.h> 117*0f4c859eSApple OSS Distributions #include <IOKit/IOTypes.h> 118*0f4c859eSApple OSS Distributions #include <IOKit/IOHibernatePrivate.h> 119*0f4c859eSApple OSS Distributions 120*0f4c859eSApple OSS Distributions // kern_open_file_for_direct_io() flags 121*0f4c859eSApple OSS Distributions enum{ 122*0f4c859eSApple OSS Distributions kIOPolledFileCreate = 0x00000001, 123*0f4c859eSApple OSS Distributions kIOPolledFileHibernate = 0x00000002, 124*0f4c859eSApple OSS Distributions }; 125*0f4c859eSApple OSS Distributions 126*0f4c859eSApple OSS Distributions // kern_open_file_for_direct_io() oflags 127*0f4c859eSApple OSS Distributions enum{ 128*0f4c859eSApple OSS Distributions kIOPolledFileSSD = 0x00000001 129*0f4c859eSApple OSS Distributions }; 130*0f4c859eSApple OSS Distributions 131*0f4c859eSApple OSS Distributions #if !defined(__cplusplus) 132*0f4c859eSApple OSS Distributions typedef struct IORegistryEntry IORegistryEntry; 133*0f4c859eSApple OSS Distributions typedef struct OSData OSData; 134*0f4c859eSApple OSS Distributions typedef struct OSArray OSArray; 135*0f4c859eSApple OSS Distributions typedef struct IOMemoryDescriptor IOMemoryDescriptor; 136*0f4c859eSApple OSS Distributions typedef struct IOPolledFilePollers IOPolledFilePollers; 137*0f4c859eSApple OSS Distributions #else 138*0f4c859eSApple OSS Distributions class IOPolledFilePollers; 139*0f4c859eSApple OSS Distributions #endif 140*0f4c859eSApple OSS Distributions 141*0f4c859eSApple OSS Distributions struct IOPolledFileIOVars { 142*0f4c859eSApple OSS Distributions IOPolledFilePollers * pollers; 143*0f4c859eSApple OSS Distributions struct kern_direct_file_io_ref_t * fileRef; 144*0f4c859eSApple OSS Distributions OSData * fileExtents; 145*0f4c859eSApple OSS Distributions uint64_t block0; 146*0f4c859eSApple OSS Distributions uint32_t blockSize; 147*0f4c859eSApple OSS Distributions uint64_t maxiobytes; 148*0f4c859eSApple OSS Distributions uint32_t bufferLimit; 149*0f4c859eSApple OSS Distributions uint8_t * buffer; 150*0f4c859eSApple OSS Distributions uint32_t bufferSize; 151*0f4c859eSApple OSS Distributions uint32_t bufferOffset; 152*0f4c859eSApple OSS Distributions uint32_t bufferHalf; 153*0f4c859eSApple OSS Distributions uint64_t extentRemaining; 154*0f4c859eSApple OSS Distributions uint32_t lastRead; 155*0f4c859eSApple OSS Distributions uint64_t readEnd; 156*0f4c859eSApple OSS Distributions uint32_t flags; 157*0f4c859eSApple OSS Distributions uint64_t fileSize; 158*0f4c859eSApple OSS Distributions uint64_t position; 159*0f4c859eSApple OSS Distributions uint64_t extentPosition; 160*0f4c859eSApple OSS Distributions uint64_t encryptStart; 161*0f4c859eSApple OSS Distributions uint64_t encryptEnd; 162*0f4c859eSApple OSS Distributions uint64_t cryptBytes; 163*0f4c859eSApple OSS Distributions AbsoluteTime cryptTime; 164*0f4c859eSApple OSS Distributions IOPolledFileExtent * extentMap; 165*0f4c859eSApple OSS Distributions IOPolledFileExtent * currentExtent; 166*0f4c859eSApple OSS Distributions bool allocated; 167*0f4c859eSApple OSS Distributions }; 168*0f4c859eSApple OSS Distributions 169*0f4c859eSApple OSS Distributions typedef struct IOPolledFileIOVars IOPolledFileIOVars; 170*0f4c859eSApple OSS Distributions 171*0f4c859eSApple OSS Distributions struct IOPolledFileCryptVars { 172*0f4c859eSApple OSS Distributions uint8_t aes_iv[AES_BLOCK_SIZE]; 173*0f4c859eSApple OSS Distributions aes_ctx ctx; 174*0f4c859eSApple OSS Distributions }; 175*0f4c859eSApple OSS Distributions typedef struct IOPolledFileCryptVars IOPolledFileCryptVars; 176*0f4c859eSApple OSS Distributions 177*0f4c859eSApple OSS Distributions #if defined(__cplusplus) 178*0f4c859eSApple OSS Distributions 179*0f4c859eSApple OSS Distributions IOReturn IOPolledFileOpen(const char * filename, 180*0f4c859eSApple OSS Distributions uint32_t flags, 181*0f4c859eSApple OSS Distributions uint64_t setFileSize, uint64_t fsFreeSize, 182*0f4c859eSApple OSS Distributions void * write_file_addr, size_t write_file_len, 183*0f4c859eSApple OSS Distributions IOPolledFileIOVars ** fileVars, 184*0f4c859eSApple OSS Distributions LIBKERN_RETURNS_RETAINED OSData ** imagePath, 185*0f4c859eSApple OSS Distributions uint8_t * volumeCryptKey, size_t * keySize); 186*0f4c859eSApple OSS Distributions 187*0f4c859eSApple OSS Distributions IOReturn IOPolledFileOpen(const char * filename, 188*0f4c859eSApple OSS Distributions uint32_t flags, 189*0f4c859eSApple OSS Distributions uint64_t setFileSize, uint64_t fsFreeSize, 190*0f4c859eSApple OSS Distributions void * write_file_addr, size_t write_file_len, 191*0f4c859eSApple OSS Distributions IOPolledFileIOVars ** fileVars, 192*0f4c859eSApple OSS Distributions OSSharedPtr<OSData>& imagePath, 193*0f4c859eSApple OSS Distributions uint8_t * volumeCryptKey, size_t * keySize); 194*0f4c859eSApple OSS Distributions 195*0f4c859eSApple OSS Distributions IOReturn IOPolledFileClose(IOPolledFileIOVars ** pVars, 196*0f4c859eSApple OSS Distributions off_t write_offset, void * addr, size_t write_length, 197*0f4c859eSApple OSS Distributions off_t discard_offset, off_t discard_end, bool unlink); 198*0f4c859eSApple OSS Distributions 199*0f4c859eSApple OSS Distributions IOReturn IOPolledFilePollersSetup(IOPolledFileIOVars * vars, uint32_t openState); 200*0f4c859eSApple OSS Distributions 201*0f4c859eSApple OSS Distributions LIBKERN_RETURNS_NOT_RETAINED IOMemoryDescriptor * IOPolledFileGetIOBuffer(IOPolledFileIOVars * vars); 202*0f4c859eSApple OSS Distributions 203*0f4c859eSApple OSS Distributions #endif /* defined(__cplusplus) */ 204*0f4c859eSApple OSS Distributions 205*0f4c859eSApple OSS Distributions #if defined(__cplusplus) 206*0f4c859eSApple OSS Distributions #define __C "C" 207*0f4c859eSApple OSS Distributions #else 208*0f4c859eSApple OSS Distributions #define __C 209*0f4c859eSApple OSS Distributions #endif 210*0f4c859eSApple OSS Distributions 211*0f4c859eSApple OSS Distributions extern __C IOReturn IOPolledFileSeek(IOPolledFileIOVars * vars, uint64_t position); 212*0f4c859eSApple OSS Distributions 213*0f4c859eSApple OSS Distributions extern __C IOReturn IOPolledFileWrite(IOPolledFileIOVars * vars, 214*0f4c859eSApple OSS Distributions const uint8_t * bytes, IOByteCount size, 215*0f4c859eSApple OSS Distributions IOPolledFileCryptVars * cryptvars); 216*0f4c859eSApple OSS Distributions extern __C IOReturn IOPolledFileRead(IOPolledFileIOVars * vars, 217*0f4c859eSApple OSS Distributions uint8_t * bytes, IOByteCount size, 218*0f4c859eSApple OSS Distributions IOPolledFileCryptVars * cryptvars); 219*0f4c859eSApple OSS Distributions 220*0f4c859eSApple OSS Distributions extern __C IOReturn IOPolledFileFlush(IOPolledFileIOVars * vars); 221*0f4c859eSApple OSS Distributions 222*0f4c859eSApple OSS Distributions extern __C IOReturn IOPolledFilePollersOpen(IOPolledFileIOVars * vars, uint32_t state, bool abortable); 223*0f4c859eSApple OSS Distributions 224*0f4c859eSApple OSS Distributions extern __C IOReturn IOPolledFilePollersClose(IOPolledFileIOVars * vars, uint32_t state); 225*0f4c859eSApple OSS Distributions 226*0f4c859eSApple OSS Distributions extern __C IOReturn IOPolledFilePollersSetEncryptionKey(IOPolledFileIOVars * vars, 227*0f4c859eSApple OSS Distributions const uint8_t * key, size_t keySize); 228*0f4c859eSApple OSS Distributions 229*0f4c859eSApple OSS Distributions extern __C IOPolledFileIOVars * gCoreFileVars; 230*0f4c859eSApple OSS Distributions 231*0f4c859eSApple OSS Distributions #ifdef _SYS_CONF_H_ 232*0f4c859eSApple OSS Distributions 233*0f4c859eSApple OSS Distributions __BEGIN_DECLS 234*0f4c859eSApple OSS Distributions 235*0f4c859eSApple OSS Distributions typedef void (*kern_get_file_extents_callback_t)(void * ref, uint64_t start, uint64_t size); 236*0f4c859eSApple OSS Distributions 237*0f4c859eSApple OSS Distributions struct kern_direct_file_io_ref_t * 238*0f4c859eSApple OSS Distributions kern_open_file_for_direct_io(const char * name, 239*0f4c859eSApple OSS Distributions uint32_t flags, 240*0f4c859eSApple OSS Distributions kern_get_file_extents_callback_t callback, 241*0f4c859eSApple OSS Distributions void * callback_ref, 242*0f4c859eSApple OSS Distributions off_t set_file_size, 243*0f4c859eSApple OSS Distributions off_t fs_free_size, 244*0f4c859eSApple OSS Distributions off_t write_file_offset, 245*0f4c859eSApple OSS Distributions void * write_file_addr, 246*0f4c859eSApple OSS Distributions size_t write_file_len, 247*0f4c859eSApple OSS Distributions dev_t * partition_device_result, 248*0f4c859eSApple OSS Distributions dev_t * image_device_result, 249*0f4c859eSApple OSS Distributions uint64_t * partitionbase_result, 250*0f4c859eSApple OSS Distributions uint64_t * maxiocount_result, 251*0f4c859eSApple OSS Distributions uint32_t * oflags); 252*0f4c859eSApple OSS Distributions void 253*0f4c859eSApple OSS Distributions kern_close_file_for_direct_io(struct kern_direct_file_io_ref_t * ref, 254*0f4c859eSApple OSS Distributions off_t write_offset, void * addr, size_t write_length, 255*0f4c859eSApple OSS Distributions off_t discard_offset, off_t discard_end, bool unlink); 256*0f4c859eSApple OSS Distributions int 257*0f4c859eSApple OSS Distributions kern_write_file(struct kern_direct_file_io_ref_t * ref, off_t offset, void * addr, size_t len, int ioflag); 258*0f4c859eSApple OSS Distributions int 259*0f4c859eSApple OSS Distributions kern_read_file(struct kern_direct_file_io_ref_t * ref, off_t offset, void * addr, size_t len, int ioflag); 260*0f4c859eSApple OSS Distributions 261*0f4c859eSApple OSS Distributions struct mount * 262*0f4c859eSApple OSS Distributions kern_file_mount(struct kern_direct_file_io_ref_t * ref); 263*0f4c859eSApple OSS Distributions 264*0f4c859eSApple OSS Distributions enum{ 265*0f4c859eSApple OSS Distributions kIOPolledFileMountChangeMount = 0x00000101, 266*0f4c859eSApple OSS Distributions kIOPolledFileMountChangeUnmount = 0x00000102, 267*0f4c859eSApple OSS Distributions kIOPolledFileMountChangeWillResize = 0x00000201, 268*0f4c859eSApple OSS Distributions kIOPolledFileMountChangeDidResize = 0x00000202, 269*0f4c859eSApple OSS Distributions }; 270*0f4c859eSApple OSS Distributions extern void IOPolledFileMountChange(struct mount * mp, uint32_t op); 271*0f4c859eSApple OSS Distributions 272*0f4c859eSApple OSS Distributions __END_DECLS 273*0f4c859eSApple OSS Distributions 274*0f4c859eSApple OSS Distributions #endif /* _SYS_CONF_H_ */ 275*0f4c859eSApple OSS Distributions 276*0f4c859eSApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */ 277*0f4c859eSApple OSS Distributions 278*0f4c859eSApple OSS Distributions #endif /* _IOPOLLEDINTERFACE_H_ */ 279