xref: /xnu-11215/iokit/Kernel/IOKitDebug.cpp (revision 855239e5)
1c1dac77fSApple OSS Distributions /*
2*855239e5SApple OSS Distributions  * Copyright (c) 1998-2010 Apple Inc. All rights reserved.
3c1dac77fSApple OSS Distributions  *
4e13b1fa5SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5c1dac77fSApple OSS Distributions  *
6e13b1fa5SApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7e13b1fa5SApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8e13b1fa5SApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9e13b1fa5SApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10e13b1fa5SApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11e13b1fa5SApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12e13b1fa5SApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13e13b1fa5SApple OSS Distributions  * terms of an Apple operating system software license agreement.
14c1dac77fSApple OSS Distributions  *
15e13b1fa5SApple OSS Distributions  * Please obtain a copy of the License at
16e13b1fa5SApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17e13b1fa5SApple OSS Distributions  *
18e13b1fa5SApple OSS Distributions  * The Original Code and all software distributed under the License are
19e13b1fa5SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20c1dac77fSApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21c1dac77fSApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22e13b1fa5SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23e13b1fa5SApple OSS Distributions  * Please see the License for the specific language governing rights and
24e13b1fa5SApple OSS Distributions  * limitations under the License.
25c1dac77fSApple OSS Distributions  *
26e13b1fa5SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27c1dac77fSApple OSS Distributions  */
28c1dac77fSApple OSS Distributions 
2914e3d835SApple OSS Distributions #include <sys/sysctl.h>
3014e3d835SApple OSS Distributions 
31*855239e5SApple OSS Distributions #include <libkern/c++/OSContainers.h>
32*855239e5SApple OSS Distributions #include <libkern/c++/OSCPPDebug.h>
33*855239e5SApple OSS Distributions 
34c1dac77fSApple OSS Distributions #include <IOKit/IOKitDebug.h>
35c1dac77fSApple OSS Distributions #include <IOKit/IOLib.h>
36c1dac77fSApple OSS Distributions #include <IOKit/assert.h>
37c1dac77fSApple OSS Distributions #include <IOKit/IODeviceTreeSupport.h>
38c1dac77fSApple OSS Distributions #include <IOKit/IOService.h>
39c1dac77fSApple OSS Distributions 
40c1dac77fSApple OSS Distributions #ifdef IOKITDEBUG
4114e3d835SApple OSS Distributions #define DEBUG_INIT_VALUE IOKITDEBUG
4214e3d835SApple OSS Distributions #else
4314e3d835SApple OSS Distributions #define DEBUG_INIT_VALUE 0
44c1dac77fSApple OSS Distributions #endif
4514e3d835SApple OSS Distributions 
4614e3d835SApple OSS Distributions SInt64		gIOKitDebug = DEBUG_INIT_VALUE;
47*855239e5SApple OSS Distributions SInt64		gIOKitTrace = 0;
48*855239e5SApple OSS Distributions 
49*855239e5SApple OSS Distributions SYSCTL_QUAD(_debug, OID_AUTO, iokit, CTLFLAG_RW | CTLFLAG_LOCKED, &gIOKitDebug, "boot_arg io");
50*855239e5SApple OSS Distributions SYSCTL_QUAD(_debug, OID_AUTO, iotrace, CTLFLAG_RW | CTLFLAG_LOCKED, &gIOKitTrace, "trace io");
5114e3d835SApple OSS Distributions 
52c1dac77fSApple OSS Distributions 
53c1dac77fSApple OSS Distributions int 		debug_malloc_size;
54c1dac77fSApple OSS Distributions int		debug_iomalloc_size;
55e13b1fa5SApple OSS Distributions 
5614e3d835SApple OSS Distributions vm_size_t	debug_iomallocpageable_size;
57c1dac77fSApple OSS Distributions int 		debug_container_malloc_size;
58c1dac77fSApple OSS Distributions // int 		debug_ivars_size; // in OSObject.cpp
59c1dac77fSApple OSS Distributions 
6014e3d835SApple OSS Distributions extern "C" {
6114e3d835SApple OSS Distributions 
623ca3bd55SApple OSS Distributions #if 0
633ca3bd55SApple OSS Distributions #define DEBG(fmt, args...)   { kprintf(fmt, ## args); }
643ca3bd55SApple OSS Distributions #else
653ca3bd55SApple OSS Distributions #define DEBG(fmt, args...)   { IOLog(fmt, ## args); }
663ca3bd55SApple OSS Distributions #endif
6714e3d835SApple OSS Distributions 
68c1dac77fSApple OSS Distributions void IOPrintPlane( const IORegistryPlane * plane )
69c1dac77fSApple OSS Distributions {
70c1dac77fSApple OSS Distributions     IORegistryEntry *		next;
71c1dac77fSApple OSS Distributions     IORegistryIterator * 	iter;
72c1dac77fSApple OSS Distributions     OSOrderedSet *		all;
73c1dac77fSApple OSS Distributions     char			format[] = "%xxxs";
74c1dac77fSApple OSS Distributions     IOService *			service;
75c1dac77fSApple OSS Distributions 
76c1dac77fSApple OSS Distributions     iter = IORegistryIterator::iterateOver( plane );
77c1dac77fSApple OSS Distributions     assert( iter );
78c1dac77fSApple OSS Distributions     all = iter->iterateAll();
79c1dac77fSApple OSS Distributions     if( all) {
803ca3bd55SApple OSS Distributions         DEBG("Count %d\n", all->getCount() );
81c1dac77fSApple OSS Distributions         all->release();
82c1dac77fSApple OSS Distributions     } else
833ca3bd55SApple OSS Distributions 	DEBG("Empty\n");
84c1dac77fSApple OSS Distributions 
85c1dac77fSApple OSS Distributions     iter->reset();
86c1dac77fSApple OSS Distributions     while( (next = iter->getNextObjectRecursive())) {
87e13b1fa5SApple OSS Distributions 	snprintf(format + 1, sizeof(format) - 1, "%ds", 2 * next->getDepth( plane ));
883ca3bd55SApple OSS Distributions 	DEBG( format, "");
893ca3bd55SApple OSS Distributions 	DEBG( "\033[33m%s", next->getName( plane ));
908149afccSApple OSS Distributions 	if( (next->getLocation( plane )))
913ca3bd55SApple OSS Distributions             DEBG("@%s", next->getLocation( plane ));
923ca3bd55SApple OSS Distributions 	DEBG("\033[0m <class %s", next->getMetaClass()->getClassName());
93c1dac77fSApple OSS Distributions         if( (service = OSDynamicCast(IOService, next)))
943ca3bd55SApple OSS Distributions             DEBG(", busy %ld", (long) service->getBusyState());
953ca3bd55SApple OSS Distributions 	DEBG( ">\n");
963ca3bd55SApple OSS Distributions //	IOSleep(250);
97c1dac77fSApple OSS Distributions     }
98c1dac77fSApple OSS Distributions     iter->release();
99c1dac77fSApple OSS Distributions }
100c1dac77fSApple OSS Distributions 
101*855239e5SApple OSS Distributions void dbugprintf(const char *fmt, ...);
102368ad365SApple OSS Distributions void db_dumpiojunk( const IORegistryPlane * plane );
103368ad365SApple OSS Distributions 
104368ad365SApple OSS Distributions void db_piokjunk(void) {
105368ad365SApple OSS Distributions 
106368ad365SApple OSS Distributions 	dbugprintf("\nDT plane:\n");
107368ad365SApple OSS Distributions 	db_dumpiojunk( gIODTPlane );
108368ad365SApple OSS Distributions 	dbugprintf("\n\nService plane:\n");
109368ad365SApple OSS Distributions 	db_dumpiojunk( gIOServicePlane );
110368ad365SApple OSS Distributions     dbugprintf("\n\n"
111368ad365SApple OSS Distributions 	    "ivar kalloc()       0x%08x\n"
112368ad365SApple OSS Distributions 	    "malloc()            0x%08x\n"
113368ad365SApple OSS Distributions             "containers kalloc() 0x%08x\n"
114368ad365SApple OSS Distributions 	    "IOMalloc()          0x%08x\n"
115368ad365SApple OSS Distributions             "----------------------------------------\n",
116368ad365SApple OSS Distributions 	    debug_ivars_size,
117368ad365SApple OSS Distributions             debug_malloc_size,
118368ad365SApple OSS Distributions             debug_container_malloc_size,
119368ad365SApple OSS Distributions             debug_iomalloc_size
120368ad365SApple OSS Distributions             );
121368ad365SApple OSS Distributions 
122368ad365SApple OSS Distributions }
123368ad365SApple OSS Distributions 
124368ad365SApple OSS Distributions 
125368ad365SApple OSS Distributions void db_dumpiojunk( const IORegistryPlane * plane )
126368ad365SApple OSS Distributions {
127368ad365SApple OSS Distributions     IORegistryEntry *		next;
128368ad365SApple OSS Distributions     IORegistryIterator * 	iter;
129368ad365SApple OSS Distributions     OSOrderedSet *		all;
130368ad365SApple OSS Distributions     char			format[] = "%xxxs";
131368ad365SApple OSS Distributions     IOService *			service;
132368ad365SApple OSS Distributions 
133368ad365SApple OSS Distributions     iter = IORegistryIterator::iterateOver( plane );
134368ad365SApple OSS Distributions 
135368ad365SApple OSS Distributions     all = iter->iterateAll();
136368ad365SApple OSS Distributions     if( all) {
137368ad365SApple OSS Distributions         dbugprintf("Count %d\n", all->getCount() );
138368ad365SApple OSS Distributions         all->release();
139368ad365SApple OSS Distributions     } else dbugprintf("Empty\n");
140368ad365SApple OSS Distributions 
141368ad365SApple OSS Distributions     iter->reset();
142368ad365SApple OSS Distributions     while( (next = iter->getNextObjectRecursive())) {
143e13b1fa5SApple OSS Distributions 		snprintf(format + 1, sizeof(format) - 1, "%ds", 2 * next->getDepth( plane ));
144368ad365SApple OSS Distributions 		dbugprintf( format, "");
145368ad365SApple OSS Distributions 		dbugprintf( "%s", next->getName( plane ));
146368ad365SApple OSS Distributions 		if( (next->getLocation( plane )))
147368ad365SApple OSS Distributions 				dbugprintf("@%s", next->getLocation( plane ));
148368ad365SApple OSS Distributions 		dbugprintf(" <class %s", next->getMetaClass()->getClassName());
149368ad365SApple OSS Distributions 			if( (service = OSDynamicCast(IOService, next)))
150368ad365SApple OSS Distributions 				dbugprintf(", busy %ld", service->getBusyState());
151368ad365SApple OSS Distributions 		dbugprintf( ">\n");
152368ad365SApple OSS Distributions     }
153368ad365SApple OSS Distributions     iter->release();
154368ad365SApple OSS Distributions }
155368ad365SApple OSS Distributions 
156c1dac77fSApple OSS Distributions void IOPrintMemory( void )
157c1dac77fSApple OSS Distributions {
158c1dac77fSApple OSS Distributions 
159c1dac77fSApple OSS Distributions //    OSMetaClass::printInstanceCounts();
160c1dac77fSApple OSS Distributions 
161c1dac77fSApple OSS Distributions     IOLog("\n"
162c1dac77fSApple OSS Distributions 	    "ivar kalloc()       0x%08x\n"
163c1dac77fSApple OSS Distributions 	    "malloc()            0x%08x\n"
164c1dac77fSApple OSS Distributions             "containers kalloc() 0x%08x\n"
165c1dac77fSApple OSS Distributions 	    "IOMalloc()          0x%08x\n"
166c1dac77fSApple OSS Distributions             "----------------------------------------\n",
167c1dac77fSApple OSS Distributions 	    debug_ivars_size,
168c1dac77fSApple OSS Distributions             debug_malloc_size,
169c1dac77fSApple OSS Distributions             debug_container_malloc_size,
170c1dac77fSApple OSS Distributions             debug_iomalloc_size
171c1dac77fSApple OSS Distributions             );
172c1dac77fSApple OSS Distributions }
173c1dac77fSApple OSS Distributions 
174c1dac77fSApple OSS Distributions } /* extern "C" */
175c1dac77fSApple OSS Distributions 
176c1dac77fSApple OSS Distributions /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
177c1dac77fSApple OSS Distributions 
178c1dac77fSApple OSS Distributions #define super OSObject
179c1dac77fSApple OSS Distributions OSDefineMetaClassAndStructors(IOKitDiagnostics, OSObject)
180c1dac77fSApple OSS Distributions 
181c1dac77fSApple OSS Distributions /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
182c1dac77fSApple OSS Distributions 
183c1dac77fSApple OSS Distributions OSObject * IOKitDiagnostics::diagnostics( void )
184c1dac77fSApple OSS Distributions {
185c1dac77fSApple OSS Distributions     IOKitDiagnostics * diags;
186c1dac77fSApple OSS Distributions 
187c1dac77fSApple OSS Distributions     diags = new IOKitDiagnostics;
188c1dac77fSApple OSS Distributions     if( diags && !diags->init()) {
189c1dac77fSApple OSS Distributions 	diags->release();
190c1dac77fSApple OSS Distributions 	diags = 0;
191c1dac77fSApple OSS Distributions     }
192c1dac77fSApple OSS Distributions 
193c1dac77fSApple OSS Distributions     return( diags );
194c1dac77fSApple OSS Distributions }
195c1dac77fSApple OSS Distributions 
196c1dac77fSApple OSS Distributions void IOKitDiagnostics::updateOffset( OSDictionary * dict,
197c1dac77fSApple OSS Distributions 			UInt32 value, const char * name )
198c1dac77fSApple OSS Distributions {
199c1dac77fSApple OSS Distributions     OSNumber * off;
200c1dac77fSApple OSS Distributions 
201c1dac77fSApple OSS Distributions     off = OSNumber::withNumber( value, 32 );
202c1dac77fSApple OSS Distributions     if( !off)
203c1dac77fSApple OSS Distributions 	return;
204c1dac77fSApple OSS Distributions 
205c1dac77fSApple OSS Distributions     dict->setObject( name, off );
206c1dac77fSApple OSS Distributions     off->release();
207c1dac77fSApple OSS Distributions }
208c1dac77fSApple OSS Distributions 
209c1dac77fSApple OSS Distributions bool IOKitDiagnostics::serialize(OSSerialize *s) const
210c1dac77fSApple OSS Distributions {
211c1dac77fSApple OSS Distributions     OSDictionary * 	dict;
212c1dac77fSApple OSS Distributions     bool		ok;
213c1dac77fSApple OSS Distributions 
214c1dac77fSApple OSS Distributions     dict = OSDictionary::withCapacity( 5 );
215c1dac77fSApple OSS Distributions     if( !dict)
216c1dac77fSApple OSS Distributions 	return( false );
217c1dac77fSApple OSS Distributions 
218c1dac77fSApple OSS Distributions     updateOffset( dict, debug_ivars_size, "Instance allocation" );
219c1dac77fSApple OSS Distributions     updateOffset( dict, debug_container_malloc_size, "Container allocation" );
220c1dac77fSApple OSS Distributions     updateOffset( dict, debug_iomalloc_size, "IOMalloc allocation" );
22114e3d835SApple OSS Distributions     updateOffset( dict, debug_iomallocpageable_size, "Pageable allocation" );
222c1dac77fSApple OSS Distributions 
223368ad365SApple OSS Distributions     OSMetaClass::serializeClassDictionary(dict);
224c1dac77fSApple OSS Distributions 
225c1dac77fSApple OSS Distributions     ok = dict->serialize( s );
226c1dac77fSApple OSS Distributions 
227c1dac77fSApple OSS Distributions     dict->release();
228c1dac77fSApple OSS Distributions 
229c1dac77fSApple OSS Distributions     return( ok );
230c1dac77fSApple OSS Distributions }
231c1dac77fSApple OSS Distributions 
232c1dac77fSApple OSS Distributions /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
233