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