xref: /xnu-8792.61.2/libkern/libkern/c++/OSKext.h (revision 42e220869062b56f8d7d0726fd4c88954f87902c)
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