2  * Copyright (c) 1998-2006 Apple Computer, Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. The rights granted to you under the License 
  10  * may not be used to create, or enable the creation or redistribution of, 
  11  * unlawful or unlicensed copies of an Apple operating system, or to 
  12  * circumvent, violate, or enable the circumvention or violation of, any 
  13  * terms of an Apple operating system software license agreement. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  18  * The Original Code and all software distributed under the License are 
  19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  23  * Please see the License for the specific language governing rights and 
  24  * limitations under the License. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  29  * Copyright (c) 1998 Apple Computer, Inc.  All rights reserved.  
  35 #include <sys/sysctl.h> 
  37 #include <IOKit/IOKitDebug.h> 
  38 #include <IOKit/IOLib.h> 
  39 #include <IOKit/assert.h> 
  40 #include <IOKit/IODeviceTreeSupport.h> 
  41 #include <IOKit/IOService.h> 
  43 #include <libkern/c++/OSContainers.h> 
  44 #include <libkern/c++/OSCPPDebug.h> 
  47 #define DEBUG_INIT_VALUE IOKITDEBUG 
  49 #define DEBUG_INIT_VALUE 0 
  52 SInt64          gIOKitDebug 
= DEBUG_INIT_VALUE
; 
  53 SYSCTL_QUAD(_debug
, OID_AUTO
, iokit
, CTLFLAG_RW
, &gIOKitDebug
, "boot_arg io"); 
  56 int             debug_malloc_size
; 
  57 int             debug_iomalloc_size
; 
  59 vm_size_t       debug_iomallocpageable_size
; 
  60 int             debug_container_malloc_size
; 
  61 // int          debug_ivars_size; // in OSObject.cpp 
  66 #define DEBG(fmt, args...)   { kprintf(fmt, ## args); } 
  68 #define DEBG(fmt, args...)   { IOLog(fmt, ## args); } 
  71 void IOPrintPlane( const IORegistryPlane 
* plane 
) 
  73     IORegistryEntry 
*           next
; 
  74     IORegistryIterator 
*        iter
; 
  76     char                        format
[] = "%xxxs"; 
  79     iter 
= IORegistryIterator::iterateOver( plane 
); 
  81     all 
= iter
->iterateAll(); 
  83         DEBG("Count %d\n", all
->getCount() ); 
  89     while( (next 
= iter
->getNextObjectRecursive())) { 
  90         snprintf(format 
+ 1, sizeof(format
) - 1, "%ds", 2 * next
->getDepth( plane 
)); 
  92         DEBG( "\033[33m%s", next
->getName( plane 
)); 
  93         if( (next
->getLocation( plane 
))) 
  94             DEBG("@%s", next
->getLocation( plane 
)); 
  95         DEBG("\033[0m <class %s", next
->getMetaClass()->getClassName()); 
  96         if( (service 
= OSDynamicCast(IOService
, next
))) 
  97             DEBG(", busy %ld", (long) service
->getBusyState()); 
 104 void dbugprintf(char *fmt
, ...); 
 105 void db_dumpiojunk( const IORegistryPlane 
* plane 
); 
 107 void db_piokjunk(void) { 
 109         dbugprintf("\nDT plane:\n"); 
 110         db_dumpiojunk( gIODTPlane 
); 
 111         dbugprintf("\n\nService plane:\n"); 
 112         db_dumpiojunk( gIOServicePlane 
); 
 114             "ivar kalloc()       0x%08x\n" 
 116             "containers kalloc() 0x%08x\n" 
 117             "IOMalloc()          0x%08x\n" 
 118             "----------------------------------------\n", 
 121             debug_container_malloc_size
, 
 128 void db_dumpiojunk( const IORegistryPlane 
* plane 
) 
 130     IORegistryEntry 
*           next
; 
 131     IORegistryIterator 
*        iter
; 
 133     char                        format
[] = "%xxxs"; 
 136     iter 
= IORegistryIterator::iterateOver( plane 
); 
 138     all 
= iter
->iterateAll(); 
 140         dbugprintf("Count %d\n", all
->getCount() ); 
 142     } else dbugprintf("Empty\n"); 
 145     while( (next 
= iter
->getNextObjectRecursive())) { 
 146                 snprintf(format 
+ 1, sizeof(format
) - 1, "%ds", 2 * next
->getDepth( plane 
)); 
 147                 dbugprintf( format
, ""); 
 148                 dbugprintf( "%s", next
->getName( plane 
)); 
 149                 if( (next
->getLocation( plane 
))) 
 150                                 dbugprintf("@%s", next
->getLocation( plane 
)); 
 151                 dbugprintf(" <class %s", next
->getMetaClass()->getClassName()); 
 152                         if( (service 
= OSDynamicCast(IOService
, next
))) 
 153                                 dbugprintf(", busy %ld", service
->getBusyState()); 
 159 void IOPrintMemory( void ) 
 162 //    OSMetaClass::printInstanceCounts(); 
 165             "ivar kalloc()       0x%08x\n" 
 167             "containers kalloc() 0x%08x\n" 
 168             "IOMalloc()          0x%08x\n" 
 169             "----------------------------------------\n", 
 172             debug_container_malloc_size
, 
 179 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 
 181 #define super OSObject 
 182 OSDefineMetaClassAndStructors(IOKitDiagnostics
, OSObject
) 
 184 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 
 186 OSObject 
* IOKitDiagnostics::diagnostics( void ) 
 188     IOKitDiagnostics 
* diags
; 
 190     diags 
= new IOKitDiagnostics
; 
 191     if( diags 
&& !diags
->init()) { 
 199 void IOKitDiagnostics::updateOffset( OSDictionary 
* dict
, 
 200                         UInt32 value
, const char * name 
) 
 204     off 
= OSNumber::withNumber( value
, 32 ); 
 208     dict
->setObject( name
, off 
); 
 212 bool IOKitDiagnostics::serialize(OSSerialize 
*s
) const 
 217     dict 
= OSDictionary::withCapacity( 5 ); 
 221     updateOffset( dict
, debug_ivars_size
, "Instance allocation" ); 
 222     updateOffset( dict
, debug_container_malloc_size
, "Container allocation" ); 
 223     updateOffset( dict
, debug_iomalloc_size
, "IOMalloc allocation" ); 
 224     updateOffset( dict
, debug_iomallocpageable_size
, "Pageable allocation" ); 
 226     OSMetaClass::serializeClassDictionary(dict
); 
 228     ok 
= dict
->serialize( s 
); 
 235 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */