#include <libkern/c++/OSUnserialize.h>
#include <libkern/version.h>
#include <IOKit/IORegistryEntry.h>
#include <IOKit/IODeviceTreeSupport.h>
#include <IOKit/IOCatalogue.h>
#include <IOKit/IOUserClient.h>
#include <IOKit/IOMemoryDescriptor.h>
#include <IOKit/IOPlatformExpert.h>
#include <IOKit/IOLib.h>
#include <IOKit/IOKitKeys.h>
#include <IOKit/IOKitDebug.h>
#include <IOKit/pwr_mgt/IOPMinformeeList.h>
#include <IOKit/assert.h>
#include "IOKitKernelInternal.h"
extern "C" {
extern void OSlibkernInit (void);
extern void ml_hpet_cfg(uint32_t, uint32_t);
#include <kern/clock.h>
void IOKitResetTime( void )
{
mach_timespec_t t;
t.tv_sec = 30;
t.tv_nsec = 0;
IOService::waitForService(
IOService::resourceMatching("IORTC"), &t );
#ifndef i386
IOService::waitForService(
IOService::resourceMatching("IONVRAM"), &t );
#endif
clock_initialize_calendar();
}
extern int debug_mode;
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; OSDictionary * fakeKmods; OSCollectionIterator * kmodIter; OSString * kmodName;
if( PE_parse_boot_arg( "io", &debugFlags ))
gIOKitDebug = debugFlags;
if (gIOKitDebug & kIOLogSynchronous)
debug_mode = true;
IOLibInit();
OSlibkernInit();
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());
}
const char *vers = (strlen(kmodVersion->getCStringNoCopy())
? kmodVersion->getCStringNoCopy()
: osrelease);
if (KERN_SUCCESS != kmod_create_fake(kmodName->getCStringNoCopy(), vers)) {
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();
IOPMinformeeList::getSharedRecursiveLock();
obj = OSString::withCString( 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 );
gIOCatalogue->recordStartupExtensions();
rootNub->registerService();
}
}
};