xref: /xnu-11215/iokit/Kernel/IOKitDebug.cpp (revision c1dac77f)
1 /*
2  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_LICENSE_HEADER_START@
5  *
6  * The contents of this file constitute Original Code as defined in and
7  * are subject to the Apple Public Source License Version 1.1 (the
8  * "License").  You may not use this file except in compliance with the
9  * License.  Please obtain a copy of the License at
10  * http://www.apple.com/publicsource and read it before using this file.
11  *
12  * This Original Code and all software distributed under the License are
13  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
17  * License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * @APPLE_LICENSE_HEADER_END@
21  */
22 /*
23  * Copyright (c) 1998 Apple Computer, Inc.  All rights reserved.
24  *
25  * HISTORY
26  *
27  */
28 
29 #include <IOKit/IOKitDebug.h>
30 #include <IOKit/IOLib.h>
31 #include <IOKit/assert.h>
32 #include <IOKit/IODeviceTreeSupport.h>
33 #include <IOKit/IOService.h>
34 
35 #include <libkern/c++/OSContainers.h>
36 #include <libkern/c++/OSCPPDebug.h>
37 
38 extern "C" {
39 
40 SInt64		gIOKitDebug
41 #ifdef IOKITDEBUG
42                             = IOKITDEBUG
43 #endif
44 ;
45 
46 int 		debug_malloc_size;
47 int		debug_iomalloc_size;
48 int 		debug_container_malloc_size;
49 // int 		debug_ivars_size; // in OSObject.cpp
50 
51 void IOPrintPlane( const IORegistryPlane * plane )
52 {
53     IORegistryEntry *		next;
54     IORegistryIterator * 	iter;
55     OSOrderedSet *		all;
56     char			format[] = "%xxxs";
57     IOService *			service;
58 
59     iter = IORegistryIterator::iterateOver( plane );
60     assert( iter );
61     all = iter->iterateAll();
62     if( all) {
63         IOLog("Count %d\n", all->getCount() );
64         all->release();
65     } else
66 	IOLog("Empty\n");
67 
68     iter->reset();
69     while( (next = iter->getNextObjectRecursive())) {
70 	sprintf( format + 1, "%ds", next->getDepth( plane ));
71 	IOLog( format, "");
72         if( (service = OSDynamicCast(IOService, next)))
73             IOLog("<%ld>", service->getBusyState());
74 	IOLog( "%s\n", next->getName());
75     }
76     iter->release();
77 }
78 
79 void IOPrintMemory( void )
80 {
81 
82 //    OSMetaClass::printInstanceCounts();
83 
84     IOLog("\n"
85 	    "ivar kalloc()       0x%08x\n"
86 	    "malloc()            0x%08x\n"
87             "containers kalloc() 0x%08x\n"
88 	    "IOMalloc()          0x%08x\n"
89             "----------------------------------------\n",
90 	    debug_ivars_size,
91             debug_malloc_size,
92             debug_container_malloc_size,
93             debug_iomalloc_size
94             );
95 }
96 
97 } /* extern "C" */
98 
99 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
100 
101 #define super OSObject
102 OSDefineMetaClassAndStructors(IOKitDiagnostics, OSObject)
103 
104 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
105 
106 OSObject * IOKitDiagnostics::diagnostics( void )
107 {
108     IOKitDiagnostics * diags;
109 
110     diags = new IOKitDiagnostics;
111     if( diags && !diags->init()) {
112 	diags->release();
113 	diags = 0;
114     }
115 
116     return( diags );
117 }
118 
119 void IOKitDiagnostics::updateOffset( OSDictionary * dict,
120 			UInt32 value, const char * name )
121 {
122     OSNumber * off;
123 
124     off = OSNumber::withNumber( value, 32 );
125     if( !off)
126 	return;
127 
128     dict->setObject( name, off );
129     off->release();
130 }
131 
132 
133 bool IOKitDiagnostics::serialize(OSSerialize *s) const
134 {
135     OSDictionary * 	dict;
136     bool		ok;
137 
138     dict = OSDictionary::withCapacity( 5 );
139     if( !dict)
140 	return( false );
141 
142     updateOffset( dict, debug_ivars_size, "Instance allocation" );
143     updateOffset( dict, debug_container_malloc_size, "Container allocation" );
144     updateOffset( dict, debug_iomalloc_size, "IOMalloc allocation" );
145 
146     dict->setObject( "Classes", OSMetaClass::getClassDictionary() );
147 
148     ok = dict->serialize( s );
149 
150     dict->release();
151 
152     return( ok );
153 }
154 
155 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
156