]> git.saurik.com Git - apple/xnu.git/blob - osfmk/mach/kmod.h
xnu-6153.11.26.tar.gz
[apple/xnu.git] / osfmk / mach / kmod.h
1 /*
2 * Copyright (c) 2000-2007 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 * NOTICE: This file was modified by SPARTA, Inc. in 2005 to introduce
30 * support for mandatory and extensible security protections. This notice
31 * is included in support of clause 2.2 (b) of the Apple Public License,
32 * Version 2.0.
33 */
34
35 #ifndef _MACH_KMOD_H_
36 #define _MACH_KMOD_H_
37
38 #include <mach/kern_return.h>
39 #include <mach/mach_types.h>
40
41 #include <sys/cdefs.h>
42
43 __BEGIN_DECLS
44
45 #if PRAGMA_MARK
46 #pragma mark Basic macros & typedefs
47 #endif
48 /***********************************************************************
49 * Basic macros & typedefs
50 ***********************************************************************/
51 #define KMOD_MAX_NAME 64
52
53 #define KMOD_RETURN_SUCCESS KERN_SUCCESS
54 #define KMOD_RETURN_FAILURE KERN_FAILURE
55
56 typedef int kmod_t;
57
58 struct kmod_info;
59 typedef kern_return_t kmod_start_func_t(struct kmod_info * ki, void * data);
60 typedef kern_return_t kmod_stop_func_t(struct kmod_info * ki, void * data);
61
62 #if PRAGMA_MARK
63 #pragma mark Structure definitions
64 #endif
65 /***********************************************************************
66 * Structure definitions
67 *
68 * All structures must be #pragma pack(4).
69 ***********************************************************************/
70 #pragma pack(push, 4)
71
72 /* Run-time struct only; never saved to a file */
73 typedef struct kmod_reference {
74 struct kmod_reference * next;
75 struct kmod_info * info;
76 } kmod_reference_t;
77
78 /***********************************************************************
79 * Warning: Any changes to the kmod_info structure affect the
80 * KMOD_..._DECL macros below.
81 ***********************************************************************/
82
83 /* The kmod_info_t structure is only safe to use inside the running
84 * kernel. If you need to work with a kmod_info_t structure outside
85 * the kernel, please use the compatibility definitions below.
86 */
87 typedef struct kmod_info {
88 struct kmod_info * next;
89 int32_t info_version; // version of this structure
90 uint32_t id;
91 char name[KMOD_MAX_NAME];
92 char version[KMOD_MAX_NAME];
93 int32_t reference_count; // # linkage refs to this
94 kmod_reference_t * reference_list; // who this refs (links on)
95 vm_address_t address; // starting address
96 vm_size_t size; // total size
97 vm_size_t hdr_size; // unwired hdr size
98 kmod_start_func_t * start;
99 kmod_stop_func_t * stop;
100 } kmod_info_t;
101
102 /* A compatibility definition of kmod_info_t for 32-bit kexts.
103 */
104 typedef struct kmod_info_32_v1 {
105 uint32_t next_addr;
106 int32_t info_version;
107 uint32_t id;
108 uint8_t name[KMOD_MAX_NAME];
109 uint8_t version[KMOD_MAX_NAME];
110 int32_t reference_count;
111 uint32_t reference_list_addr;
112 uint32_t address;
113 uint32_t size;
114 uint32_t hdr_size;
115 uint32_t start_addr;
116 uint32_t stop_addr;
117 } kmod_info_32_v1_t;
118
119 /* A compatibility definition of kmod_info_t for 64-bit kexts.
120 */
121 typedef struct kmod_info_64_v1 {
122 uint64_t next_addr;
123 int32_t info_version;
124 uint32_t id;
125 uint8_t name[KMOD_MAX_NAME];
126 uint8_t version[KMOD_MAX_NAME];
127 int32_t reference_count;
128 uint64_t reference_list_addr;
129 uint64_t address;
130 uint64_t size;
131 uint64_t hdr_size;
132 uint64_t start_addr;
133 uint64_t stop_addr;
134 } kmod_info_64_v1_t;
135
136 #pragma pack(pop)
137
138 #if PRAGMA_MARK
139 #pragma mark Kmod structure declaration macros
140 #endif
141 /***********************************************************************
142 * Kmod structure declaration macros
143 ***********************************************************************/
144 #define KMOD_INFO_NAME kmod_info
145 #define KMOD_INFO_VERSION 1
146
147 #define KMOD_DECL(name, version) \
148 static kmod_start_func_t name ## _module_start; \
149 static kmod_stop_func_t name ## _module_stop; \
150 kmod_info_t KMOD_INFO_NAME = { 0, KMOD_INFO_VERSION, -1U, \
151 { #name }, { version }, -1, 0, 0, 0, 0, \
152 name ## _module_start, \
153 name ## _module_stop };
154
155 #define KMOD_EXPLICIT_DECL(name, version, start, stop) \
156 kmod_info_t KMOD_INFO_NAME = { 0, KMOD_INFO_VERSION, -1U, \
157 { #name }, { version }, -1, 0, 0, 0, 0, \
158 start, stop };
159
160 #if PRAGMA_MARK
161 #pragma mark Kernel private declarations
162 #endif
163 /***********************************************************************
164 * Kernel private declarations.
165 ***********************************************************************/
166 #ifdef KERNEL_PRIVATE
167
168 /* Implementation now in libkern/OSKextLib.cpp. */
169 extern void kmod_panic_dump(vm_offset_t * addr, unsigned int dump_cnt);
170
171 #if CONFIG_DTRACE
172 /*
173 * DTrace can take a flag indicating whether it should instrument
174 * probes immediately based on kernel symbols. This per kext
175 * flag overrides system mode in dtrace_modload().
176 */
177 #define KMOD_DTRACE_FORCE_INIT 0x01
178 #define KMOD_DTRACE_STATIC_KEXT 0x02
179 #endif /* CONFIG_DTRACE */
180
181 #endif /* KERNEL_PRIVATE */
182
183
184 #if PRAGMA_MARK
185 #pragma mark Obsolete kmod stuff
186 #endif
187 /***********************************************************************
188 * These 3 should be dropped but they're referenced by MIG declarations.
189 ***********************************************************************/
190 typedef void * kmod_args_t;
191 typedef int kmod_control_flavor_t;
192 typedef kmod_info_t * kmod_info_array_t;
193
194 __END_DECLS
195
196 #endif /* _MACH_KMOD_H_ */