X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/0b4e3aa066abc0728aacb4bbeb86f53f9737156e..3a60a9f5b85abb8c2cf24e1926c5c7b3f608a5e2:/osfmk/mach/mig.h diff --git a/osfmk/mach/mig.h b/osfmk/mach/mig.h index 8bc149230..ad6cc4aa2 100644 --- a/osfmk/mach/mig.h +++ b/osfmk/mach/mig.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -30,9 +30,35 @@ #ifndef _MACH_MIG_H_ #define _MACH_MIG_H_ +#include #include #include -#include +#include + +#include + +#if defined(MACH_KERNEL) + +/* Turn MIG type checking on by default for kernel */ +#define __MigTypeCheck 1 +#define __MigKernelSpecificCode 1 +#define _MIG_KERNEL_SPECIFIC_CODE_ 1 + +/* Otherwise check legacy setting (temporary) */ +#elif defined(TypeCheck) + +#define __MigTypeCheck TypeCheck + +#endif /* defined(TypeCheck) */ + +/* + * Pack MIG message structs if we have Power alignment of structs. + * This is an indicator of the need to view shared structs in a + * binary-compatible format - and MIG message structs are no different. + */ +#if __DARWIN_ALIGN_POWER +#define __MigPackStructs 1 +#endif /* * Definition for MIG-generated server stub routines. These routines @@ -58,22 +84,56 @@ typedef mig_routine_t (*mig_server_routine_t) (mach_msg_header_t *InHeadP); */ typedef kern_return_t (*mig_impl_routine_t)(void); -typedef struct mig_routine_descriptor { - mig_stub_routine_t stub_routine; /* Unmarshalling function */ - mach_msg_size_t max_reply_msg; /* Max size for this reply */ -} mig_routine_descriptor; -typedef mig_routine_descriptor *mig_routine_descriptor_t; +typedef mach_msg_type_descriptor_t routine_arg_descriptor; +typedef mach_msg_type_descriptor_t *routine_arg_descriptor_t; +typedef mach_msg_type_descriptor_t *mig_routine_arg_descriptor_t; + +#define MIG_ROUTINE_ARG_DESCRIPTOR_NULL ((mig_routine_arg_descriptor_t)0) + +struct routine_descriptor { + mig_impl_routine_t impl_routine; /* Server work func pointer */ + mig_stub_routine_t stub_routine; /* Unmarshalling func pointer */ + unsigned int argc; /* Number of argument words */ + unsigned int descr_count; /* Number complex descriptors */ + routine_arg_descriptor_t + arg_descr; /* pointer to descriptor array*/ + unsigned int max_reply_msg; /* Max size for reply msg */ +}; +typedef struct routine_descriptor *routine_descriptor_t; + +typedef struct routine_descriptor mig_routine_descriptor; +typedef mig_routine_descriptor *mig_routine_descriptor_t; + +#define MIG_ROUTINE_DESCRIPTOR_NULL ((mig_routine_descriptor_t)0) typedef struct mig_subsystem { - mig_server_routine_t server; /* server routine */ - mach_msg_id_t start; /* Min routine number */ - mach_msg_id_t end; /* Max routine number + 1 */ - mach_msg_size_t max_reply; /* Max reply message size */ - mach_msg_size_t max_request; /* Max request msg size */ - mig_routine_descriptor routine[1]; /* Routine descriptor array */ + mig_server_routine_t server; /* pointer to demux routine */ + mach_msg_id_t start; /* Min routine number */ + mach_msg_id_t end; /* Max routine number + 1 */ + mach_msg_size_t maxsize; /* Max reply message size */ + vm_address_t reserved; /* reserved for MIG use */ + mig_routine_descriptor + routine[1]; /* Routine descriptor array */ } *mig_subsystem_t; -#ifdef KERNEL_PRIVATE +#define MIG_SUBSYSTEM_NULL ((mig_subsystem_t)0) + +typedef struct mig_symtab { + char *ms_routine_name; + int ms_routine_number; + void (*ms_routine)(void); /* Since the functions in the + * symbol table have unknown + * signatures, this is the best + * we can do... + */ +} mig_symtab_t; + +#ifdef PRIVATE + +/* MIG object runtime - not ready for public consumption */ + +#ifdef KERNEL_PRIVATE + /* * MIG object runtime definitions * @@ -92,7 +152,7 @@ typedef struct mig_subsystem { * Coming soon: * - User-level support */ -typedef unsigned int mig_notify_type_t; +typedef unsigned int mig_notify_type_t; typedef struct MIGIID { unsigned long data1; @@ -105,11 +165,11 @@ typedef struct IMIGObjectVtbl IMIGObjectVtbl; typedef struct IMIGNotifyObjectVtbl IMIGNotifyObjectVtbl; typedef struct IMIGObject { - IMIGObjectVtbl *pVtbl; + const IMIGObjectVtbl *pVtbl; } IMIGObject; typedef struct IMIGNotifyObject { - IMIGNotifyObjectVtbl *pVtbl; + const IMIGNotifyObjectVtbl *pVtbl; } IMIGNotifyObject; struct IMIGObjectVtbl { @@ -185,6 +245,41 @@ struct IMIGNotifyObjectVtbl { mig_notify_type_t notify_type); }; +#endif /* KERNEL_PRIVATE */ +#endif /* PRIVATE */ + +__BEGIN_DECLS + +/* Client side reply port allocate */ +extern mach_port_t mig_get_reply_port(void); + +/* Client side reply port deallocate */ +extern void mig_dealloc_reply_port(mach_port_t reply_port); + +/* Client side reply port "deallocation" */ +extern void mig_put_reply_port(mach_port_t reply_port); + +/* Bounded string copy */ +extern int mig_strncpy(char *dest, const char *src, int len); + +#ifdef KERNEL_PRIVATE + +/* Allocate memory for out-of-stack mig structures */ +extern char *mig_user_allocate(vm_size_t size); + +/* Deallocate memory used for out-of-stack mig structures */ +extern void mig_user_deallocate(char *data, vm_size_t size); + +#else + +/* Allocate memory for out-of-line mig structures */ +extern void mig_allocate(vm_address_t *, vm_size_t); + +/* Deallocate memory used for out-of-line mig structures */ +extern void mig_deallocate(vm_address_t, vm_size_t); + #endif /* KERNEL_PRIVATE */ -#endif /* _MACH_MIG_H_ */ +__END_DECLS + +#endif /* _MACH_MIG_H_ */