2 * Copyright (c) 1998-2019 Apple Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
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.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
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.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
29 #ifndef _IOKIT_IOKITDEBUG_H
30 #define _IOKIT_IOKITDEBUG_H
32 #include <IOKit/IOTypes.h>
37 #include <libkern/c++/OSObject.h>
38 #include <libkern/c++/OSDictionary.h>
39 #include <libkern/c++/OSSerialize.h>
41 class IOKitDiagnostics
: public OSObject
43 OSDeclareDefaultStructors(IOKitDiagnostics
);
46 static OSObject
* diagnostics( void );
47 virtual bool serialize(OSSerialize
*s
) const APPLE_KEXT_OVERRIDE
;
49 static void updateOffset( OSDictionary
* dict
,
50 UInt64 value
, const char * name
);
53 #endif /* __cplusplus */
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
,
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
,
90 _kIODebugTopFlag
= 0x8000000000000000ULL
// force enum to be 64 bits
94 kIOKitDebugUserOptions
= 0
109 | kOSRegistryModsMode
111 | kIOSleepWakeWdogOff
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
124 kIOTracePowerMgmt
= 0x00000400ULL
, // Trace power management changes
126 kIOTraceIOService
= 0x00080000ULL
, // registerService/termination
128 kIOTraceCompatBootArgs
= kIOTraceIOService
| kIOTracePowerMgmt
132 kIODKEnable
= 0x00000001ULL
,
133 kIODKLogSetup
= 0x00000002ULL
,
134 kIODKLogIPC
= 0x00000004ULL
,
135 kIODKLogPM
= 0x00000008ULL
,
136 kIODKLogMessages
= 0x00000010ULL
,
138 kIODKDisablePM
= 0x000000100ULL
,
139 kIODKDisableDextLaunch
= 0x00001000ULL
,
140 kIODKDisableDextTag
= 0x00002000ULL
,
141 kIODKDisableCDHashChecking
= 0x00004000ULL
,
142 kIODKDisableEntitlementChecking
= 0x00008000ULL
,
145 #if XNU_KERNEL_PRIVATE
147 #define DKLOG(fmt, args...) { IOLog("DK: " fmt, ## args); }
148 #define DKS "%s-0x%qx"
149 #define DKN(s) s->getName(), s->getRegistryEntryID()
151 #endif /* XNU_KERNEL_PRIVATE */
153 extern SInt64 gIOKitDebug
;
154 extern SInt64 gIOKitTrace
;
155 extern SInt64 gIODKDebug
;
162 class IORegistryPlane
;
165 extern void IOPrintPlane(
167 const IORegistryPlane
* plane
169 const struct IORegistryPlane
* plane
172 #ifndef _OSCPPDEBUG_H
173 extern void OSPrintMemory( void );
175 #define IOPrintMemory OSPrintMemory
179 #define kIOKitDiagnosticsClientClassName "IOKitDiagnosticsClient"
182 kIOKitDiagnosticsClientType
= 0x99000002
186 struct IOKitDiagnosticsParameters
{
192 uint32_t reserved
[8];
194 typedef struct IOKitDiagnosticsParameters IOKitDiagnosticsParameters
;
197 kIOTrackingCallSiteBTs
= 16,
200 struct IOTrackingCallSiteInfo
{
203 mach_vm_address_t address
;
204 mach_vm_size_t size
[2];
206 mach_vm_address_t bt
[2][kIOTrackingCallSiteBTs
];
209 #define kIOMallocTrackingName "IOMalloc"
210 #define kIOWireTrackingName "IOWire"
211 #define kIOMapTrackingName "IOMap"
213 #if XNU_KERNEL_PRIVATE && IOTRACKING
215 struct IOTrackingQueue
;
216 struct IOTrackingCallSite
;
220 IOTrackingCallSite
* site
;
221 #if !defined(__LP64__)
226 struct IOTrackingAddress
{
230 #if defined(__LP64__)
235 struct IOTrackingUser
{
240 uintptr_t bt
[kIOTrackingCallSiteBTs
];
241 uintptr_t btUser
[kIOTrackingCallSiteBTs
];
245 kIOTrackingQueueTypeDefaultOn
= 0x00000001,
246 kIOTrackingQueueTypeAlloc
= 0x00000002,
247 kIOTrackingQueueTypeMap
= 0x00000004,
248 kIOTrackingQueueTypeUser
= 0x00000008,
252 void IOTrackingInit(void);
253 IOTrackingQueue
* IOTrackingQueueAlloc(const char * name
, uintptr_t btEntry
,
254 size_t allocSize
, size_t minCaptureSize
,
255 uint32_t type
, uint32_t numSiteQs
);
256 void IOTrackingQueueFree(IOTrackingQueue
* head
);
257 void IOTrackingAdd(IOTrackingQueue
* head
, IOTracking
* mem
, size_t size
, bool address
, vm_tag_t tag
);
258 void IOTrackingRemove(IOTrackingQueue
* head
, IOTracking
* mem
, size_t size
);
259 void IOTrackingAddUser(IOTrackingQueue
* queue
, IOTrackingUser
* mem
, vm_size_t size
);
260 void IOTrackingRemoveUser(IOTrackingQueue
* head
, IOTrackingUser
* tracking
);
262 void IOTrackingAlloc(IOTrackingQueue
* head
, uintptr_t address
, size_t size
);
263 void IOTrackingFree(IOTrackingQueue
* head
, uintptr_t address
, size_t size
);
264 void IOTrackingReset(IOTrackingQueue
* head
);
265 void IOTrackingAccumSize(IOTrackingQueue
* head
, IOTracking
* mem
, size_t size
);
266 kern_return_t
IOTrackingDebug(uint32_t selector
, uint32_t options
,
267 const char * names
, size_t namesLen
,
268 size_t size
, OSObject
** result
);
270 extern IOTrackingQueue
* gIOMallocTracking
;
271 extern IOTrackingQueue
* gIOWireTracking
;
272 extern IOTrackingQueue
* gIOMapTracking
;
274 #endif /* XNU_KERNEL_PRIVATE && IOTRACKING */
277 kIOTrackingExcludeNames
= 0x00000001,
281 kIOTrackingGetTracking
= 0x00000001,
282 kIOTrackingGetMappings
= 0x00000002,
283 kIOTrackingResetTracking
= 0x00000003,
284 kIOTrackingStartCapture
= 0x00000004,
285 kIOTrackingStopCapture
= 0x00000005,
286 kIOTrackingSetMinCaptureSize
= 0x00000006,
287 kIOTrackingLeaks
= 0x00000007,
288 kIOTrackingInvalid
= 0xFFFFFFFE,
294 #endif /* __cplusplus */
296 #endif /* ! _IOKIT_IOKITDEBUG_H */