]> git.saurik.com Git - apple/xnu.git/blobdiff - libkern/libkern/c++/OSKext.h
xnu-4570.1.46.tar.gz
[apple/xnu.git] / libkern / libkern / c++ / OSKext.h
index c8d5edd0c6756386eb7fad72d54365fc44f7463a..2fc70eb1cae9c19706393d9c7b24872ea3fdcbe2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2008-2016 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
@@ -55,6 +55,13 @@ extern "C" {
 void osdata_kmem_free(void * ptr, unsigned int length);
 void osdata_phys_free(void * ptr, unsigned int length);
 void osdata_vm_deallocate(void * ptr, unsigned int length);
+void osdata_kext_free(void * ptr, unsigned int length);
+void kxld_log_callback(
+    KXLDLogSubsystem    subsystem,
+    KXLDLogLevel        level,
+    const char        * format,
+    va_list             argList,
+    void              * user_data);
 };
 #endif /* XNU_KERNEL_PRIVATE */
 
@@ -95,13 +102,8 @@ kern_return_t is_io_catalog_send_data(
     mach_msg_type_number_t   inDataCount,
     kern_return_t          * result);
 
-void kmod_dump_log(vm_offset_t*, unsigned int);
-
-#if __i386__
-kern_return_t kext_get_kmod_info(
-    kmod_info_array_t      * kmod_list,
-    mach_msg_type_number_t * kmodCount);
-#endif /* __i386__ */
+void kmod_dump_log(vm_offset_t*, unsigned int, boolean_t);
+void *OSKextKextForAddress(const void *addr);
 
 #endif /* XNU_KERNEL_PRIVATE */
 };
@@ -110,6 +112,45 @@ kern_return_t kext_get_kmod_info(
 #if PRAGMA_MARK
 #pragma mark -
 #endif
+
+struct list_head {
+    struct list_head *prev;
+    struct list_head *next;
+};
+
+struct OSKextGrabPgoStruct {
+    bool metadata;
+    uint64_t *pSize;
+    char *pBuffer;
+    uint64_t bufferSize;
+    int err;
+    struct list_head list_head;
+};
+
+#ifndef container_of
+#define container_of(ptr,type,member) ((type*)(((uintptr_t)ptr) - offsetof(type, member)))
+#endif
+/********************************************************************/
+
+#if XNU_KERNEL_PRIVATE
+
+struct OSKextAccount
+{
+    vm_allocation_site_t site;
+    uint32_t            loadTag;
+    OSKext             * kext;
+};
+
+struct OSKextActiveAccount
+{
+    uintptr_t       address;
+    uintptr_t       address_end;
+    OSKextAccount * account;
+};
+typedef struct OSKextActiveAccount OSKextActiveAccount;
+
+#endif /* XNU_KERNEL_PRIVATE */
+
 /*
  * @class OSKext
  */
@@ -127,6 +168,13 @@ class OSKext : public OSObject
     friend class KLDBootstrap;
     friend class OSMetaClass;
 
+    friend int OSKextGrabPgoData(uuid_t uuid,
+                                 uint64_t *pSize,
+                                 char *pBuffer,
+                                 uint64_t bufferSize,
+                                 int wait_for_unload,
+                                 int metadata);
+
 #ifdef XNU_KERNEL_PRIVATE
     friend void OSKextVLog(
         OSKext         * aKext,
@@ -180,14 +228,9 @@ class OSKext : public OSObject
             kern_return_t          * result);
 
     friend void kmod_panic_dump(vm_offset_t*, unsigned int);
-    friend void kmod_dump_log(vm_offset_t*, unsigned int);
+    friend void kmod_dump_log(vm_offset_t*, unsigned int, boolean_t);
     friend void kext_dump_panic_lists(int (*printf_func)(const char * fmt, ...));
-
-#if __i386__
-    friend kern_return_t kext_get_kmod_info(
-        kmod_info_array_t      * kmod_list,
-        mach_msg_type_number_t * kmodCount);
-#endif /* __i386__ */
+    friend void *OSKextKextForAddress(const void *addr);
 
 #endif /* XNU_KERNEL_PRIVATE */
 
@@ -248,6 +291,10 @@ private:
         unsigned int jettisonLinkeditSeg:1;
     } flags;
 
+    struct list_head pendingPgoHead;
+    uuid_t instance_uuid;
+    OSKextAccount * account;
+
 #if PRAGMA_MARK
 /**************************************/
 #pragma mark Private Functions
@@ -288,9 +335,13 @@ private:
         OSData   * booterData);
 
     static OSKext * withPrelinkedInfoDict(
-        OSDictionary * infoDict);
+        OSDictionary * infoDict,
+        bool doCoalesedSlides);
     virtual bool initWithPrelinkedInfoDict(
-        OSDictionary * infoDict);
+        OSDictionary * infoDict,
+        bool doCoalesedSlides);
+
+    static void setAllVMAttributes(void);
 
     static OSKext * withMkext2Info(
         OSDictionary * anInfoDict,
@@ -308,12 +359,14 @@ private:
         bool           externalDataIsMkext = false);
     virtual bool registerIdentifier(void);
 
-    virtual void free(void);
+    virtual void free(void) APPLE_KEXT_OVERRIDE;
 
     static OSReturn removeKext(
         OSKext * aKext,
         bool     terminateServicesAndRemovePersonalitiesFlag = false);
 
+    virtual bool isInExcludeList(void);
+
    /* Mkexts.
     */
     static OSReturn readMkextArchive(
@@ -333,17 +386,6 @@ private:
         uint32_t     compressedSize,
         uint32_t     fullSize);
 
-    static OSReturn readMkext1Archive(
-        OSData   * mkextData,
-        uint32_t * checksumPtr);
-    bool initWithMkext1Info(
-        OSDictionary * anInfoDict,
-        OSData       * executableWrapper,
-        OSData       * mkextData);
-    static OSData * extractMkext1Entry(
-        const void * mkextFileBase,
-        const void * entry);
-
    /* Dependencies.
     */
     virtual bool resolveDependencies(
@@ -389,9 +431,10 @@ private:
     static void recordIdentifierRequest(
         OSString * kextIdentifier);
 
-    virtual OSReturn slidePrelinkedExecutable(void);
+    virtual OSReturn slidePrelinkedExecutable(bool doCoalesedSlides);
     virtual OSReturn loadExecutable(void);
     virtual void     jettisonLinkeditSegment(void);
+    virtual void     jettisonDATASegmentPadding(void);
     static  void     considerDestroyingLinkContext(void);
     virtual OSData * getExecutable(void);
     virtual void     setLinkedExecutable(OSData * anExecutable);
@@ -405,7 +448,7 @@ private:
 
     virtual OSReturn start(bool startDependenciesFlag = true);
     virtual OSReturn stop(void);
-    virtual OSReturn setVMProtections(void);
+    virtual OSReturn setVMAttributes(bool protect, bool wire);
     virtual boolean_t segmentShouldBeWired(kernel_segment_command_t *seg);
     virtual OSReturn validateKextMapping(bool startFlag);
     virtual boolean_t verifySegmentMapping(kernel_segment_command_t *seg);
@@ -436,6 +479,10 @@ private:
     static  OSDictionary * copyLoadedKextInfo(
         OSArray * kextIdentifiers = NULL,
         OSArray * keys = NULL);
+    static  OSDictionary * copyLoadedKextInfoByUUID(
+        OSArray * kextIdentifiers = NULL,
+        OSArray * keys = NULL);
+    static OSData * copyKextUUIDForAddress(OSNumber *address = NULL);
     virtual OSDictionary * copyInfo(OSArray * keys = NULL);
 
    /* Logging to user space.
@@ -481,26 +528,35 @@ private:
 
    /* panic() support.
     */
+public:
+    enum {
+        kPrintKextsLock    = 0x01,
+        kPrintKextsUnslide = 0x02,
+        kPrintKextsTerse   = 0x04
+    };
     static void printKextsInBacktrace(
         vm_offset_t   * addr,
         unsigned int    cnt,
         int          (* printf_func)(const char *fmt, ...),
-        bool            lockFlag);
+        uint32_t        flags);
+private:
+    static OSKextLoadedKextSummary *summaryForAddress(const uintptr_t addr);
+    static void *kextForAddress(const void *addr);
     static boolean_t summaryIsInBacktrace(
         OSKextLoadedKextSummary * summary,
         vm_offset_t             * addr,
         unsigned int              cnt);
     static void printSummary(
         OSKextLoadedKextSummary * summary,
-        int                    (* printf_func)(const char *fmt, ...));
+        int                    (* printf_func)(const char *fmt, ...),
+        uint32_t                  flags);
 
-    static uint32_t saveLoadedKextPanicListTyped(
+    static int saveLoadedKextPanicListTyped(
         const char * prefix,
         int          invertFlag,
         int          libsFlag,
         char       * paniclist,
-        uint32_t     list_size,
-        uint32_t   * list_length_ptr);
+        uint32_t     list_size);
     static void saveLoadedKextPanicList(void);
     void savePanicString(bool isLoading);
     static void printKextPanicLists(int (*printf_func)(const char *fmt, ...));
@@ -509,18 +565,12 @@ private:
     */
     static void updateLoadedKextSummaries(void);
     void updateLoadedKextSummary(OSKextLoadedKextSummary *summary);
+    void updateActiveAccount(OSKextActiveAccount *accountp);
 
     /* C++ Initialization.
      */
     virtual void               setCPPInitialized(bool initialized=true);
 
-#if __i386__
-   /* Backward compatibility for kmod_get_info() MIG call.
-    */
-    static kern_return_t getKmodInfo(
-        kmod_info_array_t      * kmodList,
-        mach_msg_type_number_t * kmodCount);
-#endif /* __i386__ */
 
 
 #if PRAGMA_MARK
@@ -534,6 +584,9 @@ public:
     static OSKext * lookupKextWithIdentifier(OSString * kextIdentifier);
     static OSKext * lookupKextWithLoadTag(OSKextLoadTag aTag);
     static OSKext * lookupKextWithAddress(vm_address_t address);
+    static OSKext * lookupKextWithUUID(uuid_t uuid);
+
+    kernel_section_t *lookupSection(const char *segname, const char*secname);
     
     static bool isKextWithIdentifierLoaded(const char * kextIdentifier);
 
@@ -573,6 +626,12 @@ public:
     static void     setKextdActive(Boolean active = true);
     static void     setDeferredLoadSucceeded(Boolean succeeded = true);
     static void     considerRebuildOfPrelinkedKernel(void);
+    static void     createExcludeListFromBooterData(
+                                            OSDictionary * theDictionary,
+                                            OSCollectionIterator * theIterator);
+    static void     createExcludeListFromPrelinkInfo(OSArray * theInfoArray);
+
+    static bool     isWaitingKextd(void);
 
     virtual bool    setAutounloadEnabled(bool flag);