#include <libkern/c++/OSUnserialize.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/assert.h>
extern "C" {
extern void OSlibkernInit (void);
extern void IOLibInit(void);
#include <kern/clock.h>
#include <IOKit/IOReturn.h>
#include <IOKit/IOMessage.h>
extern void *registerSleepWakeInterest(
void *callback,
void *target,
void *refCon);
static void
calend_wakeup_resynch(
thread_call_param_t p0,
thread_call_param_t p1)
{
void IOKitResetTime(void);
IOKitResetTime();
}
static thread_call_t calend_sleep_wake_call;
static IOReturn
calend_sleep_wake_notif(
void *target,
void *refCon,
unsigned int messageType,
void *provider,
void *messageArg,
vm_size_t argSize)
{
if (messageType != kIOMessageSystemHasPoweredOn)
return (kIOReturnUnsupported);
if (calend_sleep_wake_call != NULL)
thread_call_enter(calend_sleep_wake_call);
return (kIOReturnSuccess);
}
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
if (calend_sleep_wake_call == NULL) {
calend_sleep_wake_call = thread_call_allocate(
calend_wakeup_resynch, NULL);
registerSleepWakeInterest((void *)calend_sleep_wake_notif, NULL, NULL);
}
clock_initialize_calendar();
}
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;
IOLog( iokit_version );
if( PE_parse_boot_arg( "io", &debugFlags ))
gIOKitDebug = debugFlags;
IOLibInit();
OSlibkernInit();
IOLog("_cppInit done\n");
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 );
gIOCatalogue->recordStartupExtensions();
rootNub->registerService();
}
}
};