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(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()
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#endif /* CONFIG_DTRACE */
179
180#endif    /* KERNEL_PRIVATE */
181
182
183#if PRAGMA_MARK
184#pragma mark Obsolete kmod stuff
185#endif
186/***********************************************************************
187* These 3 should be dropped but they're referenced by MIG declarations.
188***********************************************************************/
189typedef void * kmod_args_t;
190typedef int kmod_control_flavor_t;
191typedef kmod_info_t * kmod_info_array_t;
192
193__END_DECLS
194
195#endif    /* _MACH_KMOD_H_ */
196