#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_IST(KDEBUG_TRACE, \
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_IST(KDEBUG_TRACE, \
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_IST(KDEBUG_TRACE, \
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_IST(KDEBUG_TRACE, \
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_IST(KDEBUG_TRACE, \
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_IST(KDEBUG_TRACE, \
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_IST(KDEBUG_TRACE, \
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_IST(KDEBUG_TRACE, \
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_IST(KDEBUG_TRACE, \
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_proper(
mach_msg_header_t *msg,
mach_msg_size_t send_size);
#define mach_msg_send_from_kernel mach_msg_send_from_kernel_proper
extern mach_msg_return_t
mach_msg_rpc_from_kernel_proper(
mach_msg_header_t *msg,
mach_msg_size_t send_size,
mach_msg_size_t rcv_size);
#define mach_msg_rpc_from_kernel mach_msg_rpc_from_kernel_proper
#ifdef XNU_KERNEL_PRIVATE
mach_msg_return_t kernel_mach_msg_rpc(
mach_msg_header_t *msg,
mach_msg_size_t send_size,
mach_msg_size_t rcv_size,
boolean_t legacy,
boolean_t *message_moved);
#endif
extern void
mach_msg_destroy_from_kernel_proper(
mach_msg_header_t *msg);
#define mach_msg_destroy_from_kernel mach_msg_destroy_from_kernel_proper
#ifdef XNU_KERNEL_PRIVATE
extern mach_msg_return_t mach_msg_send_from_kernel_with_options_legacy(
mach_msg_header_t *msg,
mach_msg_size_t send_size,
mach_msg_option_t option,
mach_msg_timeout_t timeout_val);
extern mach_msg_return_t kernel_mach_msg_send(
mach_msg_header_t *msg,
mach_msg_size_t send_size,
mach_msg_option_t option,
mach_msg_timeout_t timeout_val,
boolean_t *message_moved);
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)
__XNU_INTERNAL(mach_msg_send_from_kernel_with_options);
#else
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);
#endif
__END_DECLS
#ifdef MACH_KERNEL_PRIVATE
extern void mach_msg_receive_continue(void);
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);
extern void mig_object_no_senders(
ipc_port_t port);
#endif
#endif