1*42e22086SApple OSS Distributions /* 2*42e22086SApple OSS Distributions * Copyright (c) 2008-2019 Apple Inc. All rights reserved. 3*42e22086SApple OSS Distributions * 4*42e22086SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*42e22086SApple OSS Distributions * 6*42e22086SApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*42e22086SApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*42e22086SApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*42e22086SApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*42e22086SApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*42e22086SApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*42e22086SApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*42e22086SApple OSS Distributions * terms of an Apple operating system software license agreement. 14*42e22086SApple OSS Distributions * 15*42e22086SApple OSS Distributions * Please obtain a copy of the License at 16*42e22086SApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*42e22086SApple OSS Distributions * 18*42e22086SApple OSS Distributions * The Original Code and all software distributed under the License are 19*42e22086SApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*42e22086SApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*42e22086SApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*42e22086SApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*42e22086SApple OSS Distributions * Please see the License for the specific language governing rights and 24*42e22086SApple OSS Distributions * limitations under the License. 25*42e22086SApple OSS Distributions * 26*42e22086SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*42e22086SApple OSS Distributions */ 28*42e22086SApple OSS Distributions 29*42e22086SApple OSS Distributions #ifndef _LIBKERN_OSKEXT_H 30*42e22086SApple OSS Distributions #define _LIBKERN_OSKEXT_H 31*42e22086SApple OSS Distributions 32*42e22086SApple OSS Distributions extern "C" { 33*42e22086SApple OSS Distributions #include <kern/thread_call.h> 34*42e22086SApple OSS Distributions #include <libkern/OSKextLibPrivate.h> 35*42e22086SApple OSS Distributions #include <libkern/kernel_mach_header.h> 36*42e22086SApple OSS Distributions #include <libkern/kxld.h> 37*42e22086SApple OSS Distributions #include <mach/kmod.h> 38*42e22086SApple OSS Distributions 39*42e22086SApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 40*42e22086SApple OSS Distributions #include <kern/thread_call.h> 41*42e22086SApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */ 42*42e22086SApple OSS Distributions } 43*42e22086SApple OSS Distributions 44*42e22086SApple OSS Distributions 45*42e22086SApple OSS Distributions #include <libkern/OSKextLib.h> 46*42e22086SApple OSS Distributions #include <libkern/OSKextLibPrivate.h> 47*42e22086SApple OSS Distributions #include <libkern/c++/OSObject.h> 48*42e22086SApple OSS Distributions #include <libkern/c++/OSContainers.h> 49*42e22086SApple OSS Distributions 50*42e22086SApple OSS Distributions #include <libkern/c++/OSPtr.h> 51*42e22086SApple OSS Distributions #include <IOKit/IOLocks.h> 52*42e22086SApple OSS Distributions 53*42e22086SApple OSS Distributions /********************************************************************* 54*42e22086SApple OSS Distributions * C functions used for callbacks. 55*42e22086SApple OSS Distributions *********************************************************************/ 56*42e22086SApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 57*42e22086SApple OSS Distributions extern "C" { 58*42e22086SApple OSS Distributions void osdata_kmem_free(void * ptr, unsigned int length); 59*42e22086SApple OSS Distributions void osdata_phys_free(void * ptr, unsigned int length); 60*42e22086SApple OSS Distributions void osdata_vm_deallocate(void * ptr, unsigned int length); 61*42e22086SApple OSS Distributions void osdata_kext_free(void * ptr, unsigned int length); 62*42e22086SApple OSS Distributions void kxld_log_callback( 63*42e22086SApple OSS Distributions KXLDLogSubsystem subsystem, 64*42e22086SApple OSS Distributions KXLDLogLevel level, 65*42e22086SApple OSS Distributions const char * format, 66*42e22086SApple OSS Distributions va_list argList, 67*42e22086SApple OSS Distributions void * user_data); 68*42e22086SApple OSS Distributions }; 69*42e22086SApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */ 70*42e22086SApple OSS Distributions 71*42e22086SApple OSS Distributions /********************************************************************* 72*42e22086SApple OSS Distributions * C Function Prototypes for Friend Declarations. 73*42e22086SApple OSS Distributions *********************************************************************/ 74*42e22086SApple OSS Distributions class OSKext; 75*42e22086SApple OSS Distributions class OSDextStatistics; 76*42e22086SApple OSS Distributions 77*42e22086SApple OSS Distributions extern "C" { 78*42e22086SApple OSS Distributions void OSKextLog( 79*42e22086SApple OSS Distributions OSKext * aKext, 80*42e22086SApple OSS Distributions OSKextLogSpec msgLogSpec, 81*42e22086SApple OSS Distributions const char * format, ...) __printflike(3, 4); 82*42e22086SApple OSS Distributions 83*42e22086SApple OSS Distributions void OSKextVLog( 84*42e22086SApple OSS Distributions OSKext * aKext, 85*42e22086SApple OSS Distributions OSKextLogSpec msgLogSpec, 86*42e22086SApple OSS Distributions const char * format, 87*42e22086SApple OSS Distributions va_list srcArgList) __printflike(3, 0);; 88*42e22086SApple OSS Distributions 89*42e22086SApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 90*42e22086SApple OSS Distributions void OSKextRemoveKextBootstrap(void); 91*42e22086SApple OSS Distributions 92*42e22086SApple OSS Distributions kern_return_t OSRuntimeInitializeCPP( 93*42e22086SApple OSS Distributions OSKext * kext); 94*42e22086SApple OSS Distributions kern_return_t OSRuntimeFinalizeCPP( 95*42e22086SApple OSS Distributions OSKext * kext); 96*42e22086SApple OSS Distributions void OSRuntimeUnloadCPPForSegment( 97*42e22086SApple OSS Distributions kernel_segment_command_t * segment); 98*42e22086SApple OSS Distributions void 99*42e22086SApple OSS Distributions OSRuntimeSignStructors( 100*42e22086SApple OSS Distributions kernel_mach_header_t * header); 101*42e22086SApple OSS Distributions void 102*42e22086SApple OSS Distributions OSRuntimeSignStructorsInFileset( 103*42e22086SApple OSS Distributions kernel_mach_header_t * fileset_header); 104*42e22086SApple OSS Distributions 105*42e22086SApple OSS Distributions kern_return_t is_io_catalog_send_data( 106*42e22086SApple OSS Distributions mach_port_t masterPort, 107*42e22086SApple OSS Distributions uint32_t flag, 108*42e22086SApple OSS Distributions io_buf_ptr_t inData, 109*42e22086SApple OSS Distributions mach_msg_type_number_t inDataCount, 110*42e22086SApple OSS Distributions kern_return_t * result); 111*42e22086SApple OSS Distributions 112*42e22086SApple OSS Distributions void kmod_dump_log(vm_offset_t*, unsigned int, boolean_t); 113*42e22086SApple OSS Distributions void *OSKextKextForAddress(const void *addr); 114*42e22086SApple OSS Distributions 115*42e22086SApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */ 116*42e22086SApple OSS Distributions }; 117*42e22086SApple OSS Distributions 118*42e22086SApple OSS Distributions /********************************************************************/ 119*42e22086SApple OSS Distributions #if PRAGMA_MARK 120*42e22086SApple OSS Distributions #pragma mark - 121*42e22086SApple OSS Distributions #endif 122*42e22086SApple OSS Distributions 123*42e22086SApple OSS Distributions struct list_head { 124*42e22086SApple OSS Distributions struct list_head *prev; 125*42e22086SApple OSS Distributions struct list_head *next; 126*42e22086SApple OSS Distributions }; 127*42e22086SApple OSS Distributions 128*42e22086SApple OSS Distributions struct OSKextGrabPgoStruct { 129*42e22086SApple OSS Distributions bool metadata; 130*42e22086SApple OSS Distributions uint64_t *pSize; 131*42e22086SApple OSS Distributions char *pBuffer; 132*42e22086SApple OSS Distributions uint64_t bufferSize; 133*42e22086SApple OSS Distributions int err; 134*42e22086SApple OSS Distributions struct list_head list_head; 135*42e22086SApple OSS Distributions }; 136*42e22086SApple OSS Distributions 137*42e22086SApple OSS Distributions #ifndef container_of 138*42e22086SApple OSS Distributions #define container_of(ptr, type, member) ((type*)(((uintptr_t)ptr) - offsetof(type, member))) 139*42e22086SApple OSS Distributions #endif 140*42e22086SApple OSS Distributions /********************************************************************/ 141*42e22086SApple OSS Distributions 142*42e22086SApple OSS Distributions #if XNU_KERNEL_PRIVATE 143*42e22086SApple OSS Distributions 144*42e22086SApple OSS Distributions struct OSKextAccount { 145*42e22086SApple OSS Distributions vm_allocation_site_t site; 146*42e22086SApple OSS Distributions 147*42e22086SApple OSS Distributions #if DEVELOPMENT || DEBUG 148*42e22086SApple OSS Distributions struct os_refgrp task_refgrp; 149*42e22086SApple OSS Distributions /* 150*42e22086SApple OSS Distributions * '5' for the "task_" prefix. task_refgrp_name can be entirely dropped 151*42e22086SApple OSS Distributions * once we can directly flag the refgrp to be logged. 152*42e22086SApple OSS Distributions */ 153*42e22086SApple OSS Distributions char task_refgrp_name[5 + KMOD_MAX_NAME]; 154*42e22086SApple OSS Distributions #endif /* DEVELOPMENT || DEBUG */ 155*42e22086SApple OSS Distributions uint32_t loadTag; 156*42e22086SApple OSS Distributions OSKext * kext; 157*42e22086SApple OSS Distributions }; 158*42e22086SApple OSS Distributions 159*42e22086SApple OSS Distributions struct OSKextActiveAccount { 160*42e22086SApple OSS Distributions uintptr_t address; 161*42e22086SApple OSS Distributions uintptr_t address_end; 162*42e22086SApple OSS Distributions OSKextAccount * account; 163*42e22086SApple OSS Distributions }; 164*42e22086SApple OSS Distributions typedef struct OSKextActiveAccount OSKextActiveAccount; 165*42e22086SApple OSS Distributions 166*42e22086SApple OSS Distributions class OSKextSavedMutableSegment : public OSObject { 167*42e22086SApple OSS Distributions OSDeclareDefaultStructors(OSKextSavedMutableSegment); 168*42e22086SApple OSS Distributions public: 169*42e22086SApple OSS Distributions static OSPtr<OSKextSavedMutableSegment> withSegment(kernel_segment_command_t *seg); 170*42e22086SApple OSS Distributions OSReturn restoreContents(kernel_segment_command_t *seg); 171*42e22086SApple OSS Distributions vm_offset_t getVMAddr() const; 172*42e22086SApple OSS Distributions vm_size_t getVMSize() const; 173*42e22086SApple OSS Distributions virtual void free(void) APPLE_KEXT_OVERRIDE; 174*42e22086SApple OSS Distributions private: 175*42e22086SApple OSS Distributions bool initWithSegment(kernel_segment_command_t *seg); 176*42e22086SApple OSS Distributions kernel_segment_command_t *savedSegment; 177*42e22086SApple OSS Distributions vm_offset_t vmaddr; 178*42e22086SApple OSS Distributions vm_size_t vmsize; 179*42e22086SApple OSS Distributions void * data; 180*42e22086SApple OSS Distributions }; 181*42e22086SApple OSS Distributions 182*42e22086SApple OSS Distributions typedef enum { 183*42e22086SApple OSS Distributions kOSDextCrashPolicyNone, 184*42e22086SApple OSS Distributions kOSDextCrashPolicyReboot, 185*42e22086SApple OSS Distributions } OSDextCrashPolicy; 186*42e22086SApple OSS Distributions 187*42e22086SApple OSS Distributions enum { 188*42e22086SApple OSS Distributions kMaxDextCrashesInOneDayDefault = 3, 189*42e22086SApple OSS Distributions }; 190*42e22086SApple OSS Distributions 191*42e22086SApple OSS Distributions class OSDextStatistics : public OSObject { 192*42e22086SApple OSS Distributions OSDeclareDefaultStructors(OSDextStatistics); 193*42e22086SApple OSS Distributions public: 194*42e22086SApple OSS Distributions static OSPtr<OSDextStatistics> create(); 195*42e22086SApple OSS Distributions virtual bool init() APPLE_KEXT_OVERRIDE; 196*42e22086SApple OSS Distributions virtual void free() APPLE_KEXT_OVERRIDE; 197*42e22086SApple OSS Distributions 198*42e22086SApple OSS Distributions OSDextCrashPolicy recordCrash(); 199*42e22086SApple OSS Distributions size_t getCrashCount(); 200*42e22086SApple OSS Distributions 201*42e22086SApple OSS Distributions private: 202*42e22086SApple OSS Distributions OSPtr<OSArray> crashes; 203*42e22086SApple OSS Distributions IOLock * lock; 204*42e22086SApple OSS Distributions }; 205*42e22086SApple OSS Distributions 206*42e22086SApple OSS Distributions __enum_closed_decl(OSKextInitResult, uint8_t, { 207*42e22086SApple OSS Distributions kOSKextInitFailure = 0, 208*42e22086SApple OSS Distributions kOSKextInitialized, 209*42e22086SApple OSS Distributions kOSKextAlreadyExist, 210*42e22086SApple OSS Distributions }); 211*42e22086SApple OSS Distributions 212*42e22086SApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */ 213*42e22086SApple OSS Distributions 214*42e22086SApple OSS Distributions /* 215*42e22086SApple OSS Distributions * @class OSKext 216*42e22086SApple OSS Distributions */ 217*42e22086SApple OSS Distributions /********************************************************************/ 218*42e22086SApple OSS Distributions class OSKext : public OSObject 219*42e22086SApple OSS Distributions { 220*42e22086SApple OSS Distributions OSDeclareDefaultStructors(OSKext); 221*42e22086SApple OSS Distributions 222*42e22086SApple OSS Distributions #if PRAGMA_MARK 223*42e22086SApple OSS Distributions /**************************************/ 224*42e22086SApple OSS Distributions #pragma mark Friend Declarations 225*42e22086SApple OSS Distributions /**************************************/ 226*42e22086SApple OSS Distributions #endif 227*42e22086SApple OSS Distributions friend class IOCatalogue; 228*42e22086SApple OSS Distributions friend class KLDBootstrap; 229*42e22086SApple OSS Distributions friend class OSMetaClass; 230*42e22086SApple OSS Distributions 231*42e22086SApple OSS Distributions friend int OSKextGrabPgoData(uuid_t uuid, 232*42e22086SApple OSS Distributions uint64_t *pSize, 233*42e22086SApple OSS Distributions char *pBuffer, 234*42e22086SApple OSS Distributions uint64_t bufferSize, 235*42e22086SApple OSS Distributions int wait_for_unload, 236*42e22086SApple OSS Distributions int metadata); 237*42e22086SApple OSS Distributions 238*42e22086SApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 239*42e22086SApple OSS Distributions friend void OSKextVLog( 240*42e22086SApple OSS Distributions OSKext * aKext, 241*42e22086SApple OSS Distributions OSKextLogSpec msgLogSpec, 242*42e22086SApple OSS Distributions const char * format, 243*42e22086SApple OSS Distributions va_list srcArgList) __printflike(3, 0); 244*42e22086SApple OSS Distributions 245*42e22086SApple OSS Distributions friend void OSKextRemoveKextBootstrap(void); 246*42e22086SApple OSS Distributions friend OSReturn OSKextUnloadKextWithLoadTag(uint32_t); 247*42e22086SApple OSS Distributions 248*42e22086SApple OSS Distributions friend kern_return_t kext_request( 249*42e22086SApple OSS Distributions host_priv_t hostPriv, 250*42e22086SApple OSS Distributions /* in only */ uint32_t clientLogSpec, 251*42e22086SApple OSS Distributions /* in only */ vm_offset_t requestIn, 252*42e22086SApple OSS Distributions /* in only */ mach_msg_type_number_t requestLengthIn, 253*42e22086SApple OSS Distributions /* out only */ vm_offset_t * responseOut, 254*42e22086SApple OSS Distributions /* out only */ mach_msg_type_number_t * responseLengthOut, 255*42e22086SApple OSS Distributions /* out only */ vm_offset_t * logDataOut, 256*42e22086SApple OSS Distributions /* out only */ mach_msg_type_number_t * logDataLengthOut, 257*42e22086SApple OSS Distributions /* out only */ kern_return_t * op_result); 258*42e22086SApple OSS Distributions 259*42e22086SApple OSS Distributions friend kxld_addr_t kern_allocate( 260*42e22086SApple OSS Distributions u_long size, 261*42e22086SApple OSS Distributions KXLDAllocateFlags * flags, 262*42e22086SApple OSS Distributions void * user_data); 263*42e22086SApple OSS Distributions 264*42e22086SApple OSS Distributions friend void kxld_log_shim( 265*42e22086SApple OSS Distributions KXLDLogSubsystem subsystem, 266*42e22086SApple OSS Distributions KXLDLogLevel level, 267*42e22086SApple OSS Distributions const char * format, 268*42e22086SApple OSS Distributions va_list argList, 269*42e22086SApple OSS Distributions void * user_data); 270*42e22086SApple OSS Distributions 271*42e22086SApple OSS Distributions friend void _OSKextConsiderUnloads( 272*42e22086SApple OSS Distributions __unused thread_call_param_t p0, 273*42e22086SApple OSS Distributions __unused thread_call_param_t p1); 274*42e22086SApple OSS Distributions 275*42e22086SApple OSS Distributions friend kern_return_t OSRuntimeInitializeCPP( 276*42e22086SApple OSS Distributions OSKext * kext); 277*42e22086SApple OSS Distributions friend kern_return_t OSRuntimeFinalizeCPP( 278*42e22086SApple OSS Distributions OSKext * kext); 279*42e22086SApple OSS Distributions friend void OSRuntimeUnloadCPPForSegment( 280*42e22086SApple OSS Distributions kernel_segment_command_t * segment); 281*42e22086SApple OSS Distributions 282*42e22086SApple OSS Distributions friend kern_return_t is_io_catalog_send_data( 283*42e22086SApple OSS Distributions mach_port_t masterPort, 284*42e22086SApple OSS Distributions uint32_t flag, 285*42e22086SApple OSS Distributions io_buf_ptr_t inData, 286*42e22086SApple OSS Distributions mach_msg_type_number_t inDataCount, 287*42e22086SApple OSS Distributions kern_return_t * result); 288*42e22086SApple OSS Distributions 289*42e22086SApple OSS Distributions friend void kmod_panic_dump(vm_offset_t*, unsigned int); 290*42e22086SApple OSS Distributions friend void kmod_dump_log(vm_offset_t*, unsigned int, boolean_t); 291*42e22086SApple OSS Distributions friend void kext_dump_panic_lists(int (*printf_func)(const char * fmt, ...)); 292*42e22086SApple OSS Distributions friend void *OSKextKextForAddress(const void *addr); 293*42e22086SApple OSS Distributions 294*42e22086SApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */ 295*42e22086SApple OSS Distributions 296*42e22086SApple OSS Distributions private: 297*42e22086SApple OSS Distributions 298*42e22086SApple OSS Distributions /************************* 299*42e22086SApple OSS Distributions * Instance variables 300*42e22086SApple OSS Distributions *************************/ 301*42e22086SApple OSS Distributions OSPtr<OSDictionary> infoDict; 302*42e22086SApple OSS Distributions 303*42e22086SApple OSS Distributions OSPtr<const OSSymbol> bundleID; 304*42e22086SApple OSS Distributions OSPtr<OSString> path; // not necessarily correct :-/ 305*42e22086SApple OSS Distributions OSPtr<OSString> executableRelPath;// relative to bundle 306*42e22086SApple OSS Distributions OSPtr<OSString> userExecutableRelPath;// relative to bundle 307*42e22086SApple OSS Distributions 308*42e22086SApple OSS Distributions OSKextVersion version; // parsed 309*42e22086SApple OSS Distributions OSKextVersion compatibleVersion;// parsed 310*42e22086SApple OSS Distributions 311*42e22086SApple OSS Distributions /* These fields are required for tracking loaded kexts and 312*42e22086SApple OSS Distributions * will always have values for a loaded kext. 313*42e22086SApple OSS Distributions */ 314*42e22086SApple OSS Distributions OSKextLoadTag loadTag; // 'id' from old kmod_info; 315*42e22086SApple OSS Distributions // kOSKextInvalidLoadTag invalid 316*42e22086SApple OSS Distributions kmod_info_t * kmod_info; // address into linkedExec./alloced for interface 317*42e22086SApple OSS Distributions 318*42e22086SApple OSS Distributions OSPtr<OSArray> dependencies; // kernel resource does not have any; 319*42e22086SApple OSS Distributions // links directly to kernel 320*42e22086SApple OSS Distributions 321*42e22086SApple OSS Distributions /* Only real kexts have these; interface kexts do not. 322*42e22086SApple OSS Distributions */ 323*42e22086SApple OSS Distributions OSPtr<OSData> linkedExecutable; 324*42e22086SApple OSS Distributions OSPtr<OSSet> metaClasses; // for C++/OSMetaClass kexts 325*42e22086SApple OSS Distributions 326*42e22086SApple OSS Distributions /* Only interface kexts have these; non-interface kexts can get at them 327*42e22086SApple OSS Distributions * in the linked Executable. 328*42e22086SApple OSS Distributions */ 329*42e22086SApple OSS Distributions OSPtr<OSData> interfaceUUID; 330*42e22086SApple OSS Distributions OSPtr<OSData> driverKitUUID; 331*42e22086SApple OSS Distributions 332*42e22086SApple OSS Distributions struct { 333*42e22086SApple OSS Distributions unsigned int loggingEnabled:1; 334*42e22086SApple OSS Distributions 335*42e22086SApple OSS Distributions unsigned int hasAllDependencies:1; 336*42e22086SApple OSS Distributions unsigned int hasBleedthrough:1; 337*42e22086SApple OSS Distributions 338*42e22086SApple OSS Distributions unsigned int interface:1; 339*42e22086SApple OSS Distributions unsigned int kernelComponent:1; 340*42e22086SApple OSS Distributions unsigned int prelinked:1; 341*42e22086SApple OSS Distributions unsigned int builtin:1; 342*42e22086SApple OSS Distributions unsigned int loaded:1; 343*42e22086SApple OSS Distributions unsigned int dtraceInitialized:1; 344*42e22086SApple OSS Distributions unsigned int starting:1; 345*42e22086SApple OSS Distributions unsigned int started:1; 346*42e22086SApple OSS Distributions unsigned int stopping:1; 347*42e22086SApple OSS Distributions unsigned int unloading:1; 348*42e22086SApple OSS Distributions unsigned int resetSegmentsFromVnode:1; 349*42e22086SApple OSS Distributions 350*42e22086SApple OSS Distributions unsigned int requireExplicitLoad:1; 351*42e22086SApple OSS Distributions unsigned int autounloadEnabled:1; 352*42e22086SApple OSS Distributions unsigned int delayAutounload:1; // for development 353*42e22086SApple OSS Distributions 354*42e22086SApple OSS Distributions unsigned int CPPInitialized:1; 355*42e22086SApple OSS Distributions unsigned int jettisonLinkeditSeg:1; 356*42e22086SApple OSS Distributions unsigned int resetSegmentsFromImmutableCopy:1; 357*42e22086SApple OSS Distributions unsigned int unloadUnsupported:1; 358*42e22086SApple OSS Distributions unsigned int dextToReplace:1; 359*42e22086SApple OSS Distributions } flags; 360*42e22086SApple OSS Distributions 361*42e22086SApple OSS Distributions uint32_t matchingRefCount; 362*42e22086SApple OSS Distributions kc_kind_t kc_type; 363*42e22086SApple OSS Distributions 364*42e22086SApple OSS Distributions struct list_head pendingPgoHead; 365*42e22086SApple OSS Distributions uuid_t instance_uuid; 366*42e22086SApple OSS Distributions OSKextAccount * account; 367*42e22086SApple OSS Distributions uint32_t builtinKmodIdx; 368*42e22086SApple OSS Distributions OSPtr<OSArray> savedMutableSegments; 369*42e22086SApple OSS Distributions OSPtr<OSDextStatistics> dextStatistics; 370*42e22086SApple OSS Distributions OSPtr<OSData> dextUniqueID; 371*42e22086SApple OSS Distributions uint32_t dextLaunchedCount; 372*42e22086SApple OSS Distributions 373*42e22086SApple OSS Distributions #if PRAGMA_MARK 374*42e22086SApple OSS Distributions /**************************************/ 375*42e22086SApple OSS Distributions #pragma mark Private Functions 376*42e22086SApple OSS Distributions /**************************************/ 377*42e22086SApple OSS Distributions #endif 378*42e22086SApple OSS Distributions 379*42e22086SApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 380*42e22086SApple OSS Distributions /* Startup/shutdown phases. 381*42e22086SApple OSS Distributions */ 382*42e22086SApple OSS Distributions public: 383*42e22086SApple OSS Distributions static void initialize(void); 384*42e22086SApple OSS Distributions static OSPtr<OSDictionary> copyKexts(void); 385*42e22086SApple OSS Distributions static OSReturn removeKextBootstrap(void); 386*42e22086SApple OSS Distributions static void willShutdown(void);// called by IOPMrootDomain on shutdown 387*42e22086SApple OSS Distributions static void willUserspaceReboot(void); 388*42e22086SApple OSS Distributions static void resetAfterUserspaceReboot(void); 389*42e22086SApple OSS Distributions static void reportOSMetaClassInstances( 390*42e22086SApple OSS Distributions const char * kextIdentifier, 391*42e22086SApple OSS Distributions OSKextLogSpec msgLogSpec); 392*42e22086SApple OSS Distributions static void OSKextLogDriverKitInfoLoad(OSKext *kext); 393*42e22086SApple OSS Distributions static bool iokitDaemonAvailable(void); 394*42e22086SApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */ 395*42e22086SApple OSS Distributions 396*42e22086SApple OSS Distributions private: 397*42e22086SApple OSS Distributions /* Called by power management at sleep/shutdown. 398*42e22086SApple OSS Distributions */ 399*42e22086SApple OSS Distributions static bool setLoadEnabled(bool flag); 400*42e22086SApple OSS Distributions static bool setUnloadEnabled(bool flag); 401*42e22086SApple OSS Distributions static bool setAutounloadsEnabled(bool flag); 402*42e22086SApple OSS Distributions static bool setKernelRequestsEnabled(bool flag); 403*42e22086SApple OSS Distributions 404*42e22086SApple OSS Distributions // all getters subject to race condition, caller beware 405*42e22086SApple OSS Distributions static bool getLoadEnabled(void); 406*42e22086SApple OSS Distributions static bool getUnloadEnabled(void); 407*42e22086SApple OSS Distributions static bool getAutounloadEnabled(void); 408*42e22086SApple OSS Distributions static bool getKernelRequestsEnabled(void); 409*42e22086SApple OSS Distributions 410*42e22086SApple OSS Distributions /* Instance life cycle. 411*42e22086SApple OSS Distributions */ 412*42e22086SApple OSS Distributions static OSData *parseDextUniqueID( 413*42e22086SApple OSS Distributions OSDictionary * anInfoDict, 414*42e22086SApple OSS Distributions const char *dextIDCS); 415*42e22086SApple OSS Distributions static void setDextUniqueIDInPersonalities( 416*42e22086SApple OSS Distributions OSDictionary * anInfoDict, 417*42e22086SApple OSS Distributions OSData * dextUniqueID); 418*42e22086SApple OSS Distributions 419*42e22086SApple OSS Distributions static OSPtr<OSKext> withBooterData( 420*42e22086SApple OSS Distributions OSString * deviceTreeName, 421*42e22086SApple OSS Distributions OSData * booterData); 422*42e22086SApple OSS Distributions virtual bool initWithBooterData( 423*42e22086SApple OSS Distributions OSString * deviceTreeName, 424*42e22086SApple OSS Distributions OSData * booterData); 425*42e22086SApple OSS Distributions 426*42e22086SApple OSS Distributions static OSPtr<OSKext> withPrelinkedInfoDict( 427*42e22086SApple OSS Distributions OSDictionary * infoDict, 428*42e22086SApple OSS Distributions bool doCoalesedSlides, kc_kind_t type); 429*42e22086SApple OSS Distributions virtual bool initWithPrelinkedInfoDict( 430*42e22086SApple OSS Distributions OSDictionary * infoDict, 431*42e22086SApple OSS Distributions bool doCoalesedSlides, kc_kind_t type); 432*42e22086SApple OSS Distributions static OSSharedPtr<OSKext> withCodelessInfo( 433*42e22086SApple OSS Distributions OSDictionary * infoDict, OSKextInitResult *result); 434*42e22086SApple OSS Distributions 435*42e22086SApple OSS Distributions virtual OSKextInitResult initWithCodelessInfo( 436*42e22086SApple OSS Distributions OSDictionary * infoDict); 437*42e22086SApple OSS Distributions 438*42e22086SApple OSS Distributions static void setAllVMAttributes(void); 439*42e22086SApple OSS Distributions 440*42e22086SApple OSS Distributions virtual bool setInfoDictionaryAndPath( 441*42e22086SApple OSS Distributions OSDictionary * aDictionary, 442*42e22086SApple OSS Distributions OSString * aPath); 443*42e22086SApple OSS Distributions virtual bool setExecutable( 444*42e22086SApple OSS Distributions OSData * anExecutable, 445*42e22086SApple OSS Distributions OSData * externalData = NULL, 446*42e22086SApple OSS Distributions bool externalDataIsMkext = false); 447*42e22086SApple OSS Distributions virtual OSKextInitResult registerIdentifier(void); 448*42e22086SApple OSS Distributions 449*42e22086SApple OSS Distributions virtual void free(void) APPLE_KEXT_OVERRIDE; 450*42e22086SApple OSS Distributions 451*42e22086SApple OSS Distributions static OSReturn removeKext( 452*42e22086SApple OSS Distributions OSKext * aKext, 453*42e22086SApple OSS Distributions bool terminateServicesAndRemovePersonalitiesFlag = false); 454*42e22086SApple OSS Distributions 455*42e22086SApple OSS Distributions virtual bool isInExcludeList(void); 456*42e22086SApple OSS Distributions virtual bool isLoadable(void); 457*42e22086SApple OSS Distributions 458*42e22086SApple OSS Distributions /* Mkexts. 459*42e22086SApple OSS Distributions */ 460*42e22086SApple OSS Distributions #if CONFIG_KXLD 461*42e22086SApple OSS Distributions static OSPtr<OSKext> withMkext2Info( 462*42e22086SApple OSS Distributions OSDictionary * anInfoDict, 463*42e22086SApple OSS Distributions OSData * mkextData); 464*42e22086SApple OSS Distributions virtual bool initWithMkext2Info( 465*42e22086SApple OSS Distributions OSDictionary * anInfoDict, 466*42e22086SApple OSS Distributions OSData * mkextData); 467*42e22086SApple OSS Distributions 468*42e22086SApple OSS Distributions static OSReturn readMkextArchive( 469*42e22086SApple OSS Distributions OSData * mkextData, 470*42e22086SApple OSS Distributions uint32_t * checksumPtr = NULL); 471*42e22086SApple OSS Distributions static OSReturn readMkext2Archive( 472*42e22086SApple OSS Distributions OSData * mkextData, 473*42e22086SApple OSS Distributions OSDictionary ** mkextPlistOut, 474*42e22086SApple OSS Distributions uint32_t * checksumPtr = NULL); 475*42e22086SApple OSS Distributions 476*42e22086SApple OSS Distributions static OSReturn readMkext2Archive( 477*42e22086SApple OSS Distributions OSData * mkextData, 478*42e22086SApple OSS Distributions OSSharedPtr<OSDictionary> &mkextPlistOut, 479*42e22086SApple OSS Distributions uint32_t * checksumPtr = NULL); 480*42e22086SApple OSS Distributions 481*42e22086SApple OSS Distributions virtual OSPtr<OSData> createMkext2FileEntry( 482*42e22086SApple OSS Distributions OSData * mkextData, 483*42e22086SApple OSS Distributions OSNumber * offsetNum, 484*42e22086SApple OSS Distributions const char * entryName); 485*42e22086SApple OSS Distributions virtual OSPtr<OSData> extractMkext2FileData( 486*42e22086SApple OSS Distributions UInt8 * data, 487*42e22086SApple OSS Distributions const char * name, 488*42e22086SApple OSS Distributions uint32_t compressedSize, 489*42e22086SApple OSS Distributions uint32_t fullSize); 490*42e22086SApple OSS Distributions #endif // CONFIG_KXLD 491*42e22086SApple OSS Distributions 492*42e22086SApple OSS Distributions /* Dependencies. 493*42e22086SApple OSS Distributions */ 494*42e22086SApple OSS Distributions virtual bool resolveDependencies( 495*42e22086SApple OSS Distributions OSArray * loopStack = NULL); // priv/prot 496*42e22086SApple OSS Distributions virtual bool addBleedthroughDependencies(OSArray * anArray); 497*42e22086SApple OSS Distributions virtual bool flushDependencies(bool forceFlag = false); // priv/prot 498*42e22086SApple OSS Distributions virtual uint32_t getNumDependencies(void); 499*42e22086SApple OSS Distributions virtual OSArray * getDependencies(void); 500*42e22086SApple OSS Distributions 501*42e22086SApple OSS Distributions /* User-space requests (load/generic). 502*42e22086SApple OSS Distributions */ 503*42e22086SApple OSS Distributions static OSReturn loadFromMkext( 504*42e22086SApple OSS Distributions OSKextLogSpec clientLogSpec, 505*42e22086SApple OSS Distributions char * mkextBuffer, 506*42e22086SApple OSS Distributions uint32_t mkextBufferLength, 507*42e22086SApple OSS Distributions char ** logInfoOut, 508*42e22086SApple OSS Distributions uint32_t * logInfoLengthOut); 509*42e22086SApple OSS Distributions static OSReturn handleRequest( 510*42e22086SApple OSS Distributions host_priv_t hostPriv, 511*42e22086SApple OSS Distributions OSKextLogSpec clientLogSpec, 512*42e22086SApple OSS Distributions char * requestBuffer, 513*42e22086SApple OSS Distributions uint32_t requestLength, 514*42e22086SApple OSS Distributions char ** responseOut, 515*42e22086SApple OSS Distributions uint32_t * responseLengthOut, 516*42e22086SApple OSS Distributions char ** logInfoOut, 517*42e22086SApple OSS Distributions uint32_t * logInfoLengthOut); 518*42e22086SApple OSS Distributions static OSReturn loadCodelessKext( 519*42e22086SApple OSS Distributions OSString * kextIdentifier, 520*42e22086SApple OSS Distributions OSDictionary * requestDict); 521*42e22086SApple OSS Distributions static OSReturn serializeLogInfo( 522*42e22086SApple OSS Distributions OSArray * logInfoArray, 523*42e22086SApple OSS Distributions char ** logInfoOut, 524*42e22086SApple OSS Distributions uint32_t * logInfoLengthOut); 525*42e22086SApple OSS Distributions 526*42e22086SApple OSS Distributions /* Loading. 527*42e22086SApple OSS Distributions */ 528*42e22086SApple OSS Distributions static bool addKextsFromKextCollection(kernel_mach_header_t *mh, 529*42e22086SApple OSS Distributions OSDictionary *infoDict, const char *text_seg_name, 530*42e22086SApple OSS Distributions OSData **kcUUID, kc_kind_t type); 531*42e22086SApple OSS Distributions 532*42e22086SApple OSS Distributions static bool addKextsFromKextCollection(kernel_mach_header_t *mh, 533*42e22086SApple OSS Distributions OSDictionary *infoDict, const char *text_seg_name, 534*42e22086SApple OSS Distributions OSSharedPtr<OSData> &kcUUID, kc_kind_t type); 535*42e22086SApple OSS Distributions 536*42e22086SApple OSS Distributions static bool registerDeferredKextCollection(kernel_mach_header_t *mh, 537*42e22086SApple OSS Distributions OSSharedPtr<OSObject> &parsedXML, kc_kind_t type); 538*42e22086SApple OSS Distributions static OSSharedPtr<OSObject> consumeDeferredKextCollection(kc_kind_t type); 539*42e22086SApple OSS Distributions 540*42e22086SApple OSS Distributions virtual OSReturn load( 541*42e22086SApple OSS Distributions OSKextExcludeLevel startOpt = kOSKextExcludeNone, 542*42e22086SApple OSS Distributions OSKextExcludeLevel startMatchingOpt = kOSKextExcludeAll, 543*42e22086SApple OSS Distributions OSArray * personalityNames = NULL);// priv/prot 544*42e22086SApple OSS Distributions virtual OSReturn unload(void); 545*42e22086SApple OSS Distributions static OSReturn queueKextNotification( 546*42e22086SApple OSS Distributions const char * notificationName, 547*42e22086SApple OSS Distributions OSString * kextIdentifier); 548*42e22086SApple OSS Distributions 549*42e22086SApple OSS Distributions static void recordIdentifierRequest( 550*42e22086SApple OSS Distributions OSString * kextIdentifier); 551*42e22086SApple OSS Distributions 552*42e22086SApple OSS Distributions virtual OSReturn slidePrelinkedExecutable(bool doCoalesedSlides); 553*42e22086SApple OSS Distributions virtual OSReturn loadExecutable(void); 554*42e22086SApple OSS Distributions virtual void jettisonLinkeditSegment(void); 555*42e22086SApple OSS Distributions virtual void jettisonDATASegmentPadding(void); 556*42e22086SApple OSS Distributions static void considerDestroyingLinkContext(void); 557*42e22086SApple OSS Distributions virtual OSData * getExecutable(void); 558*42e22086SApple OSS Distributions virtual void setLinkedExecutable(OSData * anExecutable); 559*42e22086SApple OSS Distributions 560*42e22086SApple OSS Distributions #if CONFIG_DTRACE 561*42e22086SApple OSS Distributions friend void OSKextRegisterKextsWithDTrace(void); 562*42e22086SApple OSS Distributions static void registerKextsWithDTrace(void); 563*42e22086SApple OSS Distributions virtual void registerWithDTrace(void); 564*42e22086SApple OSS Distributions virtual void unregisterWithDTrace(void); 565*42e22086SApple OSS Distributions #endif /* CONFIG_DTRACE */ 566*42e22086SApple OSS Distributions 567*42e22086SApple OSS Distributions virtual OSReturn start(bool startDependenciesFlag = true); 568*42e22086SApple OSS Distributions virtual OSReturn stop(void); 569*42e22086SApple OSS Distributions virtual OSReturn setVMAttributes(bool protect, bool wire); 570*42e22086SApple OSS Distributions virtual boolean_t segmentShouldBeWired(kernel_segment_command_t *seg); 571*42e22086SApple OSS Distributions virtual OSReturn validateKextMapping(bool startFlag); 572*42e22086SApple OSS Distributions virtual boolean_t verifySegmentMapping(kernel_segment_command_t *seg); 573*42e22086SApple OSS Distributions 574*42e22086SApple OSS Distributions static OSPtr<OSArray> copyAllKextPersonalities( 575*42e22086SApple OSS Distributions bool filterSafeBootFlag = false); 576*42e22086SApple OSS Distributions 577*42e22086SApple OSS Distributions static void setPrelinkedPersonalities(OSArray * personalitiesArray); 578*42e22086SApple OSS Distributions 579*42e22086SApple OSS Distributions static void sendAllKextPersonalitiesToCatalog( 580*42e22086SApple OSS Distributions bool startMatching = false); 581*42e22086SApple OSS Distributions virtual OSReturn sendPersonalitiesToCatalog( 582*42e22086SApple OSS Distributions bool startMatching = false, 583*42e22086SApple OSS Distributions OSArray * personalityNames = NULL); 584*42e22086SApple OSS Distributions 585*42e22086SApple OSS Distributions static bool canUnloadKextWithIdentifier( 586*42e22086SApple OSS Distributions OSString * kextIdentifier, 587*42e22086SApple OSS Distributions bool checkClassesFlag = true); 588*42e22086SApple OSS Distributions 589*42e22086SApple OSS Distributions static OSReturn autounloadKext(OSKext * aKext); 590*42e22086SApple OSS Distributions 591*42e22086SApple OSS Distributions /* Sync with user space. 592*42e22086SApple OSS Distributions */ 593*42e22086SApple OSS Distributions static OSReturn pingIOKitDaemon(void); 594*42e22086SApple OSS Distributions 595*42e22086SApple OSS Distributions /* Getting info about loaded kexts (kextstat). 596*42e22086SApple OSS Distributions */ 597*42e22086SApple OSS Distributions static OSPtr<OSDictionary> copyLoadedKextInfo( 598*42e22086SApple OSS Distributions OSArray * kextIdentifiers = NULL, 599*42e22086SApple OSS Distributions OSArray * keys = NULL); 600*42e22086SApple OSS Distributions static OSPtr<OSDictionary> copyLoadedKextInfoByUUID( 601*42e22086SApple OSS Distributions OSArray * kextIdentifiers = NULL, 602*42e22086SApple OSS Distributions OSArray * keys = NULL); 603*42e22086SApple OSS Distributions static OSPtr<OSDictionary> copyKextCollectionInfo( 604*42e22086SApple OSS Distributions OSDictionary *requestDict, 605*42e22086SApple OSS Distributions OSArray *infoKeys = NULL); 606*42e22086SApple OSS Distributions static OSPtr<OSData> copyKextUUIDForAddress(OSNumber *address = NULL); 607*42e22086SApple OSS Distributions static OSPtr<OSArray> copyDextsInfo( 608*42e22086SApple OSS Distributions OSArray * kextIdentifiers = NULL, 609*42e22086SApple OSS Distributions OSArray * keys = NULL); 610*42e22086SApple OSS Distributions virtual OSPtr<OSDictionary> copyInfo(OSArray * keys = NULL); 611*42e22086SApple OSS Distributions 612*42e22086SApple OSS Distributions /* Logging to user space. 613*42e22086SApple OSS Distributions */ 614*42e22086SApple OSS Distributions static OSKextLogSpec setUserSpaceLogFilter( 615*42e22086SApple OSS Distributions OSKextLogSpec userLogSpec, 616*42e22086SApple OSS Distributions bool captureFlag = false); 617*42e22086SApple OSS Distributions static OSPtr<OSArray> clearUserSpaceLogFilter(void); 618*42e22086SApple OSS Distributions static OSKextLogSpec getUserSpaceLogFilter(void); 619*42e22086SApple OSS Distributions 620*42e22086SApple OSS Distributions /* OSMetaClasses defined by kext. 621*42e22086SApple OSS Distributions */ 622*42e22086SApple OSS Distributions virtual OSReturn addClass( 623*42e22086SApple OSS Distributions OSMetaClass * aClass, 624*42e22086SApple OSS Distributions uint32_t numClasses); 625*42e22086SApple OSS Distributions virtual OSReturn removeClass( 626*42e22086SApple OSS Distributions OSMetaClass * aClass); 627*42e22086SApple OSS Distributions virtual bool hasOSMetaClassInstances(void); 628*42e22086SApple OSS Distributions virtual OSSet * getMetaClasses(void); 629*42e22086SApple OSS Distributions 630*42e22086SApple OSS Distributions virtual void reportOSMetaClassInstances( 631*42e22086SApple OSS Distributions OSKextLogSpec msgLogSpec); 632*42e22086SApple OSS Distributions 633*42e22086SApple OSS Distributions /* Resource requests and other callback stuff. 634*42e22086SApple OSS Distributions */ 635*42e22086SApple OSS Distributions static OSReturn loadFileSetKexts(OSDictionary * requestDict); 636*42e22086SApple OSS Distributions 637*42e22086SApple OSS Distributions static OSReturn loadKCFileSet(const char *filepath, kc_kind_t type); 638*42e22086SApple OSS Distributions 639*42e22086SApple OSS Distributions #if defined(__x86_64__) || defined(__i386__) 640*42e22086SApple OSS Distributions static OSReturn mapKCFileSet( 641*42e22086SApple OSS Distributions void *control, 642*42e22086SApple OSS Distributions vm_size_t fsize, 643*42e22086SApple OSS Distributions kernel_mach_header_t **mh, 644*42e22086SApple OSS Distributions off_t file_offset, 645*42e22086SApple OSS Distributions uintptr_t *slide, 646*42e22086SApple OSS Distributions bool pageable, 647*42e22086SApple OSS Distributions void *map_entry_buffer); 648*42e22086SApple OSS Distributions static OSReturn protectKCFileSet( 649*42e22086SApple OSS Distributions kernel_mach_header_t *mh, 650*42e22086SApple OSS Distributions kc_kind_t type); 651*42e22086SApple OSS Distributions static OSReturn mapKCTextSegment( 652*42e22086SApple OSS Distributions void *control, 653*42e22086SApple OSS Distributions kernel_mach_header_t **mhp, 654*42e22086SApple OSS Distributions off_t file_offset, 655*42e22086SApple OSS Distributions uintptr_t *slide, 656*42e22086SApple OSS Distributions void *map_entry_list); 657*42e22086SApple OSS Distributions static void freeKCFileSetcontrol(void); 658*42e22086SApple OSS Distributions OSReturn resetKCFileSetSegments(void); 659*42e22086SApple OSS Distributions #endif //(__x86_64__) || defined(__i386__) 660*42e22086SApple OSS Distributions 661*42e22086SApple OSS Distributions static void jettisonFileSetLinkeditSegment(kernel_mach_header_t *mh); 662*42e22086SApple OSS Distributions static OSReturn validateKCFileSetUUID( 663*42e22086SApple OSS Distributions OSDictionary *infoDict, 664*42e22086SApple OSS Distributions kc_kind_t type); 665*42e22086SApple OSS Distributions 666*42e22086SApple OSS Distributions static OSReturn validateKCUUIDfromPrelinkInfo( 667*42e22086SApple OSS Distributions uuid_t *loaded_kcuuid, 668*42e22086SApple OSS Distributions kc_kind_t type, 669*42e22086SApple OSS Distributions OSDictionary *infoDict, 670*42e22086SApple OSS Distributions const char *uuid_key); 671*42e22086SApple OSS Distributions 672*42e22086SApple OSS Distributions static OSReturn dispatchResource(OSDictionary * requestDict); 673*42e22086SApple OSS Distributions 674*42e22086SApple OSS Distributions static OSReturn setMissingAuxKCBundles(OSDictionary * requestDict); 675*42e22086SApple OSS Distributions 676*42e22086SApple OSS Distributions static OSReturn setAuxKCBundleAvailable(OSString *kextIdentifier, 677*42e22086SApple OSS Distributions OSDictionary *requestDict); 678*42e22086SApple OSS Distributions 679*42e22086SApple OSS Distributions static OSReturn dequeueCallbackForRequestTag( 680*42e22086SApple OSS Distributions OSKextRequestTag requestTag, 681*42e22086SApple OSS Distributions LIBKERN_RETURNS_RETAINED OSDictionary ** callbackRecordOut); 682*42e22086SApple OSS Distributions static OSReturn dequeueCallbackForRequestTag( 683*42e22086SApple OSS Distributions OSNumber * requestTagNum, 684*42e22086SApple OSS Distributions LIBKERN_RETURNS_RETAINED OSDictionary ** callbackRecordOut); 685*42e22086SApple OSS Distributions 686*42e22086SApple OSS Distributions static OSReturn dequeueCallbackForRequestTag( 687*42e22086SApple OSS Distributions OSKextRequestTag requestTag, 688*42e22086SApple OSS Distributions OSSharedPtr<OSDictionary> &callbackRecordOut); 689*42e22086SApple OSS Distributions static OSReturn dequeueCallbackForRequestTag( 690*42e22086SApple OSS Distributions OSNumber * requestTagNum, 691*42e22086SApple OSS Distributions OSSharedPtr<OSDictionary> &callbackRecordOut); 692*42e22086SApple OSS Distributions 693*42e22086SApple OSS Distributions static void invokeRequestCallback( 694*42e22086SApple OSS Distributions OSDictionary * callbackRecord, 695*42e22086SApple OSS Distributions OSReturn requestResult); 696*42e22086SApple OSS Distributions virtual void invokeOrCancelRequestCallbacks( 697*42e22086SApple OSS Distributions OSReturn callbackResult, 698*42e22086SApple OSS Distributions bool invokeFlag = true); 699*42e22086SApple OSS Distributions virtual uint32_t countRequestCallbacks(void); 700*42e22086SApple OSS Distributions OSReturn resetMutableSegments(void); 701*42e22086SApple OSS Distributions virtual OSData * getDextUniqueID(void); 702*42e22086SApple OSS Distributions 703*42e22086SApple OSS Distributions static bool upgradeDext( 704*42e22086SApple OSS Distributions OSKext * olddext, 705*42e22086SApple OSS Distributions OSKext * newdext); 706*42e22086SApple OSS Distributions static bool removeDext(OSKext * dext); 707*42e22086SApple OSS Distributions static void replaceDextInternal( 708*42e22086SApple OSS Distributions OSKext * olddext, 709*42e22086SApple OSS Distributions OSKext * newdext); 710*42e22086SApple OSS Distributions /* panic() support. 711*42e22086SApple OSS Distributions */ 712*42e22086SApple OSS Distributions public: 713*42e22086SApple OSS Distributions enum { 714*42e22086SApple OSS Distributions kPrintKextsLock = 0x01, 715*42e22086SApple OSS Distributions kPrintKextsUnslide = 0x02, 716*42e22086SApple OSS Distributions kPrintKextsTerse = 0x04 717*42e22086SApple OSS Distributions }; 718*42e22086SApple OSS Distributions static void printKextsInBacktrace( 719*42e22086SApple OSS Distributions vm_offset_t * addr, 720*42e22086SApple OSS Distributions unsigned int cnt, 721*42e22086SApple OSS Distributions int (* printf_func)(const char *fmt, ...), 722*42e22086SApple OSS Distributions uint32_t flags); 723*42e22086SApple OSS Distributions bool isDriverKit(void); 724*42e22086SApple OSS Distributions bool isInFileset(void); 725*42e22086SApple OSS Distributions private: 726*42e22086SApple OSS Distributions static OSKextLoadedKextSummary *summaryForAddress(const uintptr_t addr); 727*42e22086SApple OSS Distributions static void *kextForAddress(const void *addr); 728*42e22086SApple OSS Distributions static boolean_t summaryIsInBacktrace( 729*42e22086SApple OSS Distributions OSKextLoadedKextSummary * summary, 730*42e22086SApple OSS Distributions vm_offset_t * addr, 731*42e22086SApple OSS Distributions unsigned int cnt); 732*42e22086SApple OSS Distributions static void printSummary( 733*42e22086SApple OSS Distributions OSKextLoadedKextSummary * summary, 734*42e22086SApple OSS Distributions int (* printf_func)(const char *fmt, ...), 735*42e22086SApple OSS Distributions uint32_t flags); 736*42e22086SApple OSS Distributions 737*42e22086SApple OSS Distributions static int saveLoadedKextPanicListTyped( 738*42e22086SApple OSS Distributions const char * prefix, 739*42e22086SApple OSS Distributions int invertFlag, 740*42e22086SApple OSS Distributions int libsFlag, 741*42e22086SApple OSS Distributions char * paniclist, 742*42e22086SApple OSS Distributions uint32_t list_size); 743*42e22086SApple OSS Distributions static void saveLoadedKextPanicList(void); 744*42e22086SApple OSS Distributions void savePanicString(bool isLoading); 745*42e22086SApple OSS Distributions static void printKextPanicLists(int (*printf_func)(const char *fmt, ...)); 746*42e22086SApple OSS Distributions 747*42e22086SApple OSS Distributions /* Kext summary support. 748*42e22086SApple OSS Distributions */ 749*42e22086SApple OSS Distributions static void updateLoadedKextSummaries(void); 750*42e22086SApple OSS Distributions void updateLoadedKextSummary(OSKextLoadedKextSummary *summary); 751*42e22086SApple OSS Distributions void updateActiveAccount(OSKextActiveAccount *accountp); 752*42e22086SApple OSS Distributions static void removeDaemonExitRequests(void); 753*42e22086SApple OSS Distributions 754*42e22086SApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 755*42e22086SApple OSS Distributions public: 756*42e22086SApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */ 757*42e22086SApple OSS Distributions 758*42e22086SApple OSS Distributions /* C++ Initialization. 759*42e22086SApple OSS Distributions */ 760*42e22086SApple OSS Distributions virtual void setCPPInitialized(bool initialized = true); 761*42e22086SApple OSS Distributions 762*42e22086SApple OSS Distributions #if PRAGMA_MARK 763*42e22086SApple OSS Distributions /**************************************/ 764*42e22086SApple OSS Distributions #pragma mark Public Functions 765*42e22086SApple OSS Distributions /**************************************/ 766*42e22086SApple OSS Distributions #endif 767*42e22086SApple OSS Distributions public: 768*42e22086SApple OSS Distributions // caller must release 769*42e22086SApple OSS Distributions static OSPtr<OSKext> lookupKextWithIdentifier(const char * kextIdentifier); 770*42e22086SApple OSS Distributions static OSPtr<OSKext> lookupKextWithIdentifier(OSString * kextIdentifier); 771*42e22086SApple OSS Distributions static OSPtr<OSKext> lookupKextWithLoadTag(OSKextLoadTag aTag); 772*42e22086SApple OSS Distributions static OSPtr<OSKext> lookupKextWithAddress(vm_address_t address); 773*42e22086SApple OSS Distributions static OSPtr<OSKext> lookupKextWithUUID(uuid_t uuid); 774*42e22086SApple OSS Distributions static OSPtr<OSKext> lookupDextWithIdentifier(OSString * dextIdentifier, OSData *dextUniqueIdentifier); 775*42e22086SApple OSS Distributions 776*42e22086SApple OSS Distributions kernel_section_t *lookupSection(const char *segname, const char*secname); 777*42e22086SApple OSS Distributions 778*42e22086SApple OSS Distributions static bool isKextWithIdentifierLoaded(const char * kextIdentifier); 779*42e22086SApple OSS Distributions 780*42e22086SApple OSS Distributions static OSReturn loadKextWithIdentifier( 781*42e22086SApple OSS Distributions const char * kextIdentifier, 782*42e22086SApple OSS Distributions Boolean allowDeferFlag = true, 783*42e22086SApple OSS Distributions Boolean delayAutounloadFlag = false, 784*42e22086SApple OSS Distributions OSKextExcludeLevel startOpt = kOSKextExcludeNone, 785*42e22086SApple OSS Distributions OSKextExcludeLevel startMatchingOpt = kOSKextExcludeAll, 786*42e22086SApple OSS Distributions OSArray * personalityNames = NULL); 787*42e22086SApple OSS Distributions 788*42e22086SApple OSS Distributions static OSReturn loadKextWithIdentifier( 789*42e22086SApple OSS Distributions OSString * kextIdentifier, 790*42e22086SApple OSS Distributions LIBKERN_RETURNS_RETAINED_ON_ZERO OSObject ** kextRef, 791*42e22086SApple OSS Distributions Boolean allowDeferFlag = true, 792*42e22086SApple OSS Distributions Boolean delayAutounloadFlag = false, 793*42e22086SApple OSS Distributions OSKextExcludeLevel startOpt = kOSKextExcludeNone, 794*42e22086SApple OSS Distributions OSKextExcludeLevel startMatchingOpt = kOSKextExcludeAll, 795*42e22086SApple OSS Distributions OSArray * personalityNames = NULL); 796*42e22086SApple OSS Distributions 797*42e22086SApple OSS Distributions static OSReturn loadKextWithIdentifier( 798*42e22086SApple OSS Distributions OSString * kextIdentifier, 799*42e22086SApple OSS Distributions OSSharedPtr<OSObject> &kextRef, 800*42e22086SApple OSS Distributions Boolean allowDeferFlag = true, 801*42e22086SApple OSS Distributions Boolean delayAutounloadFlag = false, 802*42e22086SApple OSS Distributions OSKextExcludeLevel startOpt = kOSKextExcludeNone, 803*42e22086SApple OSS Distributions OSKextExcludeLevel startMatchingOpt = kOSKextExcludeAll, 804*42e22086SApple OSS Distributions OSArray * personalityNames = NULL); 805*42e22086SApple OSS Distributions 806*42e22086SApple OSS Distributions static OSReturn loadKextFromKC(OSKext *theKext, OSDictionary *requestDict); 807*42e22086SApple OSS Distributions 808*42e22086SApple OSS Distributions static void dropMatchingReferences( 809*42e22086SApple OSS Distributions OSSet * kexts); 810*42e22086SApple OSS Distributions 811*42e22086SApple OSS Distributions bool hasDependency(const OSSymbol * depID); 812*42e22086SApple OSS Distributions 813*42e22086SApple OSS Distributions static OSReturn removeKextWithIdentifier( 814*42e22086SApple OSS Distributions const char * kextIdentifier, 815*42e22086SApple OSS Distributions bool terminateServicesAndRemovePersonalitiesFlag = false); 816*42e22086SApple OSS Distributions static OSReturn removeKextWithLoadTag( 817*42e22086SApple OSS Distributions OSKextLoadTag loadTag, 818*42e22086SApple OSS Distributions bool terminateServicesAndRemovePersonalitiesFlag = false); 819*42e22086SApple OSS Distributions static OSReturn requestDaemonLaunch( 820*42e22086SApple OSS Distributions OSString * kextIdentifier, 821*42e22086SApple OSS Distributions OSString * serverName, 822*42e22086SApple OSS Distributions OSNumber * serverTag, 823*42e22086SApple OSS Distributions OSBoolean * reslide, 824*42e22086SApple OSS Distributions class IOUserServerCheckInToken * checkInToken, 825*42e22086SApple OSS Distributions OSData *serverDUI); 826*42e22086SApple OSS Distributions static OSReturn notifyDextUpgrade( 827*42e22086SApple OSS Distributions OSString * kextIdentifier, 828*42e22086SApple OSS Distributions OSData * dextUniqueIdentifier); 829*42e22086SApple OSS Distributions static OSReturn requestResource( 830*42e22086SApple OSS Distributions const char * kextIdentifier, 831*42e22086SApple OSS Distributions const char * resourceName, 832*42e22086SApple OSS Distributions OSKextRequestResourceCallback callback, 833*42e22086SApple OSS Distributions void * context, 834*42e22086SApple OSS Distributions OSKextRequestTag * requestTagOut); 835*42e22086SApple OSS Distributions static OSReturn cancelRequest( 836*42e22086SApple OSS Distributions OSKextRequestTag requestTag, 837*42e22086SApple OSS Distributions void ** contextOut); 838*42e22086SApple OSS Distributions 839*42e22086SApple OSS Distributions static void considerUnloads(Boolean rescheduleOnlyFlag = false); 840*42e22086SApple OSS Distributions static void flushNonloadedKexts(Boolean flushPrelinkedKexts); 841*42e22086SApple OSS Distributions static void setIOKitDaemonActive(bool active = true); 842*42e22086SApple OSS Distributions static void setDeferredLoadSucceeded(Boolean succeeded = true); 843*42e22086SApple OSS Distributions static void considerRebuildOfPrelinkedKernel(void); 844*42e22086SApple OSS Distributions static void createExcludeListFromBooterData( 845*42e22086SApple OSS Distributions OSDictionary * theDictionary, 846*42e22086SApple OSS Distributions OSCollectionIterator * theIterator); 847*42e22086SApple OSS Distributions static void createExcludeListFromPrelinkInfo(OSArray * theInfoArray); 848*42e22086SApple OSS Distributions static boolean_t updateExcludeList(OSDictionary * infoDict); 849*42e22086SApple OSS Distributions 850*42e22086SApple OSS Distributions static bool pendingIOKitDaemonRequests(void); 851*42e22086SApple OSS Distributions 852*42e22086SApple OSS Distributions virtual bool setAutounloadEnabled(bool flag); 853*42e22086SApple OSS Distributions 854*42e22086SApple OSS Distributions virtual const OSSymbol * getIdentifier(void); 855*42e22086SApple OSS Distributions virtual const char * getIdentifierCString(void); 856*42e22086SApple OSS Distributions virtual OSKextVersion getVersion(void); 857*42e22086SApple OSS Distributions virtual OSKextVersion getCompatibleVersion(void); 858*42e22086SApple OSS Distributions virtual bool isLibrary(void); 859*42e22086SApple OSS Distributions virtual bool isCompatibleWithVersion(OSKextVersion aVersion); 860*42e22086SApple OSS Distributions virtual OSObject * getPropertyForHostArch(const char * key); 861*42e22086SApple OSS Distributions 862*42e22086SApple OSS Distributions virtual OSKextLoadTag getLoadTag(void); 863*42e22086SApple OSS Distributions virtual void getSizeInfo(uint32_t *loadSize, uint32_t *wiredSize); 864*42e22086SApple OSS Distributions virtual OSPtr<OSData> copyUUID(void); 865*42e22086SApple OSS Distributions OSPtr<OSData> copyTextUUID(void); 866*42e22086SApple OSS Distributions OSPtr<OSData> copyMachoUUID(const kernel_mach_header_t * header); 867*42e22086SApple OSS Distributions OSPtr<OSDextStatistics> copyDextStatistics(); 868*42e22086SApple OSS Distributions virtual OSPtr<OSArray> copyPersonalitiesArray(void); 869*42e22086SApple OSS Distributions static bool copyUserExecutablePath(const OSSymbol * bundleID, char * pathResult, size_t pathSize); 870*42e22086SApple OSS Distributions virtual void setDriverKitUUID(LIBKERN_CONSUMED OSData *uuid); 871*42e22086SApple OSS Distributions static bool incrementDextLaunchCount(OSKext *dext, OSData *dextUniqueIDToMatch); 872*42e22086SApple OSS Distributions static bool decrementDextLaunchCount(OSString *bundleID); 873*42e22086SApple OSS Distributions 874*42e22086SApple OSS Distributions /* This removes personalities naming the kext (by CFBundleIdentifier), 875*42e22086SApple OSS Distributions * not all personalities defined by the kext (IOPersonalityPublisher or CFBundleIdentifier). 876*42e22086SApple OSS Distributions */ 877*42e22086SApple OSS Distributions virtual void removePersonalitiesFromCatalog(void); 878*42e22086SApple OSS Distributions /* 879*42e22086SApple OSS Distributions * This removes the personalities naming the kext (by CFBundleIdentifier), and atomically adds 880*42e22086SApple OSS Distributions * the new personalities upgradedPersonalities. 881*42e22086SApple OSS Distributions */ 882*42e22086SApple OSS Distributions virtual void updatePersonalitiesInCatalog(OSArray *upgradedPersonalities); 883*42e22086SApple OSS Distributions 884*42e22086SApple OSS Distributions /* Converts common string-valued properties to OSSymbols for lower memory consumption. 885*42e22086SApple OSS Distributions */ 886*42e22086SApple OSS Distributions static void uniquePersonalityProperties(OSDictionary * personalityDict); 887*42e22086SApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 888*42e22086SApple OSS Distributions static void uniquePersonalityProperties(OSDictionary * personalityDict, bool defaultAddKernelBundleIdentifier); 889*42e22086SApple OSS Distributions #endif 890*42e22086SApple OSS Distributions 891*42e22086SApple OSS Distributions static bool iokitDaemonActive(void); 892*42e22086SApple OSS Distributions 893*42e22086SApple OSS Distributions virtual bool declaresExecutable(void); // might be missing 894*42e22086SApple OSS Distributions virtual bool isInterface(void); 895*42e22086SApple OSS Distributions virtual bool isKernel(void); 896*42e22086SApple OSS Distributions virtual bool isKernelComponent(void); 897*42e22086SApple OSS Distributions virtual bool isExecutable(void); 898*42e22086SApple OSS Distributions virtual bool isLoadableInSafeBoot(void); 899*42e22086SApple OSS Distributions virtual bool isPrelinked(void); 900*42e22086SApple OSS Distributions virtual bool isLoaded(void); 901*42e22086SApple OSS Distributions virtual bool isStarted(void); 902*42e22086SApple OSS Distributions virtual bool isCPPInitialized(void); 903*42e22086SApple OSS Distributions 904*42e22086SApple OSS Distributions const char * getKCTypeString(void)905*42e22086SApple OSS Distributions getKCTypeString(void) 906*42e22086SApple OSS Distributions { 907*42e22086SApple OSS Distributions switch (kc_type) { 908*42e22086SApple OSS Distributions case KCKindPrimary: 909*42e22086SApple OSS Distributions return kKCTypePrimary; 910*42e22086SApple OSS Distributions case KCKindPageable: 911*42e22086SApple OSS Distributions return kKCTypeSystem; 912*42e22086SApple OSS Distributions case KCKindAuxiliary: 913*42e22086SApple OSS Distributions return kKCTypeAuxiliary; 914*42e22086SApple OSS Distributions case KCKindNone: 915*42e22086SApple OSS Distributions return kKCTypeCodeless; 916*42e22086SApple OSS Distributions default: 917*42e22086SApple OSS Distributions return "??"; 918*42e22086SApple OSS Distributions } 919*42e22086SApple OSS Distributions } 920*42e22086SApple OSS Distributions }; 921*42e22086SApple OSS Distributions 922*42e22086SApple OSS Distributions extern "C" void OSKextResetAfterUserspaceReboot(void); 923*42e22086SApple OSS Distributions 924*42e22086SApple OSS Distributions #endif /* !_LIBKERN_OSKEXT_H */ 925