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 // Enable IOWaitQuiet panics except on KASAN. These panics can only 156 // be triggered by specially entitled entities granted the privilege 157 // to panic on a registry quiesce timeout. 158 #if KASAN 159 #define DEBUG_INIT_VALUE 0 160 #else /* !KASAN */ 161 #define DEBUG_INIT_VALUE kIOWaitQuietPanics 162 #endif /* KASAN */ 163 #endif 164 165 #endif /* XNU_KERNEL_PRIVATE */ 166 167 extern SInt64 gIOKitDebug; 168 extern SInt64 gIOKitTrace; 169 extern SInt64 gIODKDebug; 170 171 #ifdef __cplusplus 172 173 typedef kern_return_t (*IOCoreAnalyticsSendEventProc)( 174 uint64_t options, 175 OSString * eventName, 176 OSDictionary * eventPayload); 177 178 #if XNU_KERNEL_PRIVATE 179 extern IOCoreAnalyticsSendEventProc gIOCoreAnalyticsSendEventProc; 180 #endif /* XNU_KERNEL_PRIVATE */ 181 182 #endif /* __cplusplus */ 183 184 #ifdef __cplusplus 185 extern "C" { 186 #endif 187 188 #ifdef __cplusplus 189 class IORegistryPlane; 190 #endif 191 192 extern void IOPrintPlane( 193 #ifdef __cplusplus 194 const IORegistryPlane * plane 195 #else 196 const struct IORegistryPlane * plane 197 #endif 198 ); 199 #ifndef _OSCPPDEBUG_H 200 extern void OSPrintMemory( void ); 201 #endif 202 #define IOPrintMemory OSPrintMemory 203 204 #if defined(KERNEL) && defined(__cplusplus) 205 kern_return_t 206 IOSetCoreAnalyticsSendEventProc(IOCoreAnalyticsSendEventProc proc); 207 #endif /* defined(KERNEL) && defined(__cplusplus) */ 208 209 #define kIOKitDiagnosticsClientClassName "IOKitDiagnosticsClient" 210 211 enum{ 212 kIOKitDiagnosticsClientType = 0x99000002 213 }; 214 215 216 struct IOKitDiagnosticsParameters { 217 size_t size; 218 uint64_t value; 219 uint32_t options; 220 uint32_t tag; 221 uint32_t zsize; 222 uint32_t reserved[8]; 223 }; 224 typedef struct IOKitDiagnosticsParameters IOKitDiagnosticsParameters; 225 226 enum{ 227 kIOTrackingCallSiteBTs = 16, 228 }; 229 230 struct IOTrackingCallSiteInfo { 231 uint32_t count; 232 pid_t addressPID; 233 mach_vm_address_t address; 234 mach_vm_size_t size[2]; 235 pid_t btPID; 236 mach_vm_address_t bt[2][kIOTrackingCallSiteBTs]; 237 }; 238 239 #define kIOMallocTrackingName "IOMalloc" 240 #define kIOWireTrackingName "IOWire" 241 #define kIOMapTrackingName "IOMap" 242 243 #if XNU_KERNEL_PRIVATE && IOTRACKING 244 245 struct IOTrackingQueue; 246 struct IOTrackingCallSite; 247 248 struct IOTracking { 249 queue_chain_t link; 250 IOTrackingCallSite * site; 251 #if !defined(__LP64__) 252 uint32_t flags; 253 #endif 254 }; 255 256 struct IOTrackingAddress { 257 IOTracking tracking; 258 uintptr_t address; 259 size_t size; 260 #if defined(__LP64__) 261 uint32_t flags; 262 #endif 263 }; 264 265 struct IOTrackingUser { 266 queue_chain_t link; 267 pid_t btPID; 268 uint8_t user32; 269 uint8_t userCount; 270 uintptr_t bt[kIOTrackingCallSiteBTs]; 271 uintptr_t btUser[kIOTrackingCallSiteBTs]; 272 }; 273 274 enum{ 275 kIOTrackingQueueTypeDefaultOn = 0x00000001, 276 kIOTrackingQueueTypeAlloc = 0x00000002, 277 kIOTrackingQueueTypeMap = 0x00000004, 278 kIOTrackingQueueTypeUser = 0x00000008, 279 }; 280 281 282 void IOTrackingInit(void); 283 IOTrackingQueue * IOTrackingQueueAlloc(const char * name, uintptr_t btEntry, 284 size_t allocSize, size_t minCaptureSize, 285 uint32_t type, uint32_t numSiteQs); 286 void IOTrackingQueueFree(IOTrackingQueue * head); 287 void IOTrackingQueueCollectUser(IOTrackingQueue * queue); 288 void IOTrackingAdd(IOTrackingQueue * head, IOTracking * mem, size_t size, bool address, vm_tag_t tag); 289 void IOTrackingRemove(IOTrackingQueue * head, IOTracking * mem, size_t size); 290 void IOTrackingRemoveAddress(IOTrackingQueue * head, IOTrackingAddress * mem, size_t size); 291 void IOTrackingAddUser(IOTrackingQueue * queue, IOTrackingUser * mem, vm_size_t size); 292 void IOTrackingRemoveUser(IOTrackingQueue * head, IOTrackingUser * tracking); 293 294 void IOTrackingAlloc(IOTrackingQueue * head, uintptr_t address, size_t size); 295 void IOTrackingFree(IOTrackingQueue * head, uintptr_t address, size_t size); 296 void IOTrackingReset(IOTrackingQueue * head); 297 void IOTrackingAccumSize(IOTrackingQueue * head, IOTracking * mem, size_t size); 298 kern_return_t IOTrackingDebug(uint32_t selector, uint32_t options, 299 const char * names, size_t namesLen, 300 size_t size, OSObject ** result); 301 302 extern IOTrackingQueue * gIOMallocTracking; 303 extern IOTrackingQueue * gIOWireTracking; 304 extern IOTrackingQueue * gIOMapTracking; 305 306 #endif /* XNU_KERNEL_PRIVATE && IOTRACKING */ 307 308 enum{ 309 kIOTrackingLeakScanStart = 0x00000001, 310 kIOTrackingLeakScanEnd = 0x00000002, 311 }; 312 313 extern void (*gIOTrackingLeakScanCallback)(uint32_t notification); 314 315 enum{ 316 kIOTrackingExcludeNames = 0x00000001, 317 }; 318 319 enum{ 320 kIOTrackingGetTracking = 0x00000001, 321 kIOTrackingGetMappings = 0x00000002, 322 kIOTrackingResetTracking = 0x00000003, 323 kIOTrackingStartCapture = 0x00000004, 324 kIOTrackingStopCapture = 0x00000005, 325 kIOTrackingSetMinCaptureSize = 0x00000006, 326 kIOTrackingLeaks = 0x00000007, 327 kIOTrackingInvalid = 0xFFFFFFFE, 328 }; 329 330 331 #ifdef __cplusplus 332 } /* extern "C" */ 333 #endif /* __cplusplus */ 334 335 #endif /* ! _IOKIT_IOKITDEBUG_H */ 336