void StartIOKit( void * p1, void * p2, void * p3, void * p4 ) { IOPlatformExpertDevice * rootNub; int debugFlags; if( PE_parse_boot_argn( "io", &debugFlags, sizeof (debugFlags) )) gIOKitDebug = debugFlags; if( PE_parse_boot_argn( "iotrace", &debugFlags, sizeof (debugFlags) )) gIOKitTrace = debugFlags; // Compat for boot-args gIOKitTrace |= (gIOKitDebug & kIOTraceCompatBootArgs); // Check for the log synchronous bit set in io if (gIOKitDebug & kIOLogSynchronous) debug_mode = true; // // Have to start IOKit environment before we attempt to start // the C++ runtime environment. At some stage we have to clean up // the initialisation path so that OS C++ can initialise independantly // of iokit basic service initialisation, or better we have IOLib stuff // initialise as basic OS services. // IOLibInit(); OSlibkernInit(); gIOProgressBackbufferKey = OSSymbol::withCStringNoCopy(kIOProgressBackbufferKey); gIORemoveOnReadProperties = OSSet::withObjects((const OSObject **) &gIOProgressBackbufferKey, 1); interruptAccountingInit(); rootNub = new IOPlatformExpertDevice; if( rootNub && rootNub->initWithArgs( p1, p2, p3, p4)) { rootNub->attach( 0 ); /* If the bootstrap segment set up a function to record startup * extensions, call it now. */ if (record_startup_extensions_function) { record_startup_extensions_function(); } rootNub->registerService(); #if !NO_KEXTD /* Add a busy count to keep the registry busy until kextd has * completely finished launching. This is decremented when kextd * messages the kernel after the in-kernel linker has been * removed and personalities have been sent. */ IOService::getServiceRoot()->adjustBusy(1); #endif } }
void StartIOKit( void * p1, void * p2, void * p3, void * p4 ) { IOPlatformExpertDevice * rootNub; int debugFlags; IORegistryEntry * root; OSObject * obj; extern const char * gIOKernelKmods; OSString * errorString = NULL; // must release OSDictionary * fakeKmods; // must release OSCollectionIterator * kmodIter; // must release OSString * kmodName; // don't release IOLog( iokit_version ); if( PE_parse_boot_arg( "io", &debugFlags )) gIOKitDebug = debugFlags; // Check for the log synchronous bit set in io if (gIOKitDebug & kIOLogSynchronous) debug_mode = true; // // Have to start IOKit environment before we attempt to start // the C++ runtime environment. At some stage we have to clean up // the initialisation path so that OS C++ can initialise independantly // of iokit basic service initialisation, or better we have IOLib stuff // initialise as basic OS services. // IOLibInit(); OSlibkernInit(); /***** * Declare the fake kmod_info structs for built-in components * that must be tracked as independent units for dependencies. */ fakeKmods = OSDynamicCast(OSDictionary, OSUnserialize(gIOKernelKmods, &errorString)); if (!fakeKmods) { if (errorString) { panic("Kernel kmod list syntax error: %s\n", errorString->getCStringNoCopy()); errorString->release(); } else { panic("Error loading kernel kmod list.\n"); } } kmodIter = OSCollectionIterator::withCollection(fakeKmods); if (!kmodIter) { panic("Can't declare in-kernel kmods.\n"); } while ((kmodName = OSDynamicCast(OSString, kmodIter->getNextObject()))) { OSString * kmodVersion = OSDynamicCast(OSString, fakeKmods->getObject(kmodName)); if (!kmodVersion) { panic("Can't declare in-kernel kmod; \"%s\" has " "an invalid version.\n", kmodName->getCStringNoCopy()); } if (KERN_SUCCESS != kmod_create_fake(kmodName->getCStringNoCopy(), kmodVersion->getCStringNoCopy())) { panic("Failure declaring in-kernel kmod \"%s\".\n", kmodName->getCStringNoCopy()); } } kmodIter->release(); fakeKmods->release(); root = IORegistryEntry::initialize(); assert( root ); IOService::initialize(); IOCatalogue::initialize(); IOUserClient::initialize(); IOMemoryDescriptor::initialize(); obj = OSString::withCString( iokit_version ); assert( obj ); if( obj ) { root->setProperty( kIOKitBuildVersionKey, obj ); obj->release(); } obj = IOKitDiagnostics::diagnostics(); if( obj ) { root->setProperty( kIOKitDiagnosticsKey, obj ); obj->release(); } rootNub = new IOPlatformExpertDevice; if( rootNub && rootNub->initWithArgs( p1, p2, p3, p4)) { rootNub->attach( 0 ); /* Enter into the catalogue the drivers * provided by BootX. */ gIOCatalogue->recordStartupExtensions(); rootNub->registerService(); } }