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
167
168#if PRAGMA_MARK
169#pragma mark Obsolete kmod stuff
170#endif
171/***********************************************************************
172* These 3 should be dropped but they're referenced by MIG declarations.
173***********************************************************************/
174typedef void * kmod_args_t;
175typedef int kmod_control_flavor_t;
176typedef kmod_info_t * kmod_info_array_t;
177
178__END_DECLS
179
180#endif    /* _MACH_KMOD_H_ */