xref: /xnu-11215/iokit/Kernel/IOKitDebug.cpp (revision 3ca3bd55)
1c1dac77fSApple OSS Distributions /*
2e13b1fa5SApple OSS Distributions  * Copyright (c) 1998-2006 Apple Computer, 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 /*
29c1dac77fSApple OSS Distributions  * Copyright (c) 1998 Apple Computer, Inc.  All rights reserved.
30c1dac77fSApple OSS Distributions  *
31c1dac77fSApple OSS Distributions  * HISTORY
32c1dac77fSApple OSS Distributions  *
33c1dac77fSApple OSS Distributions  */
34c1dac77fSApple OSS Distributions 
3514e3d835SApple OSS Distributions #include <sys/sysctl.h>
3614e3d835SApple OSS Distributions 
37c1dac77fSApple OSS Distributions #include <IOKit/IOKitDebug.h>
38c1dac77fSApple OSS Distributions #include <IOKit/IOLib.h>
39c1dac77fSApple OSS Distributions #include <IOKit/assert.h>
40c1dac77fSApple OSS Distributions #include <IOKit/IODeviceTreeSupport.h>
41c1dac77fSApple OSS Distributions #include <IOKit/IOService.h>
42c1dac77fSApple OSS Distributions 
43c1dac77fSApple OSS Distributions #include <libkern/c++/OSContainers.h>
44c1dac77fSApple OSS Distributions #include <libkern/c++/OSCPPDebug.h>
45c1dac77fSApple OSS Distributions 
46c1dac77fSApple OSS Distributions #ifdef IOKITDEBUG
4714e3d835SApple OSS Distributions #define DEBUG_INIT_VALUE IOKITDEBUG
4814e3d835SApple OSS Distributions #else
4914e3d835SApple OSS Distributions #define DEBUG_INIT_VALUE 0
50c1dac77fSApple OSS Distributions #endif
5114e3d835SApple OSS Distributions 
5214e3d835SApple OSS Distributions SInt64		gIOKitDebug = DEBUG_INIT_VALUE;
5314e3d835SApple OSS Distributions SYSCTL_QUAD(_debug, OID_AUTO, iokit, CTLFLAG_RW, &gIOKitDebug, "boot_arg io");
5414e3d835SApple OSS Distributions 
55c1dac77fSApple OSS Distributions 
56c1dac77fSApple OSS Distributions int 		debug_malloc_size;
57c1dac77fSApple OSS Distributions int		debug_iomalloc_size;
58e13b1fa5SApple OSS Distributions 
5914e3d835SApple OSS Distributions vm_size_t	debug_iomallocpageable_size;
60c1dac77fSApple OSS Distributions int 		debug_container_malloc_size;
61c1dac77fSApple OSS Distributions // int 		debug_ivars_size; // in OSObject.cpp
62c1dac77fSApple OSS Distributions 
6314e3d835SApple OSS Distributions extern "C" {
6414e3d835SApple OSS Distributions 
65*3ca3bd55SApple OSS Distributions #if 0
66*3ca3bd55SApple OSS Distributions #define DEBG(fmt, args...)   { kprintf(fmt, ## args); }
67*3ca3bd55SApple OSS Distributions #else
68*3ca3bd55SApple OSS Distributions #define DEBG(fmt, args...)   { IOLog(fmt, ## args); }
69*3ca3bd55SApple OSS Distributions #endif
7014e3d835SApple OSS Distributions 
71c1dac77fSApple OSS Distributions void IOPrintPlane( const IORegistryPlane * plane )
72c1dac77fSApple OSS Distributions {
73c1dac77fSApple OSS Distributions     IORegistryEntry *		next;
74c1dac77fSApple OSS Distributions     IORegistryIterator * 	iter;
75c1dac77fSApple OSS Distributions     OSOrderedSet *		all;
76c1dac77fSApple OSS Distributions     char			format[] = "%xxxs";
77c1dac77fSApple OSS Distributions     IOService *			service;
78c1dac77fSApple OSS Distributions 
79c1dac77fSApple OSS Distributions     iter = IORegistryIterator::iterateOver( plane );
80c1dac77fSApple OSS Distributions     assert( iter );
81c1dac77fSApple OSS Distributions     all = iter->iterateAll();
82c1dac77fSApple OSS Distributions     if( all) {
83*3ca3bd55SApple OSS Distributions         DEBG("Count %d\n", all->getCount() );
84c1dac77fSApple OSS Distributions         all->release();
85c1dac77fSApple OSS Distributions     } else
86*3ca3bd55SApple OSS Distributions 	DEBG("Empty\n");
87c1dac77fSApple OSS Distributions 
88c1dac77fSApple OSS Distributions     iter->reset();
89c1dac77fSApple OSS Distributions     while( (next = iter->getNextObjectRecursive())) {
90e13b1fa5SApple OSS Distributions 	snprintf(format + 1, sizeof(format) - 1, "%ds", 2 * next->getDepth( plane ));
91*3ca3bd55SApple OSS Distributions 	DEBG( format, "");
92*3ca3bd55SApple OSS Distributions 	DEBG( "\033[33m%s", next->getName( plane ));
938149afccSApple OSS Distributions 	if( (next->getLocation( plane )))
94*3ca3bd55SApple OSS Distributions             DEBG("@%s", next->getLocation( plane ));
95*3ca3bd55SApple OSS Distributions 	DEBG("\033[0m <class %s", next->getMetaClass()->getClassName());
96c1dac77fSApple OSS Distributions         if( (service = OSDynamicCast(IOService, next)))
97*3ca3bd55SApple OSS Distributions             DEBG(", busy %ld", (long) service->getBusyState());
98*3ca3bd55SApple OSS Distributions 	DEBG( ">\n");
99*3ca3bd55SApple OSS Distributions //	IOSleep(250);
100c1dac77fSApple OSS Distributions     }
101c1dac77fSApple OSS Distributions     iter->release();
102c1dac77fSApple OSS Distributions }
103c1dac77fSApple OSS Distributions 
104368ad365SApple OSS Distributions void dbugprintf(char *fmt, ...);
105368ad365SApple OSS Distributions void db_dumpiojunk( const IORegistryPlane * plane );
106368ad365SApple OSS Distributions 
107368ad365SApple OSS Distributions void db_piokjunk(void) {
108368ad365SApple OSS Distributions 
109368ad365SApple OSS Distributions 	dbugprintf("\nDT plane:\n");
110368ad365SApple OSS Distributions 	db_dumpiojunk( gIODTPlane );
111368ad365SApple OSS Distributions 	dbugprintf("\n\nService plane:\n");
112368ad365SApple OSS Distributions 	db_dumpiojunk( gIOServicePlane );
113368ad365SApple OSS Distributions     dbugprintf("\n\n"
114368ad365SApple OSS Distributions 	    "ivar kalloc()       0x%08x\n"
115368ad365SApple OSS Distributions 	    "malloc()            0x%08x\n"
116368ad365SApple OSS Distributions             "containers kalloc() 0x%08x\n"
117368ad365SApple OSS Distributions 	    "IOMalloc()          0x%08x\n"
118368ad365SApple OSS Distributions             "----------------------------------------\n",
119368ad365SApple OSS Distributions 	    debug_ivars_size,
120368ad365SApple OSS Distributions             debug_malloc_size,
121368ad365SApple OSS Distributions             debug_container_malloc_size,
122368ad365SApple OSS Distributions             debug_iomalloc_size
123368ad365SApple OSS Distributions             );
124368ad365SApple OSS Distributions 
125368ad365SApple OSS Distributions }
126368ad365SApple OSS Distributions 
127368ad365SApple OSS Distributions 
128368ad365SApple OSS Distributions void db_dumpiojunk( const IORegistryPlane * plane )
129368ad365SApple OSS Distributions {
130368ad365SApple OSS Distributions     IORegistryEntry *		next;
131368ad365SApple OSS Distributions     IORegistryIterator * 	iter;
132368ad365SApple OSS Distributions     OSOrderedSet *		all;
133368ad365SApple OSS Distributions     char			format[] = "%xxxs";
134368ad365SApple OSS Distributions     IOService *			service;
135368ad365SApple OSS Distributions 
136368ad365SApple OSS Distributions     iter = IORegistryIterator::iterateOver( plane );
137368ad365SApple OSS Distributions 
138368ad365SApple OSS Distributions     all = iter->iterateAll();
139368ad365SApple OSS Distributions     if( all) {
140368ad365SApple OSS Distributions         dbugprintf("Count %d\n", all->getCount() );
141368ad365SApple OSS Distributions         all->release();
142368ad365SApple OSS Distributions     } else dbugprintf("Empty\n");
143368ad365SApple OSS Distributions 
144368ad365SApple OSS Distributions     iter->reset();
145368ad365SApple OSS Distributions     while( (next = iter->getNextObjectRecursive())) {
146e13b1fa5SApple OSS Distributions 		snprintf(format + 1, sizeof(format) - 1, "%ds", 2 * next->getDepth( plane ));
147368ad365SApple OSS Distributions 		dbugprintf( format, "");
148368ad365SApple OSS Distributions 		dbugprintf( "%s", next->getName( plane ));
149368ad365SApple OSS Distributions 		if( (next->getLocation( plane )))
150368ad365SApple OSS Distributions 				dbugprintf("@%s", next->getLocation( plane ));
151368ad365SApple OSS Distributions 		dbugprintf(" <class %s", next->getMetaClass()->getClassName());
152368ad365SApple OSS Distributions 			if( (service = OSDynamicCast(IOService, next)))
153368ad365SApple OSS Distributions 				dbugprintf(", busy %ld", service->getBusyState());
154368ad365SApple OSS Distributions 		dbugprintf( ">\n");
155368ad365SApple OSS Distributions     }
156368ad365SApple OSS Distributions     iter->release();
157368ad365SApple OSS Distributions }
158368ad365SApple OSS Distributions 
159c1dac77fSApple OSS Distributions void IOPrintMemory( void )
160c1dac77fSApple OSS Distributions {
161c1dac77fSApple OSS Distributions 
162c1dac77fSApple OSS Distributions //    OSMetaClass::printInstanceCounts();
163c1dac77fSApple OSS Distributions 
164c1dac77fSApple OSS Distributions     IOLog("\n"
165c1dac77fSApple OSS Distributions 	    "ivar kalloc()       0x%08x\n"
166c1dac77fSApple OSS Distributions 	    "malloc()            0x%08x\n"
167c1dac77fSApple OSS Distributions             "containers kalloc() 0x%08x\n"
168c1dac77fSApple OSS Distributions 	    "IOMalloc()          0x%08x\n"
169c1dac77fSApple OSS Distributions             "----------------------------------------\n",
170c1dac77fSApple OSS Distributions 	    debug_ivars_size,
171c1dac77fSApple OSS Distributions             debug_malloc_size,
172c1dac77fSApple OSS Distributions             debug_container_malloc_size,
173c1dac77fSApple OSS Distributions             debug_iomalloc_size
174c1dac77fSApple OSS Distributions             );
175c1dac77fSApple OSS Distributions }
176c1dac77fSApple OSS Distributions 
177c1dac77fSApple OSS Distributions } /* extern "C" */
178c1dac77fSApple OSS Distributions 
179c1dac77fSApple OSS Distributions /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
180c1dac77fSApple OSS Distributions 
181c1dac77fSApple OSS Distributions #define super OSObject
182c1dac77fSApple OSS Distributions OSDefineMetaClassAndStructors(IOKitDiagnostics, OSObject)
183c1dac77fSApple OSS Distributions 
184c1dac77fSApple OSS Distributions /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
185c1dac77fSApple OSS Distributions 
186c1dac77fSApple OSS Distributions OSObject * IOKitDiagnostics::diagnostics( void )
187c1dac77fSApple OSS Distributions {
188c1dac77fSApple OSS Distributions     IOKitDiagnostics * diags;
189c1dac77fSApple OSS Distributions 
190c1dac77fSApple OSS Distributions     diags = new IOKitDiagnostics;
191c1dac77fSApple OSS Distributions     if( diags && !diags->init()) {
192c1dac77fSApple OSS Distributions 	diags->release();
193c1dac77fSApple OSS Distributions 	diags = 0;
194c1dac77fSApple OSS Distributions     }
195c1dac77fSApple OSS Distributions 
196c1dac77fSApple OSS Distributions     return( diags );
197c1dac77fSApple OSS Distributions }
198c1dac77fSApple OSS Distributions 
199c1dac77fSApple OSS Distributions void IOKitDiagnostics::updateOffset( OSDictionary * dict,
200c1dac77fSApple OSS Distributions 			UInt32 value, const char * name )
201c1dac77fSApple OSS Distributions {
202c1dac77fSApple OSS Distributions     OSNumber * off;
203c1dac77fSApple OSS Distributions 
204c1dac77fSApple OSS Distributions     off = OSNumber::withNumber( value, 32 );
205c1dac77fSApple OSS Distributions     if( !off)
206c1dac77fSApple OSS Distributions 	return;
207c1dac77fSApple OSS Distributions 
208c1dac77fSApple OSS Distributions     dict->setObject( name, off );
209c1dac77fSApple OSS Distributions     off->release();
210c1dac77fSApple OSS Distributions }
211c1dac77fSApple OSS Distributions 
212c1dac77fSApple OSS Distributions bool IOKitDiagnostics::serialize(OSSerialize *s) const
213c1dac77fSApple OSS Distributions {
214c1dac77fSApple OSS Distributions     OSDictionary * 	dict;
215c1dac77fSApple OSS Distributions     bool		ok;
216c1dac77fSApple OSS Distributions 
217c1dac77fSApple OSS Distributions     dict = OSDictionary::withCapacity( 5 );
218c1dac77fSApple OSS Distributions     if( !dict)
219c1dac77fSApple OSS Distributions 	return( false );
220c1dac77fSApple OSS Distributions 
221c1dac77fSApple OSS Distributions     updateOffset( dict, debug_ivars_size, "Instance allocation" );
222c1dac77fSApple OSS Distributions     updateOffset( dict, debug_container_malloc_size, "Container allocation" );
223c1dac77fSApple OSS Distributions     updateOffset( dict, debug_iomalloc_size, "IOMalloc allocation" );
22414e3d835SApple OSS Distributions     updateOffset( dict, debug_iomallocpageable_size, "Pageable allocation" );
225c1dac77fSApple OSS Distributions 
226368ad365SApple OSS Distributions     OSMetaClass::serializeClassDictionary(dict);
227c1dac77fSApple OSS Distributions 
228c1dac77fSApple OSS Distributions     ok = dict->serialize( s );
229c1dac77fSApple OSS Distributions 
230c1dac77fSApple OSS Distributions     dict->release();
231c1dac77fSApple OSS Distributions 
232c1dac77fSApple OSS Distributions     return( ok );
233c1dac77fSApple OSS Distributions }
234c1dac77fSApple OSS Distributions 
235c1dac77fSApple OSS Distributions /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
236