master
1/*
2 * Copyright (c) 2008 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28
29#ifndef _LIBKERN_OSKEXTLIB_H
30#define _LIBKERN_OSKEXTLIB_H
31
32#include <sys/cdefs.h>
33#include <stdint.h>
34#include <mach/kmod.h>
35#include <mach/vm_types.h>
36#include <uuid/uuid.h>
37
38#include <libkern/OSReturn.h>
39
40__BEGIN_DECLS
41
42/*!
43 * @header
44 *
45 * Declares functions, basic return values, and other constants
46 * related to kernel extensions (kexts).
47 */
48
49#if PRAGMA_MARK
50#pragma mark -
51/********************************************************************/
52#pragma mark OSReturn Values for Kernel Extensions
53/********************************************************************/
54#endif
55/*!
56 * @group OSReturn Values for Kernel Extensions
57 * Many kext-related functions return these values,
58 * as well as those defined under
59 * <code>@link //apple_ref/c/tdef/OSReturn OSReturn@/link</code>
60 * and other variants of <code>kern_return_t</code>.
61 */
62
63
64#define sub_libkern_kext err_sub(2)
65#define libkern_kext_err(code) (sys_libkern|sub_libkern_kext|(code))
66
67
68/*!
69 * @define kOSKextReturnInternalError
70 * @abstract An internal error in the kext library.
71 * Contrast with <code>@link //apple_ref/c/econst/OSReturnError
72 * OSReturnError@/link</code>.
73 */
74#define kOSKextReturnInternalError libkern_kext_err(0x1)
75
76/*!
77 * @define kOSKextReturnNoMemory
78 * @abstract Memory allocation failed.
79 */
80#define kOSKextReturnNoMemory libkern_kext_err(0x2)
81
82/*!
83 * @define kOSKextReturnNoResources
84 * @abstract Some resource other than memory (such as available load tags)
85 * is exhausted.
86 */
87#define kOSKextReturnNoResources libkern_kext_err(0x3)
88
89/*!
90 * @define kOSKextReturnNotPrivileged
91 * @abstract The caller lacks privileges to perform the requested operation.
92 */
93#define kOSKextReturnNotPrivileged libkern_kext_err(0x4)
94
95/*!
96 * @define kOSKextReturnInvalidArgument
97 * @abstract Invalid argument.
98 */
99#define kOSKextReturnInvalidArgument libkern_kext_err(0x5)
100
101/*!
102 * @define kOSKextReturnNotFound
103 * @abstract Search item not found.
104 */
105#define kOSKextReturnNotFound libkern_kext_err(0x6)
106
107/*!
108 * @define kOSKextReturnBadData
109 * @abstract Malformed data (not used for XML).
110 */
111#define kOSKextReturnBadData libkern_kext_err(0x7)
112
113/*!
114 * @define kOSKextReturnSerialization
115 * @abstract Error converting or (un)serializing URL, string, or XML.
116 */
117#define kOSKextReturnSerialization libkern_kext_err(0x8)
118
119/*!
120 * @define kOSKextReturnUnsupported
121 * @abstract Operation is no longer or not yet supported.
122 */
123#define kOSKextReturnUnsupported libkern_kext_err(0x9)
124
125/*!
126 * @define kOSKextReturnDisabled
127 * @abstract Operation is currently disabled.
128 */
129#define kOSKextReturnDisabled libkern_kext_err(0xa)
130
131/*!
132 * @define kOSKextReturnNotAKext
133 * @abstract Bundle is not a kernel extension.
134 */
135#define kOSKextReturnNotAKext libkern_kext_err(0xb)
136
137/*!
138 * @define kOSKextReturnValidation
139 * @abstract Validation failures encountered; check diagnostics for details.
140 */
141#define kOSKextReturnValidation libkern_kext_err(0xc)
142
143/*!
144 * @define kOSKextReturnAuthentication
145 * @abstract Authetication failures encountered; check diagnostics for details.
146 */
147#define kOSKextReturnAuthentication libkern_kext_err(0xd)
148
149/*!
150 * @define kOSKextReturnDependencies
151 * @abstract Dependency resolution failures encountered; check diagnostics for details.
152 */
153#define kOSKextReturnDependencies libkern_kext_err(0xe)
154
155/*!
156 * @define kOSKextReturnArchNotFound
157 * @abstract Kext does not contain code for the requested architecture.
158 */
159#define kOSKextReturnArchNotFound libkern_kext_err(0xf)
160
161/*!
162 * @define kOSKextReturnCache
163 * @abstract An error occurred processing a system kext cache.
164 */
165#define kOSKextReturnCache libkern_kext_err(0x10)
166
167/*!
168 * @define kOSKextReturnDeferred
169 * @abstract Operation has been posted asynchronously to user space (kernel only).
170 */
171#define kOSKextReturnDeferred libkern_kext_err(0x11)
172
173/*!
174 * @define kOSKextReturnBootLevel
175 * @abstract Kext not loadable or operation not allowed at current boot level.
176 */
177#define kOSKextReturnBootLevel libkern_kext_err(0x12)
178
179/*!
180 * @define kOSKextReturnNotLoadable
181 * @abstract Kext cannot be loaded; check diagnostics for details.
182 */
183#define kOSKextReturnNotLoadable libkern_kext_err(0x13)
184
185/*!
186 * @define kOSKextReturnLoadedVersionDiffers
187 * @abstract A different version (or executable UUID, or executable by checksum)
188 * of the requested kext is already loaded.
189 */
190#define kOSKextReturnLoadedVersionDiffers libkern_kext_err(0x14)
191
192/*!
193 * @define kOSKextReturnDependencyLoadError
194 * @abstract A load error occurred on a dependency of the kext being loaded.
195 */
196#define kOSKextReturnDependencyLoadError libkern_kext_err(0x15)
197
198/*!
199 * @define kOSKextReturnLinkError
200 * @abstract A link failure occured with this kext or a dependency.
201 */
202#define kOSKextReturnLinkError libkern_kext_err(0x16)
203
204/*!
205 * @define kOSKextReturnStartStopError
206 * @abstract The kext start or stop routine returned an error.
207 */
208#define kOSKextReturnStartStopError libkern_kext_err(0x17)
209
210/*!
211 * @define kOSKextReturnInUse
212 * @abstract The kext is currently in use or has outstanding references,
213 * and cannot be unloaded.
214 */
215#define kOSKextReturnInUse libkern_kext_err(0x18)
216
217/*!
218 * @define kOSKextReturnTimeout
219 * @abstract A kext request has timed out.
220 */
221#define kOSKextReturnTimeout libkern_kext_err(0x19)
222
223/*!
224 * @define kOSKextReturnStopping
225 * @abstract The kext is in the process of stopping; requests cannot be made.
226 */
227#define kOSKextReturnStopping libkern_kext_err(0x1a)
228
229/*!
230 * @define kOSKextReturnSystemPolicy
231 * @abstract The kext was prevented from loading due to system policy.
232 */
233#define kOSKextReturnSystemPolicy libkern_kext_err(0x1b)
234
235/*!
236 * @define kOSKextReturnKCLoadFailure
237 * @abstract Loading of the System KC failed
238 */
239#define kOSKextReturnKCLoadFailure libkern_kext_err(0x1c)
240
241/*!
242 * @define kOSKextReturnKCLoadFailureSystemKC
243 * @abstract Loading of the System KC failed
244 *
245 * This a sub-code of kOSKextReturnKCLoadFailure. It can be OR'd together
246 * with: kOSKextReturnKCLoadFailureAuxKC
247 *
248 * If both the System and Aux KCs fail to load, then the error code will be:
249 * libkern_kext_err(0x1f)
250 */
251#define kOSKextReturnKCLoadFailureSystemKC libkern_kext_err(0x1d)
252
253/*!
254 * @define kOSKextReturnKCLoadFailureAuxKC
255 * @abstract Loading of the Aux KC failed
256 *
257 * This a sub-code of kOSKextReturnKCLoadFailure. It can be OR'd together
258 * with: kOSKextReturnKCLoadFailureSystemKC
259 *
260 * If both the System and Aux KCs fail to load, then the error code will be:
261 * libkern_kext_err(0x1f)
262 */
263#define kOSKextReturnKCLoadFailureAuxKC libkern_kext_err(0x1e)
264
265/* next available error is: libkern_kext_err(0x20) */
266
267#if PRAGMA_MARK
268#pragma mark -
269/********************************************************************/
270#pragma mark Kext/OSBundle Property List Keys
271/********************************************************************/
272#endif
273/*!
274 * @group Kext Property List Keys
275 * These constants cover CFBundle properties defined for kernel extensions.
276 * Because they are used in the kernel, if you want to use one with
277 * CFBundle APIs you'll need to wrap it in a <code>CFSTR()</code> macro.
278 */
279
280
281/*!
282 * @define kOSBundleCompatibleVersionKey
283 * @abstract A string giving the backwards-compatible version of a library kext
284 * in extended Mac OS 'vers' format (####.##.##s{1-255} where 's'
285 * is a build stage 'd', 'a', 'b', 'f' or 'fc').
286 */
287#define kOSBundleCompatibleVersionKey "OSBundleCompatibleVersion"
288
289/*!
290 * @define kOSBundleEnableKextLoggingKey
291 * @abstract Set to true to have the kernel kext logging spec applied
292 * to the kext.
293 * See <code>@link //apple_ref/c/econst/OSKextLogSpec
294 * OSKextLogSpec@/link</code>.
295 */
296#define kOSBundleEnableKextLoggingKey "OSBundleEnableKextLogging"
297
298/*!
299 * @define kOSBundleIsInterfaceKey
300 * @abstract A boolean value indicating whether the kext executable
301 * contains only symbol references.
302 */
303#define kOSBundleIsInterfaceKey "OSBundleIsInterface"
304
305/*!
306 * @define kOSBundleLibrariesKey
307 * @abstract A dictionary listing link dependencies for this kext.
308 * Keys are bundle identifiers, values are version strings.
309 */
310#define kOSBundleLibrariesKey "OSBundleLibraries"
311
312/*!
313 * @define kOSBundleRequiredKey
314 * @abstract A string indicating in which kinds of startup this kext
315 * may need to load during early startup (before
316 * <code>@link //apple_ref/doc/man/8/kextd kextcache(8)@/link</code>).
317 * @discussion
318 * The value is one of:
319 * <ul>
320 * <li>@link kOSBundleRequiredRoot "OSBundleRequiredRoot"@/link</li>
321 * <li>@link kOSBundleRequiredLocalRoot "OSBundleRequiredLocalRoot"@/link</li>
322 * <li>@link kOSBundleRequiredNetworkRoot "OSBundleRequiredNetworkRoot"@/link</li>
323 * <li>@link kOSBundleRequiredSafeBoot "OSBundleRequiredSafeBoot"@/link</li>
324 * <li>@link kOSBundleRequiredConsole "OSBundleRequiredConsole"@/link</li>
325 * </ul>
326 *
327 * Use this property judiciously.
328 * Every kext that declares a value other than "OSBundleRequiredSafeBoot"
329 * increases startup time, as the booter must read it into memory,
330 * or startup kext caches must include it.
331 */
332#define kOSBundleRequiredKey "OSBundleRequired"
333
334/*!
335 * @define kOSBundleRequireExplicitLoadKey
336 * @abstract A boolean value indicating whether the kext requires an
337 * explicit kextload in order to start/match.
338 */
339#define kOSBundleRequireExplicitLoadKey "OSBundleRequireExplicitLoad"
340
341/*!
342 * @define kOSBundleAllowUserLoadKey
343 * @abstract A boolean value indicating whether
344 * <code>@link //apple_ref/doc/man/8/kextd kextcache(8)@/link</code>
345 * will honor a non-root process's request to load a kext.
346 * @discussion
347 * See <code>@link //apple_ref/doc/compositePage/c/func/KextManagerLoadKextWithURL
348 * KextManagerLoadKextWithURL@/link</code>
349 * and <code>@link //apple_ref/doc/compositePage/c/func/KextManagerLoadKextWithIdentifier
350 * KextManagerLoadKextWithIdentifier@/link</code>.
351 */
352#define kOSBundleAllowUserLoadKey "OSBundleAllowUserLoad"
353
354/*!
355 * @define kOSBundleAllowUserTerminateKey
356 * @abstract A boolean value indicating whether the kextunload tool
357 * is allowed to issue IOService terminate to classes defined in this kext.
358 * @discussion A boolean value indicating whether the kextunload tool
359 * is allowed to issue IOService terminate to classes defined in this kext.
360 */
361#define kOSBundleAllowUserTerminateKey "OSBundleAllowUserTerminate"
362
363/*!
364 * @define kOSKernelResourceKey
365 * @abstract A boolean value indicating whether the kext represents a built-in
366 * component of the kernel.
367 */
368#define kOSKernelResourceKey "OSKernelResource"
369
370/*!
371 * @define kOSKextVariantOverrideKey
372 * @abstract A dictionary with target names as key and a target-specific variant
373 * name as value.
374 */
375#define kOSKextVariantOverrideKey "OSKextVariantOverride"
376
377/*!
378 * @define kIOKitPersonalitiesKey
379 * @abstract A dictionary of dictionaries used in matching for I/O Kit drivers.
380 */
381#define kIOKitPersonalitiesKey "IOKitPersonalities"
382
383/*
384 * @define kIOPersonalityPublisherKey
385 * @abstract Used in personalities sent to the I/O Kit,
386 * contains the CFBundleIdentifier of the kext
387 * that the personality originated in.
388 */
389#define kIOPersonalityPublisherKey "IOPersonalityPublisher"
390
391#if CONFIG_KEC_FIPS
392/*
393 * @define kAppleTextHashesKey
394 * @abstract A dictionary conataining hashes for corecrypto kext.
395 */
396#define kAppleTextHashesKey "AppleTextHashes"
397#endif
398
399/*!
400 * @define kOSMutableSegmentCopy
401 * @abstract A boolean value indicating whether the kext requires a copy of
402 * its mutable segments to be kept in memory, and then reset when the kext
403 * unloads. This should be used with caution as it will increase the
404 * amount of memory used by the kext.
405 */
406#define kOSMutableSegmentCopy "OSMutableSegmentCopy"
407
408
409#if PRAGMA_MARK
410/********************************************************************/
411#pragma mark Kext/OSBundle Property Deprecated Keys
412/********************************************************************/
413#endif
414/*
415 * @define kOSBundleDebugLevelKey
416 * @abstract
417 * Deprecated (used on some releases of Mac OS X prior to 10.6 Snow Leopard).
418 * Value is an integer from 1-6, corresponding to the verbose levels
419 * of kext tools on those releases.
420 * On 10.6 Snow Leopard, use <code>@link OSKextEnableKextLogging
421 * OSKextEnableKextLogging@/link</code>.
422 */
423#define kOSBundleDebugLevelKey "OSBundleDebugLevel"
424
425/*!
426 * @define kOSBundleSharedExecutableIdentifierKey
427 * @abstract Deprecated (used on some releases of Mac OS X
428 * prior to 10.6 Snow Leopard).
429 * Value is the bundle identifier of the pseudokext
430 * that contains an executable shared by this kext.
431 */
432#define kOSBundleSharedExecutableIdentifierKey "OSBundleSharedExecutableIdentifier"
433
434
435#if PRAGMA_MARK
436/********************************************************************/
437#pragma mark Kext/OSBundle Property List Values
438/********************************************************************/
439#endif
440
441/*!
442 * @group Kext Property List Values
443 * These constants encompass established values
444 * for kernel extension bundle properties.
445 */
446
447/*!
448 * @define kOSKextKernelIdentifier
449 * @abstract
450 * This is the CFBundleIdentifier user for the kernel itself.
451 */
452#define kOSKextKernelIdentifier "__kernel__"
453
454
455/*!
456 * @define kOSKextBundlePackageTypeKext
457 * @abstract
458 * The bundle type value for Kernel Extensions.
459 */
460#define kOSKextBundlePackageTypeKext "KEXT"
461
462/*!
463 * @define kOSKextBundlePackageTypeDriverKit
464 * @abstract
465 * The bundle type value for Driver Extensions.
466 */
467#define kOSKextBundlePackageTypeDriverKit "DEXT"
468
469/*!
470 * @define kOSBundleRequiredRoot
471 * @abstract
472 * This <code>@link kOSBundleRequiredKey OSBundleRequired@/link</code>
473 * value indicates that the kext may be needed to mount the root filesystem
474 * whether starting from a local or a network volume.
475 */
476#define kOSBundleRequiredRoot "Root"
477
478/*!
479 * @define kOSBundleRequiredLocalRoot
480 * @abstract
481 * This <code>@link kOSBundleRequiredKey OSBundleRequired@/link</code>
482 * value indicates that the kext may be needed to mount the root filesystem
483 * when starting from a local disk.
484 */
485#define kOSBundleRequiredLocalRoot "Local-Root"
486
487/*!
488 * @define kOSBundleRequiredNetworkRoot
489 * @abstract
490 * This <code>@link kOSBundleRequiredKey OSBundleRequired@/link</code>
491 * value indicates that the kext may be needed to mount the root filesystem
492 * when starting over a network connection.
493 */
494#define kOSBundleRequiredNetworkRoot "Network-Root"
495
496/*!
497 * @define kOSBundleRequiredSafeBoot
498 * @abstract
499 * This <code>@link kOSBundleRequiredKey OSBundleRequired@/link</code>
500 * value indicates that the kext can be loaded during a safe startup.
501 * This value does not normally cause the kext to be read by the booter
502 * or included in startup kext caches.
503 */
504#define kOSBundleRequiredSafeBoot "Safe Boot"
505
506/*!
507 * @define kOSBundleRequiredConsole
508 * @abstract
509 * This <code>@link kOSBundleRequiredKey OSBundleRequired@/link</code>
510 * value indicates that the kext may be needed for console access
511 * (specifically in a single-user startup when
512 * <code>@link //apple_ref/doc/man/8/kextd kextd(8)@/link</code>.
513 * does not run)
514 * and should be loaded during early startup.
515 */
516#define kOSBundleRequiredConsole "Console"
517
518/*!
519 * @define kOSBundleRequiredDriverKit
520 * @abstract
521 * This <code>@link kOSBundleRequiredKey OSBundleRequired@/link</code>
522 * value indicates that the driver extension's (DriverKit driver's)
523 * personalities must be present in the kernel at early boot (specifically
524 * before <code>@link //apple_ref/doc/man/8/kextd kextd(8)@/link</code> starts)
525 * in order to compete with kexts built into the prelinkedkernel. Note that
526 * kextd is still required to launch the user space driver binary. The IOKit
527 * matching will happen during early boot, and the actual driver launch
528 * will happen after kextd starts.
529 */
530#define kOSBundleRequiredDriverKit "DriverKit"
531
532#if PRAGMA_MARK
533#pragma mark -
534/********************************************************************/
535#pragma mark Kext Information
536/********************************************************************/
537#endif
538/*!
539 * @group Kext Information
540 * Types, constants, and macros providing a kext with information
541 * about itself.
542 */
543
544/*!
545 * @typedef OSKextLoadTag
546 *
547 * @abstract
548 * A unique identifier assigned to a loaded instanace of a kext.
549 *
550 * @discussion
551 * If a kext is unloaded and later reloaded, the new instance
552 * has a different load tag.
553 *
554 * A kext can get its own load tag in the <code>kmod_info_t</code>
555 * structure passed into its module start routine, as the
556 * <code>id</code> field (cast to this type).
557 */
558typedef uint32_t OSKextLoadTag;
559
560/*!
561 * @define kOSKextInvalidLoadTag
562 *
563 * @abstract
564 * A load tag value that will never be used for a loaded kext;
565 * indicates kext not found.
566 */
567#define kOSKextInvalidLoadTag ((OSKextLoadTag)(-1))
568
569
570__END_DECLS
571
572#endif /* _LIBKERN_OSKEXTLIB_H */