xref: /xnu-11215/iokit/Kernel/IOKitDebug.cpp (revision a3bb9fcc)
1c1dac77fSApple OSS Distributions /*
2855239e5SApple 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 
31855239e5SApple OSS Distributions #include <libkern/c++/OSContainers.h>
32855239e5SApple OSS Distributions #include <libkern/c++/OSCPPDebug.h>
33855239e5SApple 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;
47855239e5SApple OSS Distributions SInt64		gIOKitTrace = 0;
48855239e5SApple OSS Distributions 
49*a3bb9fccSApple OSS Distributions #if DEVELOPMENT || DEBUG
50*a3bb9fccSApple OSS Distributions #define IODEBUG_CTLFLAGS	CTLFLAG_RW
51*a3bb9fccSApple OSS Distributions #else
52*a3bb9fccSApple OSS Distributions #define IODEBUG_CTLFLAGS	CTLFLAG_RD
53*a3bb9fccSApple OSS Distributions #endif
54*a3bb9fccSApple OSS Distributions 
55*a3bb9fccSApple OSS Distributions SYSCTL_QUAD(_debug, OID_AUTO, iokit, IODEBUG_CTLFLAGS | CTLFLAG_LOCKED, &gIOKitDebug, "boot_arg io");
56855239e5SApple OSS Distributions SYSCTL_QUAD(_debug, OID_AUTO, iotrace, CTLFLAG_RW | CTLFLAG_LOCKED, &gIOKitTrace, "trace io");
5714e3d835SApple OSS Distributions 
58c1dac77fSApple OSS Distributions 
59c1dac77fSApple OSS Distributions int 		debug_malloc_size;
60c1dac77fSApple OSS Distributions int		debug_iomalloc_size;
61e13b1fa5SApple OSS Distributions 
6214e3d835SApple OSS Distributions vm_size_t	debug_iomallocpageable_size;
63c1dac77fSApple OSS Distributions int 		debug_container_malloc_size;
64c1dac77fSApple OSS Distributions // int 		debug_ivars_size; // in OSObject.cpp
65c1dac77fSApple OSS Distributions 
6614e3d835SApple OSS Distributions extern "C" {
6714e3d835SApple OSS Distributions 
683ca3bd55SApple OSS Distributions #if 0
693ca3bd55SApple OSS Distributions #define DEBG(fmt, args...)   { kprintf(fmt, ## args); }
703ca3bd55SApple OSS Distributions #else
713ca3bd55SApple OSS Distributions #define DEBG(fmt, args...)   { IOLog(fmt, ## args); }
723ca3bd55SApple OSS Distributions #endif
7314e3d835SApple OSS Distributions 
74c1dac77fSApple OSS Distributions void IOPrintPlane( const IORegistryPlane * plane )
75c1dac77fSApple OSS Distributions {
76c1dac77fSApple OSS Distributions     IORegistryEntry *		next;
77c1dac77fSApple OSS Distributions     IORegistryIterator * 	iter;
78c1dac77fSApple OSS Distributions     OSOrderedSet *		all;
79c1dac77fSApple OSS Distributions     char			format[] = "%xxxs";
80c1dac77fSApple OSS Distributions     IOService *			service;
81c1dac77fSApple OSS Distributions 
82c1dac77fSApple OSS Distributions     iter = IORegistryIterator::iterateOver( plane );
83c1dac77fSApple OSS Distributions     assert( iter );
84c1dac77fSApple OSS Distributions     all = iter->iterateAll();
85c1dac77fSApple OSS Distributions     if( all) {
863ca3bd55SApple OSS Distributions         DEBG("Count %d\n", all->getCount() );
87c1dac77fSApple OSS Distributions         all->release();
88c1dac77fSApple OSS Distributions     } else
893ca3bd55SApple OSS Distributions 	DEBG("Empty\n");
90c1dac77fSApple OSS Distributions 
91c1dac77fSApple OSS Distributions     iter->reset();
92c1dac77fSApple OSS Distributions     while( (next = iter->getNextObjectRecursive())) {
93e13b1fa5SApple OSS Distributions 	snprintf(format + 1, sizeof(format) - 1, "%ds", 2 * next->getDepth( plane ));
943ca3bd55SApple OSS Distributions 	DEBG( format, "");
953ca3bd55SApple OSS Distributions 	DEBG( "\033[33m%s", next->getName( plane ));
968149afccSApple OSS Distributions 	if( (next->getLocation( plane )))
973ca3bd55SApple OSS Distributions             DEBG("@%s", next->getLocation( plane ));
983ca3bd55SApple OSS Distributions 	DEBG("\033[0m <class %s", next->getMetaClass()->getClassName());
99c1dac77fSApple OSS Distributions         if( (service = OSDynamicCast(IOService, next)))
1003ca3bd55SApple OSS Distributions             DEBG(", busy %ld", (long) service->getBusyState());
1013ca3bd55SApple OSS Distributions 	DEBG( ">\n");
1023ca3bd55SApple OSS Distributions //	IOSleep(250);
103c1dac77fSApple OSS Distributions     }
104c1dac77fSApple OSS Distributions     iter->release();
105c1dac77fSApple OSS Distributions }
106c1dac77fSApple OSS Distributions 
107d0c1fef6SApple OSS Distributions void db_piokjunk(void)
108368ad365SApple OSS Distributions {
109368ad365SApple OSS Distributions }
110d0c1fef6SApple OSS Distributions 
111d0c1fef6SApple OSS Distributions void db_dumpiojunk( const IORegistryPlane * plane __unused )
112d0c1fef6SApple OSS Distributions {
113368ad365SApple OSS Distributions }
114368ad365SApple OSS Distributions 
115c1dac77fSApple OSS Distributions void IOPrintMemory( void )
116c1dac77fSApple OSS Distributions {
117c1dac77fSApple OSS Distributions 
118c1dac77fSApple OSS Distributions //    OSMetaClass::printInstanceCounts();
119c1dac77fSApple OSS Distributions 
120c1dac77fSApple OSS Distributions     IOLog("\n"
121c1dac77fSApple OSS Distributions 	    "ivar kalloc()       0x%08x\n"
122c1dac77fSApple OSS Distributions 	    "malloc()            0x%08x\n"
123c1dac77fSApple OSS Distributions             "containers kalloc() 0x%08x\n"
124c1dac77fSApple OSS Distributions 	    "IOMalloc()          0x%08x\n"
125c1dac77fSApple OSS Distributions             "----------------------------------------\n",
126c1dac77fSApple OSS Distributions 	    debug_ivars_size,
127c1dac77fSApple OSS Distributions             debug_malloc_size,
128c1dac77fSApple OSS Distributions             debug_container_malloc_size,
129c1dac77fSApple OSS Distributions             debug_iomalloc_size
130c1dac77fSApple OSS Distributions             );
131c1dac77fSApple OSS Distributions }
132c1dac77fSApple OSS Distributions 
133c1dac77fSApple OSS Distributions } /* extern "C" */
134c1dac77fSApple OSS Distributions 
135c1dac77fSApple OSS Distributions /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
136c1dac77fSApple OSS Distributions 
137c1dac77fSApple OSS Distributions #define super OSObject
138c1dac77fSApple OSS Distributions OSDefineMetaClassAndStructors(IOKitDiagnostics, OSObject)
139c1dac77fSApple OSS Distributions 
140c1dac77fSApple OSS Distributions /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
141c1dac77fSApple OSS Distributions 
142c1dac77fSApple OSS Distributions OSObject * IOKitDiagnostics::diagnostics( void )
143c1dac77fSApple OSS Distributions {
144c1dac77fSApple OSS Distributions     IOKitDiagnostics * diags;
145c1dac77fSApple OSS Distributions 
146c1dac77fSApple OSS Distributions     diags = new IOKitDiagnostics;
147c1dac77fSApple OSS Distributions     if( diags && !diags->init()) {
148c1dac77fSApple OSS Distributions 	diags->release();
149c1dac77fSApple OSS Distributions 	diags = 0;
150c1dac77fSApple OSS Distributions     }
151c1dac77fSApple OSS Distributions 
152c1dac77fSApple OSS Distributions     return( diags );
153c1dac77fSApple OSS Distributions }
154c1dac77fSApple OSS Distributions 
155c1dac77fSApple OSS Distributions void IOKitDiagnostics::updateOffset( OSDictionary * dict,
156c1dac77fSApple OSS Distributions 			UInt32 value, const char * name )
157c1dac77fSApple OSS Distributions {
158c1dac77fSApple OSS Distributions     OSNumber * off;
159c1dac77fSApple OSS Distributions 
160c1dac77fSApple OSS Distributions     off = OSNumber::withNumber( value, 32 );
161c1dac77fSApple OSS Distributions     if( !off)
162c1dac77fSApple OSS Distributions 	return;
163c1dac77fSApple OSS Distributions 
164c1dac77fSApple OSS Distributions     dict->setObject( name, off );
165c1dac77fSApple OSS Distributions     off->release();
166c1dac77fSApple OSS Distributions }
167c1dac77fSApple OSS Distributions 
168c1dac77fSApple OSS Distributions bool IOKitDiagnostics::serialize(OSSerialize *s) const
169c1dac77fSApple OSS Distributions {
170c1dac77fSApple OSS Distributions     OSDictionary * 	dict;
171c1dac77fSApple OSS Distributions     bool		ok;
172c1dac77fSApple OSS Distributions 
173c1dac77fSApple OSS Distributions     dict = OSDictionary::withCapacity( 5 );
174c1dac77fSApple OSS Distributions     if( !dict)
175c1dac77fSApple OSS Distributions 	return( false );
176c1dac77fSApple OSS Distributions 
177c1dac77fSApple OSS Distributions     updateOffset( dict, debug_ivars_size, "Instance allocation" );
178c1dac77fSApple OSS Distributions     updateOffset( dict, debug_container_malloc_size, "Container allocation" );
179c1dac77fSApple OSS Distributions     updateOffset( dict, debug_iomalloc_size, "IOMalloc allocation" );
18014e3d835SApple OSS Distributions     updateOffset( dict, debug_iomallocpageable_size, "Pageable allocation" );
181c1dac77fSApple OSS Distributions 
182368ad365SApple OSS Distributions     OSMetaClass::serializeClassDictionary(dict);
183c1dac77fSApple OSS Distributions 
184c1dac77fSApple OSS Distributions     ok = dict->serialize( s );
185c1dac77fSApple OSS Distributions 
186c1dac77fSApple OSS Distributions     dict->release();
187c1dac77fSApple OSS Distributions 
188c1dac77fSApple OSS Distributions     return( ok );
189c1dac77fSApple OSS Distributions }
190c1dac77fSApple OSS Distributions 
191c1dac77fSApple OSS Distributions /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
192