1 /* 2 * Copyright (c) 1998-2019 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 29 #ifndef _IOKIT_IOKITDEBUG_H 30 #define _IOKIT_IOKITDEBUG_H 31 32 #include <IOKit/IOTypes.h> 33 34 35 #ifdef __cplusplus 36 37 #include <libkern/c++/OSObject.h> 38 #include <libkern/c++/OSDictionary.h> 39 #include <libkern/c++/OSSerialize.h> 40 41 class IOKitDiagnostics : public OSObject 42 { 43 OSDeclareDefaultStructors(IOKitDiagnostics); 44 45 public: 46 static OSObject * diagnostics( void ); 47 virtual bool serialize(OSSerialize *s) const APPLE_KEXT_OVERRIDE; 48 private: 49 static void updateOffset( OSDictionary * dict, 50 UInt64 value, const char * name ); 51 }; 52 53 #endif /* __cplusplus */ 54 55 enum { 56 // loggage 57 kIOLogAttach = 0x00000001ULL, 58 kIOLogProbe = 0x00000002ULL, 59 kIOLogStart = 0x00000004ULL, 60 kIOLogRegister = 0x00000008ULL, 61 kIOLogMatch = 0x00000010ULL, 62 kIOLogConfig = 0x00000020ULL, 63 kIOLogYield = 0x00000040ULL, 64 kIOLogPower = 0x00000080ULL, 65 kIOLogMapping = 0x00000100ULL, 66 kIOLogCatalogue = 0x00000200ULL, 67 kIOLogTracePower = 0x00000400ULL, // Obsolete: Use iotrace=0x00000400ULL to enable now 68 kIOLogDebugPower = 0x00000800ULL, 69 kIOLogServiceTree = 0x00001000ULL, 70 kIOLogDTree = 0x00002000ULL, 71 kIOLogMemory = 0x00004000ULL, 72 kIOLogKextMemory = 0x00008000ULL, 73 kOSLogRegistryMods = 0x00010000ULL,// Log attempts to modify registry collections 74 kIOLogPMRootDomain = 0x00020000ULL, 75 kOSRegistryModsMode = 0x00040000ULL,// Change default registry modification handling - panic vs. log 76 // kIOTraceIOService = 0x00080000ULL, // Obsolete: Use iotrace=0x00080000ULL to enable now 77 kIOLogHibernate = 0x00100000ULL, 78 kIOStatistics = 0x04000000ULL, 79 kIOSleepWakeWdogOff = 0x40000000ULL, 80 kIOKextSpinDump = 0x80000000ULL, 81 82 // debug aids - change behaviour 83 kIONoFreeObjects = 0x00100000ULL, 84 // kIOLogSynchronous = 0x00200000ULL, // IOLog completes synchronously -- obsolete 85 kIOTracking = 0x00400000ULL, 86 kIOWaitQuietPanics = 0x00800000ULL, 87 kIOWaitQuietBeforeRoot = 0x01000000ULL, 88 kIOTrackingBoot = 0x02000000ULL, 89 90 _kIODebugTopFlag = 0x8000000000000000ULL// force enum to be 64 bits 91 }; 92 93 enum { 94 kIOKitDebugUserOptions = 0 95 | kIOLogAttach 96 | kIOLogProbe 97 | kIOLogStart 98 | kIOLogRegister 99 | kIOLogMatch 100 | kIOLogConfig 101 | kIOLogYield 102 | kIOLogPower 103 | kIOLogMapping 104 | kIOLogCatalogue 105 | kIOLogTracePower 106 | kIOLogDebugPower 107 | kOSLogRegistryMods 108 | kIOLogPMRootDomain 109 | kOSRegistryModsMode 110 | kIOLogHibernate 111 | kIOSleepWakeWdogOff 112 | kIOKextSpinDump 113 | kIOWaitQuietPanics 114 }; 115 116 enum { 117 kIOTraceInterrupts = 0x00000001ULL, // Trace primary interrupts 118 kIOTraceWorkLoops = 0x00000002ULL, // Trace workloop activity 119 kIOTraceEventSources = 0x00000004ULL, // Trace non-passive event sources 120 kIOTraceIntEventSource = 0x00000008ULL, // Trace IOIES and IOFIES sources 121 kIOTraceCommandGates = 0x00000010ULL, // Trace command gate activity 122 kIOTraceTimers = 0x00000020ULL, // Trace timer event source activity 123 124 kIOTracePowerMgmt = 0x00000400ULL, // Trace power management changes 125 126 kIOTraceIOService = 0x00080000ULL, // registerService/termination 127 128 kIOTraceCompatBootArgs = kIOTraceIOService | kIOTracePowerMgmt 129 }; 130 131 enum { 132 kIODKEnable = 0x00000001ULL, 133 kIODKLogSetup = 0x00000002ULL, 134 kIODKLogIPC = 0x00000004ULL, 135 kIODKLogPM = 0x00000008ULL, 136 kIODKLogMessages = 0x00000010ULL, 137 138 kIODKDisablePM = 0x000000100ULL, 139 kIODKDisableDextLaunch = 0x00001000ULL, 140 kIODKDisableDextTag = 0x00002000ULL, 141 kIODKDisableCDHashChecking = 0x00004000ULL, 142 kIODKDisableEntitlementChecking = 0x00008000ULL, 143 kIODKDisableCheckInTokenVerification = 0x00010000ULL, 144 }; 145 146 #if XNU_KERNEL_PRIVATE 147 148 #define DKLOG(fmt, args...) { IOLog("DK: " fmt, ## args); } 149 #define DKS "%s-0x%qx" 150 #define DKN(s) s->getName(), s->getRegistryEntryID() 151 152 #ifdef IOKITDEBUG 153 #define DEBUG_INIT_VALUE IOKITDEBUG 154 #else 155 #define DEBUG_INIT_VALUE 0 156 #endif 157 158 #endif /* XNU_KERNEL_PRIVATE */ 159 160 extern SInt64 gIOKitDebug; 161 extern SInt64 gIOKitTrace; 162 extern SInt64 gIODKDebug; 163 164 #ifdef __cplusplus 165 166 typedef kern_return_t (*IOCoreAnalyticsSendEventProc)( 167 uint64_t options, 168 OSString * eventName, 169 OSDictionary * eventPayload); 170 171 #if XNU_KERNEL_PRIVATE 172 extern IOCoreAnalyticsSendEventProc gIOCoreAnalyticsSendEventProc; 173 #endif /* XNU_KERNEL_PRIVATE */ 174 175 #endif /* __cplusplus */ 176 177 #ifdef __cplusplus 178 extern "C" { 179 #endif 180 181 #ifdef __cplusplus 182 class IORegistryPlane; 183 #endif 184 185 extern void IOPrintPlane( 186 #ifdef __cplusplus 187 const IORegistryPlane * plane 188 #else 189 const struct IORegistryPlane * plane 190 #endif 191 ); 192 #ifndef _OSCPPDEBUG_H 193 extern void OSPrintMemory( void ); 194 #endif 195 #define IOPrintMemory OSPrintMemory 196 197 #if defined(KERNEL) && defined(__cplusplus) 198 kern_return_t 199 IOSetCoreAnalyticsSendEventProc(IOCoreAnalyticsSendEventProc proc); 200 #endif /* defined(KERNEL) && defined(__cplusplus) */ 201 202 #define kIOKitDiagnosticsClientClassName "IOKitDiagnosticsClient" 203 204 enum{ 205 kIOKitDiagnosticsClientType = 0x99000002 206 }; 207 208 209 struct IOKitDiagnosticsParameters { 210 size_t size; 211 uint64_t value; 212 uint32_t options; 213 uint32_t tag; 214 uint32_t zsize; 215 uint32_t reserved[8]; 216 }; 217 typedef struct IOKitDiagnosticsParameters IOKitDiagnosticsParameters; 218 219 enum{ 220 kIOTrackingCallSiteBTs = 16, 221 }; 222 223 struct IOTrackingCallSiteInfo { 224 uint32_t count; 225 pid_t addressPID; 226 mach_vm_address_t address; 227 mach_vm_size_t size[2]; 228 pid_t btPID; 229 mach_vm_address_t bt[2][kIOTrackingCallSiteBTs]; 230 }; 231 232 #define kIOMallocTrackingName "IOMalloc" 233 #define kIOWireTrackingName "IOWire" 234 #define kIOMapTrackingName "IOMap" 235 236 #if XNU_KERNEL_PRIVATE && IOTRACKING 237 238 struct IOTrackingQueue; 239 struct IOTrackingCallSite; 240 241 struct IOTracking { 242 queue_chain_t link; 243 IOTrackingCallSite * site; 244 #if !defined(__LP64__) 245 uint32_t flags; 246 #endif 247 }; 248 249 struct IOTrackingAddress { 250 IOTracking tracking; 251 uintptr_t address; 252 size_t size; 253 #if defined(__LP64__) 254 uint32_t flags; 255 #endif 256 }; 257 258 struct IOTrackingUser { 259 queue_chain_t link; 260 pid_t btPID; 261 uint8_t user32; 262 uint8_t userCount; 263 uintptr_t bt[kIOTrackingCallSiteBTs]; 264 uintptr_t btUser[kIOTrackingCallSiteBTs]; 265 }; 266 267 enum{ 268 kIOTrackingQueueTypeDefaultOn = 0x00000001, 269 kIOTrackingQueueTypeAlloc = 0x00000002, 270 kIOTrackingQueueTypeMap = 0x00000004, 271 kIOTrackingQueueTypeUser = 0x00000008, 272 }; 273 274 275 void IOTrackingInit(void); 276 IOTrackingQueue * IOTrackingQueueAlloc(const char * name, uintptr_t btEntry, 277 size_t allocSize, size_t minCaptureSize, 278 uint32_t type, uint32_t numSiteQs); 279 void IOTrackingQueueFree(IOTrackingQueue * head); 280 void IOTrackingQueueCollectUser(IOTrackingQueue * queue); 281 void IOTrackingAdd(IOTrackingQueue * head, IOTracking * mem, size_t size, bool address, vm_tag_t tag); 282 void IOTrackingRemove(IOTrackingQueue * head, IOTracking * mem, size_t size); 283 void IOTrackingAddUser(IOTrackingQueue * queue, IOTrackingUser * mem, vm_size_t size); 284 void IOTrackingRemoveUser(IOTrackingQueue * head, IOTrackingUser * tracking); 285 286 void IOTrackingAlloc(IOTrackingQueue * head, uintptr_t address, size_t size); 287 void IOTrackingFree(IOTrackingQueue * head, uintptr_t address, size_t size); 288 void IOTrackingReset(IOTrackingQueue * head); 289 void IOTrackingAccumSize(IOTrackingQueue * head, IOTracking * mem, size_t size); 290 kern_return_t IOTrackingDebug(uint32_t selector, uint32_t options, 291 const char * names, size_t namesLen, 292 size_t size, OSObject ** result); 293 294 extern IOTrackingQueue * gIOMallocTracking; 295 extern IOTrackingQueue * gIOWireTracking; 296 extern IOTrackingQueue * gIOMapTracking; 297 298 #endif /* XNU_KERNEL_PRIVATE && IOTRACKING */ 299 300 enum{ 301 kIOTrackingExcludeNames = 0x00000001, 302 }; 303 304 enum{ 305 kIOTrackingGetTracking = 0x00000001, 306 kIOTrackingGetMappings = 0x00000002, 307 kIOTrackingResetTracking = 0x00000003, 308 kIOTrackingStartCapture = 0x00000004, 309 kIOTrackingStopCapture = 0x00000005, 310 kIOTrackingSetMinCaptureSize = 0x00000006, 311 kIOTrackingLeaks = 0x00000007, 312 kIOTrackingInvalid = 0xFFFFFFFE, 313 }; 314 315 316 #ifdef __cplusplus 317 } /* extern "C" */ 318 #endif /* __cplusplus */ 319 320 #endif /* ! _IOKIT_IOKITDEBUG_H */ 321