Loading...
--- xnu/xnu-1504.15.3/iokit/Kernel/IOStartIOKit.cpp
+++ xnu/xnu-1228.12.14/iokit/Kernel/IOStartIOKit.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998-2011 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>
@@ -48,8 +53,6 @@
extern void OSlibkernInit (void);
-void iokit_post_constructor_init(void) __attribute__((section("__TEXT, initcode")));
-
#include <kern/clock.h>
#include <sys/time.h>
@@ -71,8 +74,7 @@
void IOKitResetTime( void )
{
- clock_sec_t secs;
- clock_usec_t microsecs;
+ uint32_t secs, microsecs;
clock_initialize_calendar();
@@ -81,65 +83,29 @@
gIOLastWakeTime.tv_usec = microsecs;
}
-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();
- 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();
- }
-
-}
-
-// 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;
- uint32_t intThreshold;
+ 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_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);
-
- if( PE_parse_boot_argn( "iointthreshold", &intThreshold, sizeof (intThreshold) ))
- gIOInterruptThresholdNS = intThreshold * 1000;
-
// Check for the log synchronous bit set in io
if (gIOKitDebug & kIOLogSynchronous)
debug_mode = true;
-
+
//
// Have to start IOKit environment before we attempt to start
// the C++ runtime environment. At some stage we have to clean up
@@ -150,17 +116,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();