/*
- * Copyright (c) 2008-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2008-2016 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
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 */
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 */
};
#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
*/
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,
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 */
unsigned int jettisonLinkeditSeg:1;
} flags;
+ struct list_head pendingPgoHead;
+ uuid_t instance_uuid;
+ OSKextAccount * account;
+
#if PRAGMA_MARK
/**************************************/
#pragma mark Private Functions
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,
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(
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(
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);
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);
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.
/* 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, ...));
*/
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
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);
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);