1c1dac77fSApple OSS Distributions /* 2*855239e5SApple OSS Distributions * Copyright (c) 1998-2010 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 29c1dac77fSApple OSS Distributions #include <libkern/c++/OSUnserialize.h> 303ca3bd55SApple OSS Distributions #include <libkern/c++/OSKext.h> 3114e3d835SApple OSS Distributions #include <libkern/version.h> 32c1dac77fSApple OSS Distributions #include <IOKit/IORegistryEntry.h> 33c1dac77fSApple OSS Distributions #include <IOKit/IODeviceTreeSupport.h> 34c1dac77fSApple OSS Distributions #include <IOKit/IOCatalogue.h> 35c1dac77fSApple OSS Distributions #include <IOKit/IOUserClient.h> 36c1dac77fSApple OSS Distributions #include <IOKit/IOMemoryDescriptor.h> 37c1dac77fSApple OSS Distributions #include <IOKit/IOPlatformExpert.h> 38c1dac77fSApple OSS Distributions #include <IOKit/IOLib.h> 39c1dac77fSApple OSS Distributions #include <IOKit/IOKitKeys.h> 40c1dac77fSApple OSS Distributions #include <IOKit/IOKitDebug.h> 41*855239e5SApple OSS Distributions #include <IOKit/pwr_mgt/RootDomain.h> 42e13b1fa5SApple OSS Distributions #include <IOKit/pwr_mgt/IOPMinformeeList.h> 43*855239e5SApple OSS Distributions #include <IOKit/IOStatisticsPrivate.h> 44*855239e5SApple OSS Distributions #include <IOKit/IOKitKeysPrivate.h> 45c1dac77fSApple OSS Distributions 46c1dac77fSApple OSS Distributions #include <IOKit/assert.h> 47c1dac77fSApple OSS Distributions 4814e3d835SApple OSS Distributions #include "IOKitKernelInternal.h" 4914e3d835SApple OSS Distributions 50c1dac77fSApple OSS Distributions extern "C" { 51c1dac77fSApple OSS Distributions 52c1dac77fSApple OSS Distributions extern void OSlibkernInit (void); 533ca3bd55SApple OSS Distributions 543ca3bd55SApple OSS Distributions void iokit_post_constructor_init(void) __attribute__((section("__TEXT, initcode"))); 55c1dac77fSApple OSS Distributions 56c1dac77fSApple OSS Distributions #include <kern/clock.h> 57e13b1fa5SApple OSS Distributions #include <sys/time.h> 58c1dac77fSApple OSS Distributions 59e13b1fa5SApple OSS Distributions void IOKitInitializeTime( void ) 60c1dac77fSApple OSS Distributions { 61c1dac77fSApple OSS Distributions mach_timespec_t t; 62c1dac77fSApple OSS Distributions 63c1dac77fSApple OSS Distributions t.tv_sec = 30; 64c1dac77fSApple OSS Distributions t.tv_nsec = 0; 65c1dac77fSApple OSS Distributions IOService::waitForService( 66c1dac77fSApple OSS Distributions IOService::resourceMatching("IORTC"), &t ); 67*855239e5SApple OSS Distributions #if defined(__i386__) || defined(__x86_64__) 68c1dac77fSApple OSS Distributions IOService::waitForService( 69c1dac77fSApple OSS Distributions IOService::resourceMatching("IONVRAM"), &t ); 70c1dac77fSApple OSS Distributions #endif 71c1dac77fSApple OSS Distributions 72c1dac77fSApple OSS Distributions clock_initialize_calendar(); 73c1dac77fSApple OSS Distributions } 74c1dac77fSApple OSS Distributions 75e13b1fa5SApple OSS Distributions void IOKitResetTime( void ) 76e13b1fa5SApple OSS Distributions { 773ca3bd55SApple OSS Distributions clock_sec_t secs; 783ca3bd55SApple OSS Distributions clock_usec_t microsecs; 79e13b1fa5SApple OSS Distributions 80e13b1fa5SApple OSS Distributions clock_initialize_calendar(); 81e13b1fa5SApple OSS Distributions 82e13b1fa5SApple OSS Distributions clock_get_calendar_microtime(&secs, µsecs); 83e13b1fa5SApple OSS Distributions gIOLastWakeTime.tv_sec = secs; 84e13b1fa5SApple OSS Distributions gIOLastWakeTime.tv_usec = microsecs; 85*855239e5SApple OSS Distributions 86*855239e5SApple OSS Distributions IOService::updateConsoleUsers(NULL, kIOMessageSystemHasPoweredOn); 87e13b1fa5SApple OSS Distributions } 88e13b1fa5SApple OSS Distributions 893ca3bd55SApple OSS Distributions void iokit_post_constructor_init(void) 90c1dac77fSApple OSS Distributions { 91c1dac77fSApple OSS Distributions IORegistryEntry * root; 92c1dac77fSApple OSS Distributions OSObject * obj; 93c1dac77fSApple OSS Distributions 94c1dac77fSApple OSS Distributions root = IORegistryEntry::initialize(); 95c1dac77fSApple OSS Distributions assert( root ); 96c1dac77fSApple OSS Distributions IOService::initialize(); 97c1dac77fSApple OSS Distributions IOCatalogue::initialize(); 98*855239e5SApple OSS Distributions IOStatistics::initialize(); 99*855239e5SApple OSS Distributions OSKext::initialize(); 100c1dac77fSApple OSS Distributions IOUserClient::initialize(); 101c1dac77fSApple OSS Distributions IOMemoryDescriptor::initialize(); 102*855239e5SApple OSS Distributions IORootParent::initialize(); 103c1dac77fSApple OSS Distributions 104e13b1fa5SApple OSS Distributions // Initializes IOPMinformeeList class-wide shared lock 105e13b1fa5SApple OSS Distributions IOPMinformeeList::getSharedRecursiveLock(); 106e13b1fa5SApple OSS Distributions 10714e3d835SApple OSS Distributions obj = OSString::withCString( version ); 108c1dac77fSApple OSS Distributions assert( obj ); 109c1dac77fSApple OSS Distributions if( obj ) { 110c1dac77fSApple OSS Distributions root->setProperty( kIOKitBuildVersionKey, obj ); 111c1dac77fSApple OSS Distributions obj->release(); 112c1dac77fSApple OSS Distributions } 113c1dac77fSApple OSS Distributions obj = IOKitDiagnostics::diagnostics(); 114c1dac77fSApple OSS Distributions if( obj ) { 115c1dac77fSApple OSS Distributions root->setProperty( kIOKitDiagnosticsKey, obj ); 116c1dac77fSApple OSS Distributions obj->release(); 117c1dac77fSApple OSS Distributions } 1183ca3bd55SApple OSS Distributions } 1193ca3bd55SApple OSS Distributions 1203ca3bd55SApple OSS Distributions // From <osfmk/kern/debug.c> 1213ca3bd55SApple OSS Distributions extern int debug_mode; 1223ca3bd55SApple OSS Distributions 1233ca3bd55SApple OSS Distributions /***** 1243ca3bd55SApple OSS Distributions * Pointer into bootstrap KLD segment for functions never used past startup. 1253ca3bd55SApple OSS Distributions */ 1263ca3bd55SApple OSS Distributions void (*record_startup_extensions_function)(void) = 0; 1273ca3bd55SApple OSS Distributions 1283ca3bd55SApple OSS Distributions void StartIOKit( void * p1, void * p2, void * p3, void * p4 ) 1293ca3bd55SApple OSS Distributions { 1303ca3bd55SApple OSS Distributions IOPlatformExpertDevice * rootNub; 1313ca3bd55SApple OSS Distributions int debugFlags; 1323ca3bd55SApple OSS Distributions 1333ca3bd55SApple OSS Distributions if( PE_parse_boot_argn( "io", &debugFlags, sizeof (debugFlags) )) 1343ca3bd55SApple OSS Distributions gIOKitDebug = debugFlags; 1353ca3bd55SApple OSS Distributions 136*855239e5SApple OSS Distributions if( PE_parse_boot_argn( "iotrace", &debugFlags, sizeof (debugFlags) )) 137*855239e5SApple OSS Distributions gIOKitTrace = debugFlags; 138*855239e5SApple OSS Distributions 139*855239e5SApple OSS Distributions // Compat for boot-args 140*855239e5SApple OSS Distributions gIOKitTrace |= (gIOKitDebug & kIOTraceCompatBootArgs); 141*855239e5SApple OSS Distributions 1423ca3bd55SApple OSS Distributions // Check for the log synchronous bit set in io 1433ca3bd55SApple OSS Distributions if (gIOKitDebug & kIOLogSynchronous) 1443ca3bd55SApple OSS Distributions debug_mode = true; 1453ca3bd55SApple OSS Distributions 1463ca3bd55SApple OSS Distributions // 1473ca3bd55SApple OSS Distributions // Have to start IOKit environment before we attempt to start 1483ca3bd55SApple OSS Distributions // the C++ runtime environment. At some stage we have to clean up 1493ca3bd55SApple OSS Distributions // the initialisation path so that OS C++ can initialise independantly 1503ca3bd55SApple OSS Distributions // of iokit basic service initialisation, or better we have IOLib stuff 1513ca3bd55SApple OSS Distributions // initialise as basic OS services. 1523ca3bd55SApple OSS Distributions // 1533ca3bd55SApple OSS Distributions IOLibInit(); 1543ca3bd55SApple OSS Distributions OSlibkernInit(); 1553ca3bd55SApple OSS Distributions 156c1dac77fSApple OSS Distributions rootNub = new IOPlatformExpertDevice; 157c1dac77fSApple OSS Distributions 158c1dac77fSApple OSS Distributions if( rootNub && rootNub->initWithArgs( p1, p2, p3, p4)) { 159c1dac77fSApple OSS Distributions rootNub->attach( 0 ); 160c1dac77fSApple OSS Distributions 1613ca3bd55SApple OSS Distributions /* If the bootstrap segment set up a function to record startup 1623ca3bd55SApple OSS Distributions * extensions, call it now. 163c1dac77fSApple OSS Distributions */ 1643ca3bd55SApple OSS Distributions if (record_startup_extensions_function) { 1653ca3bd55SApple OSS Distributions record_startup_extensions_function(); 1663ca3bd55SApple OSS Distributions } 167c1dac77fSApple OSS Distributions 168c1dac77fSApple OSS Distributions rootNub->registerService(); 169e13b1fa5SApple OSS Distributions 170e13b1fa5SApple OSS Distributions #if !NO_KEXTD 171e13b1fa5SApple OSS Distributions /* Add a busy count to keep the registry busy until kextd has 172e13b1fa5SApple OSS Distributions * completely finished launching. This is decremented when kextd 173e13b1fa5SApple OSS Distributions * messages the kernel after the in-kernel linker has been 174e13b1fa5SApple OSS Distributions * removed and personalities have been sent. 175e13b1fa5SApple OSS Distributions */ 176e13b1fa5SApple OSS Distributions IOService::getServiceRoot()->adjustBusy(1); 177e13b1fa5SApple OSS Distributions #endif 178c1dac77fSApple OSS Distributions } 179c1dac77fSApple OSS Distributions } 180c1dac77fSApple OSS Distributions 181e13b1fa5SApple OSS Distributions void 182e13b1fa5SApple OSS Distributions IORegistrySetOSBuildVersion(char * build_version) 183e13b1fa5SApple OSS Distributions { 184e13b1fa5SApple OSS Distributions IORegistryEntry * root = IORegistryEntry::getRegistryRoot(); 185e13b1fa5SApple OSS Distributions 186e13b1fa5SApple OSS Distributions if (root) { 187e13b1fa5SApple OSS Distributions if (build_version) { 188e13b1fa5SApple OSS Distributions root->setProperty(kOSBuildVersionKey, build_version); 189e13b1fa5SApple OSS Distributions } else { 190e13b1fa5SApple OSS Distributions root->removeProperty(kOSBuildVersionKey); 191e13b1fa5SApple OSS Distributions } 192e13b1fa5SApple OSS Distributions } 193e13b1fa5SApple OSS Distributions 194e13b1fa5SApple OSS Distributions return; 195e13b1fa5SApple OSS Distributions } 196e13b1fa5SApple OSS Distributions 197c1dac77fSApple OSS Distributions }; /* extern "C" */ 198