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
56typedef int kmod_t;
57
58struct kmod_info;
59typedef kern_return_t kmod_start_func_t(struct kmod_info * ki, void * data);
60typedef 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 */
73typedef 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 */
87typedef 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 */
104typedef 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 */
121typedef 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. */
169extern 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#define KMOD_DTRACE_NO_KERNEL_SYMS 0x04
180#endif /* CONFIG_DTRACE */
181
182#endif /* KERNEL_PRIVATE */
183
184
185#if PRAGMA_MARK
186#pragma mark Obsolete kmod stuff
187#endif
188/***********************************************************************
189* These 3 should be dropped but they're referenced by MIG declarations.
190***********************************************************************/
191typedef void * kmod_args_t;
192typedef int kmod_control_flavor_t;
193typedef kmod_info_t * kmod_info_array_t;
194
195__END_DECLS
196
197#endif /* _MACH_KMOD_H_ */
198