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 * @OSF_COPYRIGHT@ 30 */ 31 32/* 33 * Mach MIG Subsystem Interfaces 34 */ 35 36#ifndef _MACH_MIG_H_ 37#define _MACH_MIG_H_ 38 39#include <stdint.h> 40#include <mach/port.h> 41#include <mach/message.h> 42#include <mach/vm_types.h> 43 44#include <sys/cdefs.h> 45 46#if defined(MACH_KERNEL) 47 48#if !defined(__MigTypeCheck) 49/* Turn MIG type checking on by default for kernel */ 50#define __MigTypeCheck 1 51#endif 52 53#define __MigKernelSpecificCode 1 54#define _MIG_KERNEL_SPECIFIC_CODE_ 1 55 56#elif !defined(__MigTypeCheck) 57 58#if defined(TypeCheck) 59/* use legacy setting (temporary) */ 60#define __MigTypeCheck TypeCheck 61#else 62/* default MIG type checking on */ 63#define __MigTypeCheck 1 64#endif 65 66#endif /* !defined(MACH_KERNEL) && !defined(__MigTypeCheck) */ 67 68/* 69 * Pack MIG message structs. 70 * This is an indicator of the need to view shared structs in a 71 * binary-compatible format - and MIG message structs are no different. 72 */ 73#define __MigPackStructs 1 74 75/* 76 * Definition for MIG-generated server stub routines. These routines 77 * unpack the request message, call the server procedure, and pack the 78 * reply message. 79 */ 80typedef void (*mig_stub_routine_t) (mach_msg_header_t *InHeadP, 81 mach_msg_header_t *OutHeadP); 82 83typedef mig_stub_routine_t mig_routine_t; 84 85/* 86 * Definition for MIG-generated server routine. This routine takes a 87 * message, and returns the appropriate stub function for handling that 88 * message. 89 */ 90typedef mig_routine_t (*mig_server_routine_t) (mach_msg_header_t *InHeadP); 91 92/* 93 * Generic definition for implementation routines. These routines do 94 * the real work associated with this request. This generic type is 95 * used for keeping the pointers in the subsystem array. 96 */ 97typedef kern_return_t (*mig_impl_routine_t)(void); 98 99typedef mach_msg_type_descriptor_t routine_arg_descriptor; 100typedef mach_msg_type_descriptor_t *routine_arg_descriptor_t; 101typedef mach_msg_type_descriptor_t *mig_routine_arg_descriptor_t; 102 103#define MIG_ROUTINE_ARG_DESCRIPTOR_NULL ((mig_routine_arg_descriptor_t)0) 104 105struct routine_descriptor { 106 mig_impl_routine_t impl_routine; /* Server work func pointer */ 107 mig_stub_routine_t stub_routine; /* Unmarshalling func pointer */ 108 unsigned int argc; /* Number of argument words */ 109 unsigned int descr_count; /* Number complex descriptors */ 110 routine_arg_descriptor_t 111 arg_descr; /* pointer to descriptor array*/ 112 unsigned int max_reply_msg; /* Max size for reply msg */ 113}; 114typedef struct routine_descriptor *routine_descriptor_t; 115 116typedef struct routine_descriptor mig_routine_descriptor; 117typedef mig_routine_descriptor *mig_routine_descriptor_t; 118 119#define MIG_ROUTINE_DESCRIPTOR_NULL ((mig_routine_descriptor_t)0) 120 121typedef struct mig_subsystem { 122 mig_server_routine_t server; /* pointer to demux routine */ 123 mach_msg_id_t start; /* Min routine number */ 124 mach_msg_id_t end; /* Max routine number + 1 */ 125 mach_msg_size_t maxsize; /* Max reply message size */ 126 vm_address_t reserved; /* reserved for MIG use */ 127 mig_routine_descriptor 128 routine[1]; /* Routine descriptor array */ 129} *mig_subsystem_t; 130 131#define MIG_SUBSYSTEM_NULL ((mig_subsystem_t)0) 132 133typedef struct mig_symtab { 134 char *ms_routine_name; 135 int ms_routine_number; 136 void (*ms_routine)(void); /* Since the functions in the 137 * symbol table have unknown 138 * signatures, this is the best 139 * we can do... 140 */ 141} mig_symtab_t; 142 143#ifdef PRIVATE 144 145/* MIG object runtime - not ready for public consumption */ 146 147#ifdef KERNEL_PRIVATE 148 149/* 150 * MIG object runtime definitions 151 * 152 * Conforming MIG subsystems may enable this support to get 153 * significant assistance from the base mig_object_t implementation. 154 * 155 * Support includes: 156 * - Transparency from port manipulation. 157 * - Dymanic port allocation on first "remoting" of an object. 158 * - Reference conversions from object to port and vice versa. 159 * - Automatic port deallocation on no-more-senders. 160 * - Support for multiple server implementations in a single space. 161 * - Messaging bypass for local servers. 162 * - Automatic hookup to base dispatch mechanism. 163 * - General notification support 164 * Coming soon: 165 * - User-level support 166 */ 167typedef unsigned int mig_notify_type_t; 168 169typedef struct MIGIID { 170 unsigned long data1; 171 unsigned short data2; 172 unsigned short data3; 173 unsigned char data4[8]; 174} MIGIID; 175 176typedef struct IMIGObjectVtbl IMIGObjectVtbl; 177typedef struct IMIGNotifyObjectVtbl IMIGNotifyObjectVtbl; 178 179typedef struct IMIGObject { 180 const IMIGObjectVtbl *pVtbl; 181} IMIGObject; 182 183typedef struct IMIGNotifyObject { 184 const IMIGNotifyObjectVtbl *pVtbl; 185} IMIGNotifyObject; 186 187struct IMIGObjectVtbl { 188 kern_return_t (*QueryInterface)( 189 IMIGObject *object, 190 const MIGIID *iid, 191 void **ppv); 192 193 unsigned long (*AddRef)( 194 IMIGObject *object); 195 196 unsigned long (*Release)( 197 IMIGObject *object); 198 199 unsigned long (*GetServer)( 200 IMIGObject *object, 201 mig_server_routine_t *server); 202 203 boolean_t (*RaiseNotification)( 204 IMIGObject *object, 205 mig_notify_type_t notify_type); 206 207 boolean_t (*RequestNotification)( 208 IMIGObject *object, 209 IMIGNotifyObject *notify, 210 mig_notify_type_t notify_type); 211}; 212 213/* 214 * IMIGNotifyObject 215 * 216 * A variant of the IMIGObject interface that is a sink for 217 * MIG notifications. 218 * 219 * A reference is held on both the subject MIGObject and the target 220 * MIGNotifyObject. Because of this, care must be exercised to avoid 221 * reference cycles. Once a notification is raised, the object 222 * reference is returned and the request must be re-requested (if 223 * desired). 224 * 225 * One interesting note: because this interface is itself a MIG 226 * object, one may request notification about state changes in 227 * the MIGNotifyObject itself. 228 */ 229struct IMIGNotifyObjectVtbl { 230 kern_return_t (*QueryInterface)( 231 IMIGNotifyObject *notify, 232 const MIGIID *iid, 233 void **ppv); 234 235 unsigned long (*AddRef)( 236 IMIGNotifyObject *notify); 237 238 unsigned long (*Release)( 239 IMIGNotifyObject *notify); 240 241 unsigned long (*GetServer)( 242 IMIGNotifyObject *notify, 243 mig_server_routine_t *server); 244 245 boolean_t (*RaiseNotification)( 246 IMIGNotifyObject *notify, 247 mig_notify_type_t notify_type); 248 249 boolean_t (*RequestNotification)( 250 IMIGNotifyObject *notify, 251 IMIGNotifyObject *notify_notify, 252 mig_notify_type_t notify_type); 253 254 void (*HandleNotification)( 255 IMIGNotifyObject *notify, 256 IMIGObject *object, 257 mig_notify_type_t notify_type); 258}; 259 260#endif /* KERNEL_PRIVATE */ 261#endif /* PRIVATE */ 262 263__BEGIN_DECLS 264 265/* Client side reply port allocate */ 266extern mach_port_t mig_get_reply_port(void); 267 268/* Client side reply port deallocate */ 269extern void mig_dealloc_reply_port(mach_port_t reply_port); 270 271/* Client side reply port "deallocation" */ 272extern void mig_put_reply_port(mach_port_t reply_port); 273 274/* Bounded string copy */ 275extern int mig_strncpy(char *dest, const char *src, int len); 276 277#ifdef KERNEL_PRIVATE 278 279/* Allocate memory for out-of-stack mig structures */ 280extern char *mig_user_allocate(vm_size_t size); 281 282/* Deallocate memory used for out-of-stack mig structures */ 283extern void mig_user_deallocate(char *data, vm_size_t size); 284 285#else 286 287/* Allocate memory for out-of-line mig structures */ 288extern void mig_allocate(vm_address_t *, vm_size_t); 289 290/* Deallocate memory used for out-of-line mig structures */ 291extern void mig_deallocate(vm_address_t, vm_size_t); 292 293#endif /* KERNEL_PRIVATE */ 294 295__END_DECLS 296 297#endif /* _MACH_MIG_H_ */ 298