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