1/* 2 * Copyright (c) 2000-2005 Apple Computer, 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 * @OSF_COPYRIGHT@ 30 */ 31 32#ifndef _KERN_IPC_MIG_H_ 33#define _KERN_IPC_MIG_H_ 34 35#include <mach/mig.h> 36#include <mach/mach_types.h> 37#include <mach/message.h> 38#include <kern/kern_types.h> 39 40#include <sys/cdefs.h> 41 42#ifdef XNU_KERNEL_PRIVATE 43 44#include <sys/kdebug.h> 45 46/* 47 * Define the trace points for MIG-generated calls. One traces the input parameters 48 * to MIG called things, another traces the outputs, and one traces bad message IDs. 49 */ 50#ifdef _MIG_TRACE_PARAMETERS_ 51 52#define __BeforeRcvCallTrace(msgid,arg1,arg2,arg3,arg4) \ 53 KERNEL_DEBUG_CONSTANT_IST(KDEBUG_TRACE, \ 54 KDBG_MIGCODE(msgid) | DBG_FUNC_START, \ 55 (unsigned int)(arg1), \ 56 (unsigned int)(arg2), \ 57 (unsigned int)(arg3), \ 58 (unsigned int)(arg4), \ 59 (unsigned int)(0)); 60 61#define __AfterRcvCallTrace(msgid,arg1,arg2,arg3,arg4) \ 62 KERNEL_DEBUG_CONSTANT_IST(KDEBUG_TRACE, \ 63 KDBG_MIGCODE(msgid) | DBG_FUNC_END, \ 64 (unsigned int)(arg1), \ 65 (unsigned int)(arg2), \ 66 (unsigned int)(arg3), \ 67 (unsigned int)(arg4), \ 68 (unsigned int)(0)); 69 70#define __BeforeSimpleCallTrace(msgid,arg1,arg2,arg3,arg4) \ 71 KERNEL_DEBUG_CONSTANT_IST(KDEBUG_TRACE, \ 72 KDBG_MIGCODE(msgid) | DBG_FUNC_START, \ 73 (unsigned int)(arg1), \ 74 (unsigned int)(arg2), \ 75 (unsigned int)(arg3), \ 76 (unsigned int)(arg4), \ 77 (unsigned int)(0)); 78 79#define __AfterSimpleCallTrace(msgid,arg1,arg2,arg3,arg4) \ 80 KERNEL_DEBUG_CONSTANT_IST(KDEBUG_TRACE, \ 81 KDBG_MIGCODE(msgid) | DBG_FUNC_END, \ 82 (unsigned int)(arg1), \ 83 (unsigned int)(arg2), \ 84 (unsigned int)(arg3), \ 85 (unsigned int)(arg4), \ 86 (unsigned int)(0)); 87 88#else /* !_MIG_TRACE_PARAMETERS_ */ 89 90#define __BeforeRcvRpc(msgid, _NAME_) \ 91 KERNEL_DEBUG_CONSTANT_IST(KDEBUG_TRACE, \ 92 KDBG_MIGCODE(msgid) | DBG_FUNC_START, \ 93 (unsigned int)(0), \ 94 (unsigned int)(0), \ 95 (unsigned int)(0), \ 96 (unsigned int)(0), \ 97 (unsigned int)(0)); 98 99#define __AfterRcvRpc(msgid, _NAME_) \ 100 KERNEL_DEBUG_CONSTANT_IST(KDEBUG_TRACE, \ 101 KDBG_MIGCODE(msgid) | DBG_FUNC_END, \ 102 (unsigned int)(0), \ 103 (unsigned int)(0), \ 104 (unsigned int)(0), \ 105 (unsigned int)(0), \ 106 (unsigned int)(0)); 107 108 109#define __BeforeRcvSimple(msgid, _NAME_) \ 110 KERNEL_DEBUG_CONSTANT_IST(KDEBUG_TRACE, \ 111 KDBG_MIGCODE(msgid) | DBG_FUNC_START, \ 112 (unsigned int)(0), \ 113 (unsigned int)(0), \ 114 (unsigned int)(0), \ 115 (unsigned int)(0), \ 116 (unsigned int)(0)); 117 118#define __AfterRcvSimple(msgid, _NAME_) \ 119 KERNEL_DEBUG_CONSTANT_IST(KDEBUG_TRACE, \ 120 KDBG_MIGCODE(msgid) | DBG_FUNC_END, \ 121 (unsigned int)(0), \ 122 (unsigned int)(0), \ 123 (unsigned int)(0), \ 124 (unsigned int)(0), \ 125 (unsigned int)(0)); 126 127#endif /* !_MIG_TRACE_PARAMETERS_ */ 128 129#define _MIG_MSGID_INVALID(msgid) \ 130 KERNEL_DEBUG_CONSTANT_IST(KDEBUG_TRACE, \ 131 MACHDBG_CODE(DBG_MACH_MSGID_INVALID, (msgid)), \ 132 (unsigned int)(0), \ 133 (unsigned int)(0), \ 134 (unsigned int)(0), \ 135 (unsigned int)(0), \ 136 (unsigned int)(0)) 137 138#endif /* XNU_KERNEL_PRIVATE */ 139 140__BEGIN_DECLS 141 142/* Send a message from the kernel */ 143 144extern mach_msg_return_t mach_msg_send_from_kernel_proper( 145 mach_msg_header_t *msg, 146 mach_msg_size_t send_size); 147 148#define mach_msg_send_from_kernel mach_msg_send_from_kernel_proper 149 150extern mach_msg_return_t 151mach_msg_rpc_from_kernel_proper( 152 mach_msg_header_t *msg, 153 mach_msg_size_t send_size, 154 mach_msg_size_t rcv_size); 155 156#define mach_msg_rpc_from_kernel mach_msg_rpc_from_kernel_proper 157 158#ifdef XNU_KERNEL_PRIVATE 159extern mach_msg_return_t mach_msg_send_from_kernel_with_options_legacy( 160 mach_msg_header_t *msg, 161 mach_msg_size_t send_size, 162 mach_msg_option_t option, 163 mach_msg_timeout_t timeout_val); 164#endif /* XNU_KERNEL_PRIVATE */ 165 166extern mach_msg_return_t mach_msg_send_from_kernel_with_options( 167 mach_msg_header_t *msg, 168 mach_msg_size_t send_size, 169 mach_msg_option_t option, 170 mach_msg_timeout_t timeout_val); 171 172__END_DECLS 173 174#ifdef MACH_KERNEL_PRIVATE 175 176extern void mach_msg_receive_continue(void); 177 178/* Initialize kernel server dispatch table */ 179extern void mig_init(void); 180 181/* 182 * Kernel implementation of the MIG object base class 183 * 184 * Conforms to the MIGObjectInterface defined in <mach/mig.h> 185 * Ports are automatically allocated for the duration of outstanding 186 * cross-task references and then released. 187 */ 188 189typedef struct mig_object { 190 const IMIGObjectVtbl *pVtbl; /* our interface def */ 191 mach_port_t port; /* our port pointer */ 192} mig_object_data_t; 193 194 195/* 196 * MIG notify base class definition 197 * These are chained off the mig object to which the are registered. 198 * When that object triggers a notification delivery, we walk this 199 * chain and deliver the appropriate notification. 200 */ 201typedef struct mig_notify_object { 202 const IMIGNotifyObjectVtbl *pVtbl; /* our interface def */ 203 mach_port_t port; /* our port pointer */ 204} mig_notify_object_data_t; 205 206extern kern_return_t mig_object_init( 207 mig_object_t mig_object, 208 const IMIGObject *interface); 209 210extern void mig_object_destroy( 211 mig_object_t mig_object); 212 213extern void mig_object_reference( 214 mig_object_t mig_object); 215 216extern void mig_object_deallocate( 217 mig_object_t mig_object); 218 219extern ipc_port_t convert_mig_object_to_port( 220 mig_object_t mig_object); 221 222extern mig_object_t convert_port_to_mig_object( 223 ipc_port_t port, 224 const MIGIID *iid); 225 226boolean_t mig_object_no_senders( 227 ipc_port_t port, 228 mach_port_mscount_t mscount); 229 230#endif /* MACH_KERNEL_PRIVATE */ 231 232#endif /* _KERN_IPC_MIG_H_ */ 233