#ifndef _KERN_IPC_MIG_H_
#define _KERN_IPC_MIG_H_
#include <mach/mig.h>
#include <mach/mach_types.h>
#include <mach/message.h>
#include <kern/kern_types.h>
#include <sys/cdefs.h>
#ifdef XNU_KERNEL_PRIVATE
#include <sys/kdebug.h>
#ifdef _MIG_TRACE_PARAMETERS_
#define __BeforeRcvCallTrace(msgid,arg1,arg2,arg3,arg4) \
KERNEL_DEBUG_CONSTANT(KDBG_MIGCODE(msgid) | DBG_FUNC_START, \
(unsigned int)(arg1), \
(unsigned int)(arg2), \
(unsigned int)(arg3), \
(unsigned int)(arg4), \
(unsigned int)(0));
#define __AfterRcvCallTrace(msgid,arg1,arg2,arg3,arg4) \
KERNEL_DEBUG_CONSTANT(KDBG_MIGCODE(msgid) | DBG_FUNC_END, \
(unsigned int)(arg1), \
(unsigned int)(arg2), \
(unsigned int)(arg3), \
(unsigned int)(arg4), \
(unsigned int)(0));
#define __BeforeSimpleCallTrace(msgid,arg1,arg2,arg3,arg4) \
KERNEL_DEBUG_CONSTANT(KDBG_MIGCODE(msgid) | DBG_FUNC_START, \
(unsigned int)(arg1), \
(unsigned int)(arg2), \
(unsigned int)(arg3), \
(unsigned int)(arg4), \
(unsigned int)(0));
#define __AfterSimpleCallTrace(msgid,arg1,arg2,arg3,arg4) \
KERNEL_DEBUG_CONSTANT(KDBG_MIGCODE(msgid) | DBG_FUNC_END, \
(unsigned int)(arg1), \
(unsigned int)(arg2), \
(unsigned int)(arg3), \
(unsigned int)(arg4), \
(unsigned int)(0));
#else
#define __BeforeRcvRpc(msgid, _NAME_) \
KERNEL_DEBUG_CONSTANT(KDBG_MIGCODE(msgid) | DBG_FUNC_START, \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0));
#define __AfterRcvRpc(msgid, _NAME_) \
KERNEL_DEBUG_CONSTANT(KDBG_MIGCODE(msgid) | DBG_FUNC_END, \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0));
#define __BeforeRcvSimple(msgid, _NAME_) \
KERNEL_DEBUG_CONSTANT(KDBG_MIGCODE(msgid) | DBG_FUNC_START, \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0));
#define __AfterRcvSimple(msgid, _NAME_) \
KERNEL_DEBUG_CONSTANT(KDBG_MIGCODE(msgid) | DBG_FUNC_END, \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0));
#endif
#define _MIG_MSGID_INVALID(msgid) \
KERNEL_DEBUG_CONSTANT(MACHDBG_CODE(DBG_MACH_MSGID_INVALID, (msgid)), \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0), \
(unsigned int)(0))
#endif
__BEGIN_DECLS
extern mach_msg_return_t mach_msg_send_from_kernel(
mach_msg_header_t *msg,
mach_msg_size_t send_size);
extern mach_msg_return_t mach_msg_rpc_from_kernel(
mach_msg_header_t *msg,
mach_msg_size_t send_size,
mach_msg_size_t rcv_size);
extern mach_msg_return_t mach_msg_send_from_kernel_with_options(
mach_msg_header_t *msg,
mach_msg_size_t send_size,
mach_msg_option_t option,
mach_msg_timeout_t timeout_val);
__END_DECLS
#ifdef MACH_KERNEL_PRIVATE
extern void mach_msg_receive_continue(void);
extern void mig_init(void) __attribute__((section("__TEXT, initcode")));
typedef struct mig_object {
const IMIGObjectVtbl *pVtbl;
mach_port_t port;
} mig_object_data_t;
typedef struct mig_notify_object {
const IMIGNotifyObjectVtbl *pVtbl;
mach_port_t port;
} mig_notify_object_data_t;
extern kern_return_t mig_object_init(
mig_object_t mig_object,
const IMIGObject *interface);
extern void mig_object_destroy(
mig_object_t mig_object);
extern void mig_object_reference(
mig_object_t mig_object);
extern void mig_object_deallocate(
mig_object_t mig_object);
extern ipc_port_t convert_mig_object_to_port(
mig_object_t mig_object);
extern mig_object_t convert_port_to_mig_object(
ipc_port_t port,
const MIGIID *iid);
boolean_t mig_object_no_senders(
ipc_port_t port,
mach_port_mscount_t mscount);
#endif
#endif