]> git.saurik.com Git - apple/xnu.git/blobdiff - libkern/kmod/cplus_start.c
xnu-1699.24.23.tar.gz
[apple/xnu.git] / libkern / kmod / cplus_start.c
index 3bfb641988059991d39135a4e6eaeaa378b22f6c..1a2f3b9a025adba019db981f063e325b5881cc67 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000,2008-2009 Apple Computer, Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
     The linkline must look like this.
         *.o -lkmodc++ kmod_info.o -lkmod
  */
     The linkline must look like this.
         *.o -lkmodc++ kmod_info.o -lkmod
  */
+
+/* The following preprocessor test must match exactly with the architectures
+ * that define the CONFIG_STATIC_CPPINIT config option.
+ */
+#if __i386__
+
 #include <mach/mach_types.h>
 #include <mach/mach_types.h>
+#include <libkern/OSKextLib.h>
 
 asm(".constructors_used = 0");
 asm(".private_extern .constructors_used");
 
 // This global symbols will be defined by CreateInfo script's info.c file.
 extern kmod_start_func_t *_realmain;
 
 asm(".constructors_used = 0");
 asm(".private_extern .constructors_used");
 
 // This global symbols will be defined by CreateInfo script's info.c file.
 extern kmod_start_func_t *_realmain;
+extern kmod_info_t KMOD_INFO_NAME;
 
 // Functions defined in libkern/c++/OSRuntime.cpp
 extern kern_return_t OSRuntimeInitializeCPP(kmod_info_t *ki, void *data);
 
 // Functions defined in libkern/c++/OSRuntime.cpp
 extern kern_return_t OSRuntimeInitializeCPP(kmod_info_t *ki, void *data);
+extern kern_return_t OSRuntimeFinalizeCPP(kmod_info_t *ki, void *data);
 
 
+/*********************************************************************
+*********************************************************************/
 __private_extern__ kern_return_t _start(kmod_info_t *ki, void *data)
 {
 __private_extern__ kern_return_t _start(kmod_info_t *ki, void *data)
 {
-    kern_return_t res = OSRuntimeInitializeCPP(ki, data);
+    kern_return_t result = OSRuntimeInitializeCPP(ki, data);
+
+    if ((result == KERN_SUCCESS) && _realmain) {
+        result = (*_realmain)(ki, data);
 
 
-    if (!res && _realmain)
-        res = (*_realmain)(ki, data);
+       /* If _realmain failed, tear down C++.
+        */
+        if (result != KERN_SUCCESS) {
+            (void)OSRuntimeFinalizeCPP(ki, data);
+        }
+    }
 
 
-    return res;
+    return result;
+}
+
+/*********************************************************************
+*********************************************************************/
+__private_extern__ const char * OSKextGetCurrentIdentifier(void)
+{
+    return KMOD_INFO_NAME.name;
+}
+
+/*********************************************************************
+*********************************************************************/
+__private_extern__ const char * OSKextGetCurrentVersionString(void)
+{
+    return KMOD_INFO_NAME.version;
+}
+
+/*********************************************************************
+*********************************************************************/
+__private_extern__ OSKextLoadTag OSKextGetCurrentLoadTag(void)
+{
+    return (OSKextLoadTag)KMOD_INFO_NAME.id;
 }
 }
+#endif