21 |
#include "vm-object.h" |
#include "vm-object.h" |
22 |
#include "host.h" |
#include "host.h" |
23 |
#include "eventcnt.h" |
#include "eventcnt.h" |
24 |
|
#include "pager-extern.h" |
25 |
|
|
26 |
typedef struct thread *thread_t; |
static inline struct task * |
27 |
typedef struct task *task_t; |
convert_port_to_task (void *arg) |
|
typedef struct vm_object *vm_object_t; |
|
|
typedef struct eventcnt *eventcnt_t; |
|
|
|
|
|
#ifndef TRUE |
|
|
# define TRUE 1 |
|
|
#endif |
|
|
|
|
|
#ifndef FALSE |
|
|
# define FALSE 0 |
|
|
#endif |
|
|
|
|
|
struct std_mfield_desc |
|
28 |
{ |
{ |
29 |
rtmk_msg_type_t type; |
struct ipc_port *port = arg; |
|
struct ipc_port *port; |
|
|
}; |
|
|
|
|
|
static inline kern_return_t convert_port_to_task (rtmk_msg_type_t **msgtp, |
|
|
struct task **task) |
|
|
{ |
|
|
struct std_mfield_desc *mfield = (struct std_mfield_desc *) *msgtp; |
|
|
struct ipc_port *port = mfield->port; |
|
|
|
|
|
/* First check type. */ |
|
30 |
if (port->kobject.type != IPC_KOBJECT_TYPE_TASK) |
if (port->kobject.type != IPC_KOBJECT_TYPE_TASK) |
31 |
return KERN_INVALID_ARGUMENT; |
return 0; |
32 |
|
return (struct task *) port->kobject.port; |
|
*task = (struct task *) port->kobject.port; |
|
|
*msgtp = (rtmk_msg_type_t *) (mfield + 1); |
|
|
return KERN_SUCCESS; |
|
33 |
} |
} |
34 |
|
|
35 |
static inline kern_return_t convert_task_to_port (rtmk_msg_type_t **msgtp, |
static inline struct ipc_port * |
36 |
struct task *task) |
convert_task_to_port (void *arg) |
37 |
{ |
{ |
38 |
struct std_mfield_desc *mfield = (struct std_mfield_desc *) *msgtp; |
struct task *task = arg; |
39 |
struct rtmk_msg_type type = |
return task->task_port; |
|
{ |
|
|
RTMK_MSG_TYPE_COPY_SEND, 32, 1, 0, 0, 0, 1 |
|
|
}; |
|
|
|
|
|
mfield->type = type; |
|
|
mfield->port = task->task_port; |
|
|
|
|
|
*msgtp = (rtmk_msg_type_t *) (mfield + 1); |
|
|
return KERN_SUCCESS; |
|
40 |
} |
} |
41 |
|
|
|
static inline kern_return_t convert_port_to_thread (rtmk_msg_type_t **msgtp, |
|
|
struct thread **thread) |
|
|
{ |
|
|
struct std_mfield_desc *mfield = (struct std_mfield_desc *) *msgtp; |
|
|
struct ipc_port *port = mfield->port; |
|
42 |
|
|
43 |
/* First check type. */ |
static inline struct thread * |
44 |
|
convert_port_to_thread (void *arg) |
45 |
|
{ |
46 |
|
struct ipc_port *port = arg; |
47 |
if (port->kobject.type != IPC_KOBJECT_TYPE_THREAD) |
if (port->kobject.type != IPC_KOBJECT_TYPE_THREAD) |
48 |
return KERN_INVALID_ARGUMENT; |
return 0; |
49 |
|
return (struct thread *) port->kobject.port; |
|
*thread = (thread_t) port->kobject.port; |
|
|
*msgtp = (rtmk_msg_type_t *) (mfield + 1); |
|
|
return KERN_SUCCESS; |
|
50 |
} |
} |
51 |
|
|
52 |
static inline kern_return_t convert_thread_to_port (rtmk_msg_type_t **msgtp, |
static inline struct ipc_port * |
53 |
struct thread *thread) |
convert_thread_to_port (void *arg) |
54 |
{ |
{ |
55 |
struct std_mfield_desc *mfield = (struct std_mfield_desc *) *msgtp; |
struct thread *thread = arg; |
56 |
struct rtmk_msg_type type = |
return thread->thread_port; |
|
{ |
|
|
RTMK_MSG_TYPE_COPY_SEND, 32, 1, 0, 0, 0, 1 |
|
|
}; |
|
|
|
|
|
mfield->type = type; |
|
|
mfield->port = thread->thread_port; |
|
|
|
|
|
*msgtp = (rtmk_msg_type_t *) (mfield + 1); |
|
|
return KERN_SUCCESS; |
|
57 |
} |
} |
58 |
|
|
|
static inline kern_return_t convert_port_to_object (rtmk_msg_type_t **msgtp, |
|
|
struct vm_object **objectp) |
|
|
{ |
|
|
struct std_mfield_desc *mfield = (struct std_mfield_desc *) *msgtp; |
|
|
struct ipc_port *port = mfield->port; |
|
59 |
|
|
60 |
/* First check type. */ |
static inline struct eventcnt * |
61 |
if (port->kobject.type != IPC_KOBJECT_TYPE_MEMORY_OBJECT) |
convert_port_to_eventcnt (void *arg) |
|
return KERN_INVALID_ARGUMENT; |
|
|
|
|
|
*objectp = (struct vm_object *) port->kobject.port; |
|
|
*msgtp = (rtmk_msg_type_t *) (mfield + 1); |
|
|
return KERN_SUCCESS; |
|
|
} |
|
|
|
|
|
static inline kern_return_t convert_object_to_port (rtmk_msg_type_t **msgtp, |
|
|
struct vm_object *object) |
|
62 |
{ |
{ |
63 |
struct std_mfield_desc *mfield = (struct std_mfield_desc *) *msgtp; |
struct ipc_port *port = arg; |
64 |
struct rtmk_msg_type type = |
if (port->kobject.type != IPC_KOBJECT_TYPE_EVENTCNT) |
65 |
{ |
return 0; |
66 |
RTMK_MSG_TYPE_COPY_SEND, 32, 1, 0, 0, 0, 1 |
return (struct eventcnt *) port->kobject.port; |
|
}; |
|
|
|
|
|
mfield->type = type; |
|
|
mfield->port = object->object_port; |
|
|
|
|
|
*msgtp = (rtmk_msg_type_t *) (mfield + 1); |
|
|
return KERN_SUCCESS; |
|
67 |
} |
} |
68 |
|
|
69 |
static inline kern_return_t convert_evc_to_port (rtmk_msg_type_t **msgtp, |
static inline struct ipc_port * |
70 |
struct eventcnt *evc) |
convert_eventcnt_to_port (void *arg) |
71 |
{ |
{ |
72 |
struct std_mfield_desc *mfield = (struct std_mfield_desc *) *msgtp; |
struct eventcnt *eventcnt = arg; |
73 |
struct rtmk_msg_type type = |
return eventcnt->port_self; |
|
{ |
|
|
RTMK_MSG_TYPE_COPY_SEND, 32, 1, 0, 0, 0, 1 |
|
|
}; |
|
|
|
|
|
mfield->type = type; |
|
|
mfield->port = evc->port_self; |
|
|
|
|
|
*msgtp = (rtmk_msg_type_t *) (mfield + 1); |
|
|
return KERN_SUCCESS; |
|
74 |
} |
} |
75 |
|
|
|
|
|
|
static inline kern_return_t convert_port_to_evc (rtmk_msg_type_t **msgtp, |
|
|
struct eventcnt **evcp) |
|
|
{ |
|
|
struct std_mfield_desc *mfield = (struct std_mfield_desc *) *msgtp; |
|
|
struct ipc_port *port = mfield->port; |
|
|
|
|
|
/* First check type. */ |
|
|
if (port->kobject.type != IPC_KOBJECT_TYPE_EVENTCNT) |
|
|
return KERN_INVALID_ARGUMENT; |
|
|
|
|
|
*evcp = (struct eventcnt *) port->kobject.port; |
|
|
*msgtp = (rtmk_msg_type_t *) (mfield + 1); |
|
|
return KERN_SUCCESS; |
|
|
} |
|