2  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. 
   4  * @APPLE_LICENSE_HEADER_START@ 
   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. 
  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 
  20  * @APPLE_LICENSE_HEADER_END@ 
  23  * Copyright (c) 1998 Apple Computer, Inc.  All rights reserved.  
  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> 
  35 #include <libkern/c++/OSContainers.h> 
  36 #include <libkern/c++/OSCPPDebug.h> 
  46 int             debug_malloc_size
; 
  47 int             debug_iomalloc_size
; 
  48 int             debug_container_malloc_size
; 
  49 // int          debug_ivars_size; // in OSObject.cpp 
  51 void IOPrintPlane( const IORegistryPlane 
* plane 
) 
  53     IORegistryEntry 
*           next
; 
  54     IORegistryIterator 
*        iter
; 
  56     char                        format
[] = "%xxxs"; 
  59     iter 
= IORegistryIterator::iterateOver( plane 
); 
  61     all 
= iter
->iterateAll(); 
  63         IOLog("Count %d\n", all
->getCount() ); 
  69     while( (next 
= iter
->getNextObjectRecursive())) { 
  70         sprintf( format 
+ 1, "%ds", 2 * next
->getDepth( plane 
)); 
  72         IOLog( "\033[33m%s", next
->getName( plane 
)); 
  73         if( (next
->getLocation( plane 
))) 
  74             IOLog("@%s", next
->getLocation( plane 
)); 
  75         IOLog("\033[0m <class %s", next
->getMetaClass()->getClassName()); 
  76         if( (service 
= OSDynamicCast(IOService
, next
))) 
  77             IOLog(", busy %ld", service
->getBusyState()); 
  84 void dbugprintf(char *fmt
, ...); 
  85 void db_dumpiojunk( const IORegistryPlane 
* plane 
); 
  87 void db_piokjunk(void) { 
  89         dbugprintf("\nDT plane:\n"); 
  90         db_dumpiojunk( gIODTPlane 
); 
  91         dbugprintf("\n\nService plane:\n"); 
  92         db_dumpiojunk( gIOServicePlane 
); 
  94             "ivar kalloc()       0x%08x\n" 
  96             "containers kalloc() 0x%08x\n" 
  98             "----------------------------------------\n", 
 101             debug_container_malloc_size
, 
 108 void db_dumpiojunk( const IORegistryPlane 
* plane 
) 
 110     IORegistryEntry 
*           next
; 
 111     IORegistryIterator 
*        iter
; 
 113     char                        format
[] = "%xxxs"; 
 116     iter 
= IORegistryIterator::iterateOver( plane 
); 
 118     all 
= iter
->iterateAll(); 
 120         dbugprintf("Count %d\n", all
->getCount() ); 
 122     } else dbugprintf("Empty\n"); 
 125     while( (next 
= iter
->getNextObjectRecursive())) { 
 126                 sprintf( format 
+ 1, "%ds", 2 * next
->getDepth( plane 
)); 
 127                 dbugprintf( format
, ""); 
 128                 dbugprintf( "%s", next
->getName( plane 
)); 
 129                 if( (next
->getLocation( plane 
))) 
 130                                 dbugprintf("@%s", next
->getLocation( plane 
)); 
 131                 dbugprintf(" <class %s", next
->getMetaClass()->getClassName()); 
 132                         if( (service 
= OSDynamicCast(IOService
, next
))) 
 133                                 dbugprintf(", busy %ld", service
->getBusyState()); 
 139 void IOPrintMemory( void ) 
 142 //    OSMetaClass::printInstanceCounts(); 
 145             "ivar kalloc()       0x%08x\n" 
 147             "containers kalloc() 0x%08x\n" 
 148             "IOMalloc()          0x%08x\n" 
 149             "----------------------------------------\n", 
 152             debug_container_malloc_size
, 
 159 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 
 161 #define super OSObject 
 162 OSDefineMetaClassAndStructors(IOKitDiagnostics
, OSObject
) 
 164 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 
 166 OSObject 
* IOKitDiagnostics::diagnostics( void ) 
 168     IOKitDiagnostics 
* diags
; 
 170     diags 
= new IOKitDiagnostics
; 
 171     if( diags 
&& !diags
->init()) { 
 179 void IOKitDiagnostics::updateOffset( OSDictionary 
* dict
, 
 180                         UInt32 value
, const char * name 
) 
 184     off 
= OSNumber::withNumber( value
, 32 ); 
 188     dict
->setObject( name
, off 
); 
 193 bool IOKitDiagnostics::serialize(OSSerialize 
*s
) const 
 198     dict 
= OSDictionary::withCapacity( 5 ); 
 202     updateOffset( dict
, debug_ivars_size
, "Instance allocation" ); 
 203     updateOffset( dict
, debug_container_malloc_size
, "Container allocation" ); 
 204     updateOffset( dict
, debug_iomalloc_size
, "IOMalloc allocation" ); 
 206     OSMetaClass::serializeClassDictionary(dict
); 
 208     ok 
= dict
->serialize( s 
); 
 215 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */