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