xref: /xnu-10002.41.9/iokit/IOKit/IOKitDebug.h (revision 699cd48037512bf4380799317ca44ca453c82f57)
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