Loading...
--- xnu/xnu-2050.22.13/iokit/Kernel/IOStartIOKit.cpp
+++ xnu/xnu-1228/iokit/Kernel/IOStartIOKit.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998-2010 Apple Inc. All rights reserved.
+ * Copyright (c) 1998-2006 Apple Computer, Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
@@ -25,9 +25,14 @@
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_END@
*/
+/*
+ * Copyright (c) 1998,1999 Apple Computer, Inc. All rights reserved.
+ *
+ * HISTORY
+ *
+ */
#include <libkern/c++/OSUnserialize.h>
-#include <libkern/c++/OSKext.h>
#include <libkern/version.h>
#include <IOKit/IORegistryEntry.h>
#include <IOKit/IODeviceTreeSupport.h>
@@ -38,10 +43,7 @@
#include <IOKit/IOLib.h>
#include <IOKit/IOKitKeys.h>
#include <IOKit/IOKitDebug.h>
-#include <IOKit/pwr_mgt/RootDomain.h>
#include <IOKit/pwr_mgt/IOPMinformeeList.h>
-#include <IOKit/IOStatisticsPrivate.h>
-#include <IOKit/IOKitKeysPrivate.h>
#include <IOKit/assert.h>
@@ -50,8 +52,7 @@
extern "C" {
extern void OSlibkernInit (void);
-
-void iokit_post_constructor_init(void) __attribute__((section("__TEXT, initcode")));
+extern void ml_hpet_cfg(uint32_t, uint32_t);
#include <kern/clock.h>
#include <sys/time.h>
@@ -64,7 +65,7 @@
t.tv_nsec = 0;
IOService::waitForService(
IOService::resourceMatching("IORTC"), &t );
-#if defined(__i386__) || defined(__x86_64__)
+#ifdef ppc
IOService::waitForService(
IOService::resourceMatching("IONVRAM"), &t );
#endif
@@ -74,71 +75,34 @@
void IOKitResetTime( void )
{
- clock_sec_t secs;
- clock_usec_t microsecs;
+ uint32_t secs, microsecs;
clock_initialize_calendar();
clock_get_calendar_microtime(&secs, µsecs);
gIOLastWakeTime.tv_sec = secs;
gIOLastWakeTime.tv_usec = microsecs;
-
- IOService::updateConsoleUsers(NULL, kIOMessageSystemHasPoweredOn);
-}
-
-void iokit_post_constructor_init(void)
-{
+}
+
+
+// From <osfmk/kern/debug.c>
+extern int debug_mode;
+
+void StartIOKit( void * p1, void * p2, void * p3, void * p4 )
+{
+ IOPlatformExpertDevice * rootNub;
+ int debugFlags;
IORegistryEntry * root;
OSObject * obj;
-
- root = IORegistryEntry::initialize();
- assert( root );
- IOService::initialize();
- IOCatalogue::initialize();
- IOStatistics::initialize();
- OSKext::initialize();
- IOUserClient::initialize();
- IOMemoryDescriptor::initialize();
- IORootParent::initialize();
-
- // Initializes IOPMinformeeList class-wide shared lock
- 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();
- }
-}
-
-// From <osfmk/kern/debug.c>
-extern int debug_mode;
-
-/*****
- * Pointer into bootstrap KLD segment for functions never used past startup.
- */
-void (*record_startup_extensions_function)(void) = 0;
-
-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);
-
+ extern const char * gIOKernelKmods;
+ OSString * errorString = NULL; // must release
+ OSDictionary * fakeKmods; // must release
+ OSCollectionIterator * kmodIter; // must release
+ OSString * kmodName; // don't release
+
+ if( PE_parse_boot_arg( "io", &debugFlags ))
+ gIOKitDebug = debugFlags;
+
// Check for the log synchronous bit set in io
if (gIOKitDebug & kIOLogSynchronous)
debug_mode = true;
@@ -153,17 +117,84 @@
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());
+ }
+
+ // empty version strings get replaced with current kernel version
+ 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();
+
+ // Initializes IOPMinformeeList class-wide shared lock
+ 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 );
- /* If the bootstrap segment set up a function to record startup
- * extensions, call it now.
+ /* Enter into the catalogue the drivers
+ * provided by BootX.
*/
- if (record_startup_extensions_function) {
- record_startup_extensions_function();
- }
+ gIOCatalogue->recordStartupExtensions();
rootNub->registerService();