1c1dac77fSApple OSS Distributions /* 2*3ca3bd55SApple OSS Distributions * Copyright (c) 1998-2008 Apple 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 /* 29*3ca3bd55SApple OSS Distributions * Copyright (c) 1998,1999 Apple Inc. All rights reserved. 30c1dac77fSApple OSS Distributions * 31c1dac77fSApple OSS Distributions * HISTORY 32c1dac77fSApple OSS Distributions * 33c1dac77fSApple OSS Distributions */ 34c1dac77fSApple OSS Distributions 35c1dac77fSApple OSS Distributions #include <libkern/c++/OSUnserialize.h> 36*3ca3bd55SApple OSS Distributions #include <libkern/c++/OSKext.h> 3714e3d835SApple OSS Distributions #include <libkern/version.h> 38c1dac77fSApple OSS Distributions #include <IOKit/IORegistryEntry.h> 39c1dac77fSApple OSS Distributions #include <IOKit/IODeviceTreeSupport.h> 40c1dac77fSApple OSS Distributions #include <IOKit/IOCatalogue.h> 41c1dac77fSApple OSS Distributions #include <IOKit/IOUserClient.h> 42c1dac77fSApple OSS Distributions #include <IOKit/IOMemoryDescriptor.h> 43c1dac77fSApple OSS Distributions #include <IOKit/IOPlatformExpert.h> 44c1dac77fSApple OSS Distributions #include <IOKit/IOLib.h> 45c1dac77fSApple OSS Distributions #include <IOKit/IOKitKeys.h> 46c1dac77fSApple OSS Distributions #include <IOKit/IOKitDebug.h> 47e13b1fa5SApple OSS Distributions #include <IOKit/pwr_mgt/IOPMinformeeList.h> 48c1dac77fSApple OSS Distributions 49c1dac77fSApple OSS Distributions #include <IOKit/assert.h> 50c1dac77fSApple OSS Distributions 5114e3d835SApple OSS Distributions #include "IOKitKernelInternal.h" 5214e3d835SApple OSS Distributions 53c1dac77fSApple OSS Distributions extern "C" { 54c1dac77fSApple OSS Distributions 55c1dac77fSApple OSS Distributions extern void OSlibkernInit (void); 56*3ca3bd55SApple OSS Distributions 57*3ca3bd55SApple OSS Distributions void iokit_post_constructor_init(void) __attribute__((section("__TEXT, initcode"))); 58c1dac77fSApple OSS Distributions 59c1dac77fSApple OSS Distributions #include <kern/clock.h> 60e13b1fa5SApple OSS Distributions #include <sys/time.h> 61c1dac77fSApple OSS Distributions 62e13b1fa5SApple OSS Distributions void IOKitInitializeTime( void ) 63c1dac77fSApple OSS Distributions { 64c1dac77fSApple OSS Distributions mach_timespec_t t; 65c1dac77fSApple OSS Distributions 66c1dac77fSApple OSS Distributions t.tv_sec = 30; 67c1dac77fSApple OSS Distributions t.tv_nsec = 0; 68c1dac77fSApple OSS Distributions IOService::waitForService( 69c1dac77fSApple OSS Distributions IOService::resourceMatching("IORTC"), &t ); 70e13b1fa5SApple OSS Distributions #ifdef ppc 71c1dac77fSApple OSS Distributions IOService::waitForService( 72c1dac77fSApple OSS Distributions IOService::resourceMatching("IONVRAM"), &t ); 73c1dac77fSApple OSS Distributions #endif 74c1dac77fSApple OSS Distributions 75c1dac77fSApple OSS Distributions clock_initialize_calendar(); 76c1dac77fSApple OSS Distributions } 77c1dac77fSApple OSS Distributions 78e13b1fa5SApple OSS Distributions void IOKitResetTime( void ) 79e13b1fa5SApple OSS Distributions { 80*3ca3bd55SApple OSS Distributions clock_sec_t secs; 81*3ca3bd55SApple OSS Distributions clock_usec_t microsecs; 82e13b1fa5SApple OSS Distributions 83e13b1fa5SApple OSS Distributions clock_initialize_calendar(); 84e13b1fa5SApple OSS Distributions 85e13b1fa5SApple OSS Distributions clock_get_calendar_microtime(&secs, µsecs); 86e13b1fa5SApple OSS Distributions gIOLastWakeTime.tv_sec = secs; 87e13b1fa5SApple OSS Distributions gIOLastWakeTime.tv_usec = microsecs; 88e13b1fa5SApple OSS Distributions } 89e13b1fa5SApple OSS Distributions 90*3ca3bd55SApple OSS Distributions void iokit_post_constructor_init(void) 91c1dac77fSApple OSS Distributions { 92c1dac77fSApple OSS Distributions IORegistryEntry * root; 93c1dac77fSApple OSS Distributions OSObject * obj; 94c1dac77fSApple OSS Distributions 95c1dac77fSApple OSS Distributions root = IORegistryEntry::initialize(); 96c1dac77fSApple OSS Distributions assert( root ); 97c1dac77fSApple OSS Distributions IOService::initialize(); 98c1dac77fSApple OSS Distributions IOCatalogue::initialize(); 99c1dac77fSApple OSS Distributions IOUserClient::initialize(); 100c1dac77fSApple OSS Distributions IOMemoryDescriptor::initialize(); 101c1dac77fSApple OSS Distributions 102e13b1fa5SApple OSS Distributions // Initializes IOPMinformeeList class-wide shared lock 103e13b1fa5SApple OSS Distributions IOPMinformeeList::getSharedRecursiveLock(); 104e13b1fa5SApple OSS Distributions 10514e3d835SApple OSS Distributions obj = OSString::withCString( version ); 106c1dac77fSApple OSS Distributions assert( obj ); 107c1dac77fSApple OSS Distributions if( obj ) { 108c1dac77fSApple OSS Distributions root->setProperty( kIOKitBuildVersionKey, obj ); 109c1dac77fSApple OSS Distributions obj->release(); 110c1dac77fSApple OSS Distributions } 111c1dac77fSApple OSS Distributions obj = IOKitDiagnostics::diagnostics(); 112c1dac77fSApple OSS Distributions if( obj ) { 113c1dac77fSApple OSS Distributions root->setProperty( kIOKitDiagnosticsKey, obj ); 114c1dac77fSApple OSS Distributions obj->release(); 115c1dac77fSApple OSS Distributions } 116c1dac77fSApple OSS Distributions 117*3ca3bd55SApple OSS Distributions } 118*3ca3bd55SApple OSS Distributions 119*3ca3bd55SApple OSS Distributions // From <osfmk/kern/debug.c> 120*3ca3bd55SApple OSS Distributions extern int debug_mode; 121*3ca3bd55SApple OSS Distributions 122*3ca3bd55SApple OSS Distributions /***** 123*3ca3bd55SApple OSS Distributions * Pointer into bootstrap KLD segment for functions never used past startup. 124*3ca3bd55SApple OSS Distributions */ 125*3ca3bd55SApple OSS Distributions void (*record_startup_extensions_function)(void) = 0; 126*3ca3bd55SApple OSS Distributions 127*3ca3bd55SApple OSS Distributions void StartIOKit( void * p1, void * p2, void * p3, void * p4 ) 128*3ca3bd55SApple OSS Distributions { 129*3ca3bd55SApple OSS Distributions IOPlatformExpertDevice * rootNub; 130*3ca3bd55SApple OSS Distributions int debugFlags; 131*3ca3bd55SApple OSS Distributions 132*3ca3bd55SApple OSS Distributions if( PE_parse_boot_argn( "io", &debugFlags, sizeof (debugFlags) )) 133*3ca3bd55SApple OSS Distributions gIOKitDebug = debugFlags; 134*3ca3bd55SApple OSS Distributions 135*3ca3bd55SApple OSS Distributions // Check for the log synchronous bit set in io 136*3ca3bd55SApple OSS Distributions if (gIOKitDebug & kIOLogSynchronous) 137*3ca3bd55SApple OSS Distributions debug_mode = true; 138*3ca3bd55SApple OSS Distributions 139*3ca3bd55SApple OSS Distributions // 140*3ca3bd55SApple OSS Distributions // Have to start IOKit environment before we attempt to start 141*3ca3bd55SApple OSS Distributions // the C++ runtime environment. At some stage we have to clean up 142*3ca3bd55SApple OSS Distributions // the initialisation path so that OS C++ can initialise independantly 143*3ca3bd55SApple OSS Distributions // of iokit basic service initialisation, or better we have IOLib stuff 144*3ca3bd55SApple OSS Distributions // initialise as basic OS services. 145*3ca3bd55SApple OSS Distributions // 146*3ca3bd55SApple OSS Distributions IOLibInit(); 147*3ca3bd55SApple OSS Distributions OSlibkernInit(); 148*3ca3bd55SApple OSS Distributions 149c1dac77fSApple OSS Distributions rootNub = new IOPlatformExpertDevice; 150c1dac77fSApple OSS Distributions 151c1dac77fSApple OSS Distributions if( rootNub && rootNub->initWithArgs( p1, p2, p3, p4)) { 152c1dac77fSApple OSS Distributions rootNub->attach( 0 ); 153c1dac77fSApple OSS Distributions 154*3ca3bd55SApple OSS Distributions /* If the bootstrap segment set up a function to record startup 155*3ca3bd55SApple OSS Distributions * extensions, call it now. 156c1dac77fSApple OSS Distributions */ 157*3ca3bd55SApple OSS Distributions if (record_startup_extensions_function) { 158*3ca3bd55SApple OSS Distributions record_startup_extensions_function(); 159*3ca3bd55SApple OSS Distributions } 160c1dac77fSApple OSS Distributions 161c1dac77fSApple OSS Distributions rootNub->registerService(); 162e13b1fa5SApple OSS Distributions 163e13b1fa5SApple OSS Distributions #if !NO_KEXTD 164e13b1fa5SApple OSS Distributions /* Add a busy count to keep the registry busy until kextd has 165e13b1fa5SApple OSS Distributions * completely finished launching. This is decremented when kextd 166e13b1fa5SApple OSS Distributions * messages the kernel after the in-kernel linker has been 167e13b1fa5SApple OSS Distributions * removed and personalities have been sent. 168e13b1fa5SApple OSS Distributions */ 169e13b1fa5SApple OSS Distributions IOService::getServiceRoot()->adjustBusy(1); 170e13b1fa5SApple OSS Distributions #endif 171c1dac77fSApple OSS Distributions } 172c1dac77fSApple OSS Distributions } 173c1dac77fSApple OSS Distributions 174e13b1fa5SApple OSS Distributions void 175e13b1fa5SApple OSS Distributions IORegistrySetOSBuildVersion(char * build_version) 176e13b1fa5SApple OSS Distributions { 177e13b1fa5SApple OSS Distributions IORegistryEntry * root = IORegistryEntry::getRegistryRoot(); 178e13b1fa5SApple OSS Distributions 179e13b1fa5SApple OSS Distributions if (root) { 180e13b1fa5SApple OSS Distributions if (build_version) { 181e13b1fa5SApple OSS Distributions root->setProperty(kOSBuildVersionKey, build_version); 182e13b1fa5SApple OSS Distributions } else { 183e13b1fa5SApple OSS Distributions root->removeProperty(kOSBuildVersionKey); 184e13b1fa5SApple OSS Distributions } 185e13b1fa5SApple OSS Distributions } 186e13b1fa5SApple OSS Distributions 187e13b1fa5SApple OSS Distributions return; 188e13b1fa5SApple OSS Distributions } 189e13b1fa5SApple OSS Distributions 190c1dac77fSApple OSS Distributions }; /* extern "C" */ 191