#include <IOKit/IODeviceTreeSupport.h>
#include <libkern/c++/OSContainers.h>
#include <IOKit/IOLib.h>
#include <assert.h>
extern "C" {
extern int debug_container_malloc_size;
extern int debug_ivars_size;
}
static void DumpTree( void )
{
IORegistryEntry * next;
IORegistryEntry * packages = 0;
IORegistryEntry * deblocker = 0;
IORegistryEntry * keyboard = 0;
IORegistryIterator * iter;
OSOrderedSet * all;
IOLog("ivars %08x, containers %08x\n",
debug_ivars_size, debug_container_malloc_size);
iter = IORegistryIterator::iterateOver( gIODTPlane );
assert( iter );
all = iter->iterateAll();
IOLog("\nCount %d\n", all->getCount() );
all->release();
iter->reset();
while( (next = iter->nextEntryRecursive())) {
if( 0 == strcmp( "packages", next->getName()))
packages = next;
if( 0 == strcmp( "deblocker", next->getName()))
deblocker = next;
if( 0 == strcmp( "keyboard", next->getName()))
keyboard = next;
}
if( deblocker && keyboard)
deblocker->attachToParent( keyboard, gIODTPlane);
iter->reset();
while( (next = iter->nextEntryRecursive())) {
IOLog("%s=%d,", next->getName(), next->getDepth( gIODTPlane ));
if( 0 == strcmp( "gc", next->getName())) {
packages = next;
}
}
IOLog("ivars %08x, containers %08x\n",
debug_ivars_size, debug_container_malloc_size);
if( packages)
packages->detachAll( gIODTPlane);
all = iter->iterateAll();
IOLog("del gc/, count now %d\n", all->getCount() );
all->release();
iter->release();
IOLog("ivars %08x, containers %08x\n",
debug_ivars_size, debug_container_malloc_size);
}
extern "C" {
void PathTests( void )
{
const char * tests[] = {
"IODeviceTree:/bandit",
"IODeviceTree:/",
"IODeviceTree:/xxxx",
"IODeviceTree:/bandit/xxx",
"IODeviceTree:/bandit@F2000000",
"IODeviceTree:/bandit/gc",
"IODeviceTree:/bandit/gc/mace:17.202.42.95,\\mach_kernel",
"IODeviceTree:/bandit/@10/mesh",
"IODeviceTree:enet:17.202",
"IODeviceTree:scsi/@0:0",
"IODeviceTree:scsi-int",
"IODeviceTree:/bandit/gc@10/mesh",
"IODeviceTree:/bandit/gc/53c94/disk@0:6,mach_kernel",
"IOService:/",
"IOService:/ApplePlatformExpert",
"IOService:/ApplePlatformExpert/hammerhead@F8000000",
"IOService:/ApplePlatformExpert/bandit/AppleMacRiscPCI"
};
IORegistryEntry * entry;
char str[256];
int len;
for( unsigned int i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
len = sizeof( str );
entry = IORegistryEntry::fromPath( tests[i], 0, str, &len );
IOLog("\"%s\" ", tests[i] );
if( entry) {
IOLog("found %s, tail = \"%s\"\n", entry->getName(), str );
len = sizeof( str );
if( entry->getPath( str, &len,
IORegistryEntry::getPlane("IODeviceTree"))) {
IOLog("path = \"%s\"\n", str);
}
entry->release();
} else
IOLog("not found\n");
}
}
}
void TestsCpp( void * dtTop )
{
IORegistryEntry * dt;
IOLog("\nivars %08x, containers %08x\n",
debug_ivars_size, debug_container_malloc_size);
OSMetaClass::printInstanceCounts();
dt = IODeviceTreeAlloc( dtTop );
assert( dt );
DumpTree();
dt->detachAll( gIODTPlane);
OSMetaClass::printInstanceCounts();
IOLog("ivars %08x, containers %08x\n",
debug_ivars_size, debug_container_malloc_size);
}