1*0f4c859eSApple OSS Distributions /* 2*0f4c859eSApple OSS Distributions * Copyright (c) 1998-2000 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 30*0f4c859eSApple OSS Distributions #ifndef _IOKIT_KERNELINTERNAL_H 31*0f4c859eSApple OSS Distributions #define _IOKIT_KERNELINTERNAL_H 32*0f4c859eSApple OSS Distributions 33*0f4c859eSApple OSS Distributions #include <sys/cdefs.h> 34*0f4c859eSApple OSS Distributions 35*0f4c859eSApple OSS Distributions __BEGIN_DECLS 36*0f4c859eSApple OSS Distributions 37*0f4c859eSApple OSS Distributions #include <vm/vm_pageout.h> 38*0f4c859eSApple OSS Distributions #include <mach/memory_object_types.h> 39*0f4c859eSApple OSS Distributions #include <device/device_port.h> 40*0f4c859eSApple OSS Distributions #include <IOKit/IODMACommand.h> 41*0f4c859eSApple OSS Distributions #include <IOKit/IOKitServer.h> 42*0f4c859eSApple OSS Distributions #include <kern/socd_client.h> 43*0f4c859eSApple OSS Distributions 44*0f4c859eSApple OSS Distributions /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 45*0f4c859eSApple OSS Distributions 46*0f4c859eSApple OSS Distributions typedef kern_return_t (*IOIteratePageableMapsCallback)(vm_map_t map, void * ref); 47*0f4c859eSApple OSS Distributions 48*0f4c859eSApple OSS Distributions void IOLibInit(void); 49*0f4c859eSApple OSS Distributions kern_return_t IOIteratePageableMaps(vm_size_t size, 50*0f4c859eSApple OSS Distributions IOIteratePageableMapsCallback callback, void * ref); 51*0f4c859eSApple OSS Distributions vm_map_t IOPageableMapForAddress(uintptr_t address); 52*0f4c859eSApple OSS Distributions 53*0f4c859eSApple OSS Distributions struct IOMemoryDescriptorMapAllocRef { 54*0f4c859eSApple OSS Distributions vm_map_t map; 55*0f4c859eSApple OSS Distributions mach_vm_address_t mapped; 56*0f4c859eSApple OSS Distributions mach_vm_size_t size; 57*0f4c859eSApple OSS Distributions vm_prot_t prot; 58*0f4c859eSApple OSS Distributions vm_tag_t tag; 59*0f4c859eSApple OSS Distributions IOOptionBits options; 60*0f4c859eSApple OSS Distributions }; 61*0f4c859eSApple OSS Distributions 62*0f4c859eSApple OSS Distributions kern_return_t 63*0f4c859eSApple OSS Distributions IOMemoryDescriptorMapAlloc(vm_map_t map, void * ref); 64*0f4c859eSApple OSS Distributions 65*0f4c859eSApple OSS Distributions 66*0f4c859eSApple OSS Distributions mach_vm_address_t 67*0f4c859eSApple OSS Distributions IOKernelAllocateWithPhysicalRestrict( 68*0f4c859eSApple OSS Distributions kalloc_heap_t kheap, 69*0f4c859eSApple OSS Distributions mach_vm_size_t size, 70*0f4c859eSApple OSS Distributions mach_vm_address_t maxPhys, 71*0f4c859eSApple OSS Distributions mach_vm_size_t alignment, 72*0f4c859eSApple OSS Distributions bool contiguous); 73*0f4c859eSApple OSS Distributions void 74*0f4c859eSApple OSS Distributions IOKernelFreePhysical( 75*0f4c859eSApple OSS Distributions kalloc_heap_t kheap, 76*0f4c859eSApple OSS Distributions mach_vm_address_t address, 77*0f4c859eSApple OSS Distributions mach_vm_size_t size); 78*0f4c859eSApple OSS Distributions 79*0f4c859eSApple OSS Distributions #if IOTRACKING 80*0f4c859eSApple OSS Distributions IOReturn 81*0f4c859eSApple OSS Distributions IOMemoryMapTracking(IOTrackingUser * tracking, task_t * task, 82*0f4c859eSApple OSS Distributions mach_vm_address_t * address, mach_vm_size_t * size); 83*0f4c859eSApple OSS Distributions #endif /* IOTRACKING */ 84*0f4c859eSApple OSS Distributions 85*0f4c859eSApple OSS Distributions extern vm_size_t debug_iomallocpageable_size; 86*0f4c859eSApple OSS Distributions 87*0f4c859eSApple OSS Distributions extern ppnum_t gIOLastPage; 88*0f4c859eSApple OSS Distributions 89*0f4c859eSApple OSS Distributions extern IOSimpleLock * gIOPageAllocLock; 90*0f4c859eSApple OSS Distributions extern queue_head_t gIOPageAllocList; 91*0f4c859eSApple OSS Distributions 92*0f4c859eSApple OSS Distributions /* Physical to physical copy (ints must be disabled) */ 93*0f4c859eSApple OSS Distributions extern void bcopy_phys(addr64_t from, addr64_t to, vm_size_t size); 94*0f4c859eSApple OSS Distributions 95*0f4c859eSApple OSS Distributions __END_DECLS 96*0f4c859eSApple OSS Distributions 97*0f4c859eSApple OSS Distributions #define __IODEQUALIFY(type, expr) \ 98*0f4c859eSApple OSS Distributions ({ typeof(expr) expr_ = (type)(uintptr_t)(expr); \ 99*0f4c859eSApple OSS Distributions (type)(uintptr_t)(expr_); }) 100*0f4c859eSApple OSS Distributions 101*0f4c859eSApple OSS Distributions struct IODMACommandMapSegment { 102*0f4c859eSApple OSS Distributions uint64_t fDMAOffset; // The offset of this segment in DMA 103*0f4c859eSApple OSS Distributions uint64_t fMapOffset; // Offset of segment in mapping 104*0f4c859eSApple OSS Distributions uint64_t fPageOffset; // Offset within first page of segment 105*0f4c859eSApple OSS Distributions }; 106*0f4c859eSApple OSS Distributions 107*0f4c859eSApple OSS Distributions struct IODMACommandInternal { 108*0f4c859eSApple OSS Distributions IOMDDMAWalkSegmentState fState; 109*0f4c859eSApple OSS Distributions IOMDDMACharacteristics fMDSummary; 110*0f4c859eSApple OSS Distributions 111*0f4c859eSApple OSS Distributions UInt64 fPreparedOffset; 112*0f4c859eSApple OSS Distributions UInt64 fPreparedLength; 113*0f4c859eSApple OSS Distributions 114*0f4c859eSApple OSS Distributions UInt32 fSourceAlignMask; 115*0f4c859eSApple OSS Distributions 116*0f4c859eSApple OSS Distributions UInt8 fCursor; 117*0f4c859eSApple OSS Distributions UInt8 fCheckAddressing; 118*0f4c859eSApple OSS Distributions UInt8 fIterateOnly; 119*0f4c859eSApple OSS Distributions UInt8 fMisaligned; 120*0f4c859eSApple OSS Distributions UInt8 fPrepared; 121*0f4c859eSApple OSS Distributions UInt8 fDoubleBuffer; 122*0f4c859eSApple OSS Distributions UInt8 fNewMD; 123*0f4c859eSApple OSS Distributions UInt8 fLocalMapperAllocValid; 124*0f4c859eSApple OSS Distributions UInt8 fIOVMAddrValid; 125*0f4c859eSApple OSS Distributions UInt8 fForceDoubleBuffer; 126*0f4c859eSApple OSS Distributions UInt8 fSetActiveNoMapper; 127*0f4c859eSApple OSS Distributions 128*0f4c859eSApple OSS Distributions vm_page_t fCopyPageAlloc; 129*0f4c859eSApple OSS Distributions vm_page_t fCopyNext; 130*0f4c859eSApple OSS Distributions vm_page_t fNextRemapPage; 131*0f4c859eSApple OSS Distributions 132*0f4c859eSApple OSS Distributions ppnum_t fCopyPageCount; 133*0f4c859eSApple OSS Distributions 134*0f4c859eSApple OSS Distributions uint64_t fLocalMapperAlloc; 135*0f4c859eSApple OSS Distributions uint64_t fLocalMapperAllocLength; 136*0f4c859eSApple OSS Distributions 137*0f4c859eSApple OSS Distributions OSPtr<IOBufferMemoryDescriptor> fCopyMD; 138*0f4c859eSApple OSS Distributions 139*0f4c859eSApple OSS Distributions IOService * fDevice; 140*0f4c859eSApple OSS Distributions IOLock * fDextLock; 141*0f4c859eSApple OSS Distributions 142*0f4c859eSApple OSS Distributions // IODMAEventSource use 143*0f4c859eSApple OSS Distributions IOReturn fStatus; 144*0f4c859eSApple OSS Distributions UInt64 fActualByteCount; 145*0f4c859eSApple OSS Distributions AbsoluteTime fTimeStamp; 146*0f4c859eSApple OSS Distributions 147*0f4c859eSApple OSS Distributions // Multisegment vars 148*0f4c859eSApple OSS Distributions IODMACommandMapSegment * fMapSegments; 149*0f4c859eSApple OSS Distributions uint32_t fMapSegmentsCount; 150*0f4c859eSApple OSS Distributions uint64_t fLocalMapperAllocBase; 151*0f4c859eSApple OSS Distributions uint64_t fOffset2Index; 152*0f4c859eSApple OSS Distributions uint64_t fNextOffset; 153*0f4c859eSApple OSS Distributions uint64_t fIndex; 154*0f4c859eSApple OSS Distributions }; 155*0f4c859eSApple OSS Distributions 156*0f4c859eSApple OSS Distributions struct IOMemoryDescriptorDevicePager { 157*0f4c859eSApple OSS Distributions void * devicePager; 158*0f4c859eSApple OSS Distributions unsigned int pagerContig:1; 159*0f4c859eSApple OSS Distributions unsigned int unused:31; 160*0f4c859eSApple OSS Distributions IOMemoryDescriptor * memory; 161*0f4c859eSApple OSS Distributions }; 162*0f4c859eSApple OSS Distributions 163*0f4c859eSApple OSS Distributions struct IOMemoryDescriptorReserved { 164*0f4c859eSApple OSS Distributions IOMemoryDescriptorDevicePager dp; 165*0f4c859eSApple OSS Distributions uint64_t descriptorID; 166*0f4c859eSApple OSS Distributions uint64_t preparationID; 167*0f4c859eSApple OSS Distributions // for kernel IOMD subclasses... they have no expansion 168*0f4c859eSApple OSS Distributions uint64_t kernReserved[4]; 169*0f4c859eSApple OSS Distributions vm_tag_t kernelTag; 170*0f4c859eSApple OSS Distributions vm_tag_t userTag; 171*0f4c859eSApple OSS Distributions task_t creator; 172*0f4c859eSApple OSS Distributions OSObject * contextObject; 173*0f4c859eSApple OSS Distributions }; 174*0f4c859eSApple OSS Distributions 175*0f4c859eSApple OSS Distributions #if defined(__x86_64__) 176*0f4c859eSApple OSS Distributions struct iopa_t { 177*0f4c859eSApple OSS Distributions IOLock * lock; 178*0f4c859eSApple OSS Distributions queue_head_t list; 179*0f4c859eSApple OSS Distributions vm_size_t pagecount; 180*0f4c859eSApple OSS Distributions vm_size_t bytecount; 181*0f4c859eSApple OSS Distributions }; 182*0f4c859eSApple OSS Distributions 183*0f4c859eSApple OSS Distributions struct iopa_page_t { 184*0f4c859eSApple OSS Distributions queue_chain_t link; 185*0f4c859eSApple OSS Distributions uint64_t avail; 186*0f4c859eSApple OSS Distributions uint32_t signature; 187*0f4c859eSApple OSS Distributions }; 188*0f4c859eSApple OSS Distributions typedef struct iopa_page_t iopa_page_t; 189*0f4c859eSApple OSS Distributions 190*0f4c859eSApple OSS Distributions typedef uintptr_t (*iopa_proc_t)(kalloc_heap_t kheap, iopa_t * a); 191*0f4c859eSApple OSS Distributions 192*0f4c859eSApple OSS Distributions enum{ 193*0f4c859eSApple OSS Distributions kIOPageAllocSignature = 'iopa' 194*0f4c859eSApple OSS Distributions }; 195*0f4c859eSApple OSS Distributions 196*0f4c859eSApple OSS Distributions extern "C" void iopa_init(iopa_t * a); 197*0f4c859eSApple OSS Distributions extern "C" uintptr_t iopa_alloc(iopa_t * a, iopa_proc_t alloc, kalloc_heap_t kheap, 198*0f4c859eSApple OSS Distributions vm_size_t bytes, vm_size_t balign); 199*0f4c859eSApple OSS Distributions extern "C" uintptr_t iopa_free(iopa_t * a, uintptr_t addr, vm_size_t bytes); 200*0f4c859eSApple OSS Distributions extern "C" uint32_t gIOPageAllocChunkBytes; 201*0f4c859eSApple OSS Distributions 202*0f4c859eSApple OSS Distributions extern "C" iopa_t gIOBMDPageAllocator; 203*0f4c859eSApple OSS Distributions #endif /* defined(__x86_64__) */ 204*0f4c859eSApple OSS Distributions 205*0f4c859eSApple OSS Distributions 206*0f4c859eSApple OSS Distributions extern "C" struct timeval gIOLastSleepTime; 207*0f4c859eSApple OSS Distributions extern "C" struct timeval gIOLastWakeTime; 208*0f4c859eSApple OSS Distributions 209*0f4c859eSApple OSS Distributions extern clock_sec_t gIOConsoleLockTime; 210*0f4c859eSApple OSS Distributions 211*0f4c859eSApple OSS Distributions extern bool gCPUsRunning; 212*0f4c859eSApple OSS Distributions 213*0f4c859eSApple OSS Distributions extern OSSet * gIORemoveOnReadProperties; 214*0f4c859eSApple OSS Distributions 215*0f4c859eSApple OSS Distributions extern uint32_t gHaltTimeMaxLog; 216*0f4c859eSApple OSS Distributions extern uint32_t gHaltTimeMaxPanic; 217*0f4c859eSApple OSS Distributions 218*0f4c859eSApple OSS Distributions extern "C" void IOKitInitializeTime( void ); 219*0f4c859eSApple OSS Distributions extern void IOMachPortInitialize(void); 220*0f4c859eSApple OSS Distributions 221*0f4c859eSApple OSS Distributions extern "C" OSString * IOCopyLogNameForPID(int pid); 222*0f4c859eSApple OSS Distributions 223*0f4c859eSApple OSS Distributions extern "C" void IOKitKernelLogBuffer(const char * title, const void * buffer, size_t size, 224*0f4c859eSApple OSS Distributions void (*output)(const char *format, ...)); 225*0f4c859eSApple OSS Distributions 226*0f4c859eSApple OSS Distributions #if defined(__i386__) || defined(__x86_64__) 227*0f4c859eSApple OSS Distributions #ifndef __cplusplus 228*0f4c859eSApple OSS Distributions #error xx 229*0f4c859eSApple OSS Distributions #endif 230*0f4c859eSApple OSS Distributions 231*0f4c859eSApple OSS Distributions extern const OSSymbol * gIOCreateEFIDevicePathSymbol; 232*0f4c859eSApple OSS Distributions extern "C" void IOSetKeyStoreData(LIBKERN_CONSUMED IOMemoryDescriptor * data); 233*0f4c859eSApple OSS Distributions extern "C" void IOSetAPFSKeyStoreData(LIBKERN_CONSUMED IOMemoryDescriptor* data); 234*0f4c859eSApple OSS Distributions #endif 235*0f4c859eSApple OSS Distributions extern const OSSymbol * gAKSGetKey; 236*0f4c859eSApple OSS Distributions 237*0f4c859eSApple OSS Distributions void IOScreenLockTimeUpdate(clock_sec_t secs); 238*0f4c859eSApple OSS Distributions 239*0f4c859eSApple OSS Distributions void IOCPUInitialize(void); 240*0f4c859eSApple OSS Distributions IOReturn IOInstallServicePlatformActions(IOService * service); 241*0f4c859eSApple OSS Distributions IOReturn IOInstallServiceSleepPlatformActions(IOService * service); 242*0f4c859eSApple OSS Distributions IOReturn IORemoveServicePlatformActions(IOService * service); 243*0f4c859eSApple OSS Distributions void IOCPUSleepKernel(void); 244*0f4c859eSApple OSS Distributions void IOPlatformActionsInitialize(void); 245*0f4c859eSApple OSS Distributions 246*0f4c859eSApple OSS Distributions class IOSystemStateNotification : public IOService 247*0f4c859eSApple OSS Distributions { 248*0f4c859eSApple OSS Distributions OSDeclareDefaultStructors(IOSystemStateNotification); 249*0f4c859eSApple OSS Distributions public: 250*0f4c859eSApple OSS Distributions static IOService * initialize(void); 251*0f4c859eSApple OSS Distributions virtual IOReturn setProperties( OSObject * properties) APPLE_KEXT_OVERRIDE; 252*0f4c859eSApple OSS Distributions virtual bool serializeProperties(OSSerialize * serialize) const APPLE_KEXT_OVERRIDE; 253*0f4c859eSApple OSS Distributions }; 254*0f4c859eSApple OSS Distributions 255*0f4c859eSApple OSS Distributions #endif /* ! _IOKIT_KERNELINTERNAL_H */ 256