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 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 ***********************************************************************/ 174 typedef void * kmod_args_t; 175 typedef int kmod_control_flavor_t; 176 typedef kmod_info_t * kmod_info_array_t; 177 178 __END_DECLS 179 180 #endif /* _MACH_KMOD_H_ */