1 /* 2 * Copyright (c) 2015-2022 Apple, Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 #ifndef __IOSKYWALKSUPPORT_H 29 #define __IOSKYWALKSUPPORT_H 30 31 #ifdef KERNEL_PRIVATE 32 #include <sys/cdefs.h> 33 #include <IOKit/IOReturn.h> 34 35 #ifdef __cplusplus 36 class IOMemoryDescriptor; 37 typedef IOMemoryDescriptor * IOSKMemoryRef; 38 class IOSKArena; 39 typedef IOSKArena * IOSKArenaRef; 40 class IOSKRegion; 41 typedef IOSKRegion * IOSKRegionRef; 42 class IOSKMapper; 43 typedef IOSKMapper * IOSKMapperRef; 44 #define IOSK_CONSUMED LIBKERN_CONSUMED 45 #else /* !__cplusplus */ 46 typedef struct IOMemoryDescriptor * IOSKMemoryRef; 47 typedef struct IOSKArena * IOSKArenaRef; 48 typedef struct IOSKRegion * IOSKRegionRef; 49 typedef struct IOSKMapper * IOSKMapperRef; 50 #define IOSK_CONSUMED 51 #endif /* !__cplusplus */ 52 53 typedef IOSKMemoryRef IOSKMemoryDescriptor; 54 55 #if defined(__x86_64__) && defined(__cplusplus) 56 const OSSymbol * IOSKCopyKextIdentifierWithAddress( vm_address_t address ); 57 #endif 58 59 #ifdef XNU_KERNEL_PRIVATE 60 #ifdef __cplusplus 61 class IOMemoryMap; 62 typedef IOMemoryMap * IOSKMemoryMapRef; 63 #else /* !__cplusplus */ 64 typedef struct IOMemoryMap * IOSKMemoryMapRef; 65 #endif /* !__cplusplus */ 66 67 typedef IOSKMemoryRef IOSKMemoryArrayRef; 68 typedef IOSKMemoryRef IOSKMemoryBufferRef; 69 typedef uint32_t IOSKSize; 70 typedef uint32_t IOSKIndex; 71 typedef uint32_t IOSKCount; 72 typedef uint32_t IOSKOffset; 73 74 typedef struct { 75 boolean_t user_writable; /* writable by user task */ 76 boolean_t kernel_writable; /* writable by kernel task */ 77 boolean_t iodir_in; /* direction: device-to-host */ 78 boolean_t iodir_out; /* direction: host-to-device */ 79 boolean_t purgeable; /* purgeable (not wired) */ 80 boolean_t inhibitCache; /* cache-inhibit */ 81 boolean_t physcontig; /* physically contiguous */ 82 boolean_t puredata; /* data only, no pointers */ 83 boolean_t threadSafe; /* thread safe */ 84 } IOSKMemoryBufferSpec; 85 86 typedef struct { 87 boolean_t noRedirect; 88 } IOSKRegionSpec; 89 90 __BEGIN_DECLS 91 92 IOSKMemoryBufferRef IOSKMemoryBufferCreate( mach_vm_size_t capacity, 93 const IOSKMemoryBufferSpec * spec, 94 mach_vm_address_t * kvaddr ); 95 96 IOSKMemoryArrayRef IOSKMemoryArrayCreate( const IOSKMemoryRef refs[__counted_by(count)], 97 uint32_t count ); 98 99 void IOSKMemoryDestroy( IOSK_CONSUMED IOSKMemoryRef reference ); 100 101 IOSKMemoryMapRef IOSKMemoryMapToTask( IOSKMemoryRef reference, 102 task_t intoTask, 103 mach_vm_address_t * mapAddr, 104 mach_vm_size_t * mapSize ); 105 106 IOSKMemoryMapRef IOSKMemoryMapToKernelTask( IOSKMemoryRef reference, 107 mach_vm_address_t * mapAddr, 108 mach_vm_size_t * mapSize ); 109 110 void IOSKMemoryMapDestroy( 111 IOSK_CONSUMED IOSKMemoryMapRef reference ); 112 113 IOReturn IOSKMemoryReclaim( IOSKMemoryRef reference ); 114 IOReturn IOSKMemoryDiscard( IOSKMemoryRef reference ); 115 116 IOReturn IOSKMemoryWire( IOSKMemoryRef reference ); 117 IOReturn IOSKMemoryUnwire( IOSKMemoryRef reference ); 118 119 IOSKArenaRef 120 IOSKArenaCreate( IOSKRegionRef * regionList, IOSKCount regionCount ); 121 122 void 123 IOSKArenaDestroy( IOSK_CONSUMED IOSKArenaRef arena ); 124 125 void 126 IOSKArenaRedirect( IOSKArenaRef arena ); 127 128 IOSKRegionRef 129 IOSKRegionCreate( const IOSKRegionSpec * regionSpec, 130 IOSKSize segmentSize, IOSKCount segmentCount ); 131 132 void 133 IOSKRegionDestroy( IOSK_CONSUMED IOSKRegionRef region ); 134 135 IOReturn 136 IOSKRegionSetBuffer( IOSKRegionRef region, IOSKIndex segmentIndex, 137 IOSKMemoryBufferRef buffer ); 138 139 void 140 IOSKRegionClearBuffer( IOSKRegionRef region, IOSKIndex segmentIndex ); 141 142 void 143 IOSKRegionClearBufferDebug( IOSKRegionRef region, IOSKIndex segmentIndex, 144 IOSKMemoryBufferRef * prevBufferRef ); 145 146 IOSKMapperRef 147 IOSKMapperCreate( IOSKArenaRef arena, task_t task ); 148 149 void 150 IOSKMapperDestroy( IOSK_CONSUMED IOSKMapperRef mapper ); 151 152 void 153 IOSKMapperRedirect( IOSKMapperRef mapper ); 154 155 IOReturn 156 IOSKMapperGetAddress( IOSKMapperRef mapper, 157 mach_vm_address_t * address, mach_vm_size_t * size ); 158 159 boolean_t 160 IOSKBufferIsWired( IOSKMemoryBufferRef buffer ); 161 162 __END_DECLS 163 #endif /* XNU_KERNEL_PRIVATE */ 164 #endif /* KERNEL_PRIVATE */ 165 #endif /* __IOSKYWALKSUPPORT_H */ 166