Use vm_page_hold() instead of vm_page_wire() for exec's mapping of the first
[dragonfly.git] / sys / sys / msgport.h
CommitLineData
ece04fd0
MD
1/*
2 * SYS/MSGPORT.H
3 *
4 * Implements LWKT messages and ports.
5 *
e7906ee5 6 * $DragonFly: src/sys/sys/msgport.h,v 1.16 2004/04/15 00:50:05 dillon Exp $
ece04fd0
MD
7 */
8
9#ifndef _SYS_MSGPORT_H_
10#define _SYS_MSGPORT_H_
11
12#ifndef _SYS_QUEUE_H_
13#include <sys/queue.h> /* TAILQ_* macros */
14#endif
05220613
MD
15#ifndef _SYS_STDINT_H_
16#include <sys/stdint.h>
17#endif
ece04fd0
MD
18
19struct lwkt_msg;
20struct lwkt_port;
335dda38 21struct thread;
ece04fd0
MD
22
23typedef struct lwkt_msg *lwkt_msg_t;
24typedef struct lwkt_port *lwkt_port_t;
25
335dda38
MD
26typedef TAILQ_HEAD(lwkt_msg_queue, lwkt_msg) lwkt_msg_queue;
27
ece04fd0
MD
28/*
29 * The standard message and port structure for communications between
30 * threads. See kern/lwkt_msgport.c for documentation on how messages and
31 * ports work.
a64ba182 32 *
e7906ee5
MD
33 * For the most part a message may only be manipulated by whomever currently
34 * owns it, which generally means the originating port if the message has
35 * not been sent yet or has been replied, and the target port if the message
36 * has been sent and/or is undergoing processing.
37 *
38 * The one exception to this rule is an abort. Aborts must be initiated
39 * by the originator and may 'chase' the target (especially if a message
40 * is being forwarded), potentially even 'chase' the message all the way
41 * back to the originator if it races against the target replying the
42 * message. The ms_abort_port field is the only field that may be modified
43 * by the originator or intermediate target (when the abort is chasing
44 * a forwarding or reply op). An abort may cause a reply to be delayed
45 * until the abort catches up to it.
46 *
47 * Finally, note that an abort can requeue a message to its current target
48 * port after the message has been pulled off of it, so you CANNOT use
49 * ms_node for your own purposes after you have pulled a message request
50 * off its port.
51 *
a64ba182 52 * NOTE! 64-bit-align this structure.
ece04fd0
MD
53 */
54typedef struct lwkt_msg {
e7906ee5 55 TAILQ_ENTRY(lwkt_msg) ms_node; /* link node (see note above) */
4fd10eb6 56 union {
c7114eea 57 struct lwkt_msg *ms_next; /* chaining / cache */
245e4f17 58 union sysunion *ms_sysunnext; /* chaining / cache */
c7114eea 59 struct lwkt_msg *ms_umsg; /* user message (UVA address) */
4fd10eb6 60 } opaque;
df2244e3 61 lwkt_port_t ms_target_port; /* current target or relay port */
e7906ee5
MD
62 lwkt_port_t ms_reply_port; /* async replies returned here */
63 lwkt_port_t ms_abort_port; /* abort chasing port */
df2244e3
MD
64 int ms_cmd; /* message command */
65 int ms_flags; /* message flags */
66#define ms_copyout_start ms_msgsize
f6bf3af1 67 int ms_msgsize; /* size of message */
df2244e3 68 int ms_error; /* positive error code or 0 */
a64ba182 69 union {
df2244e3 70 void *ms_resultp; /* misc pointer data or result */
90b9818c
MD
71 int ms_result; /* standard 'int'eger result */
72 long ms_lresult; /* long result */
73 int ms_fds[2]; /* two int bit results */
05220613
MD
74 __int32_t ms_result32; /* 32 bit result */
75 __int64_t ms_result64; /* 64 bit result */
76 __off_t ms_offset; /* off_t result */
a64ba182 77 } u;
245e4f17 78#define ms_copyout_end ms_pad[0]
a64ba182 79 int ms_pad[2]; /* future use */
ece04fd0
MD
80} lwkt_msg;
81
245e4f17
MD
82#define ms_copyout_size (offsetof(struct lwkt_msg, ms_copyout_end) - offsetof(struct lwkt_msg, ms_copyout_start))
83
ece04fd0 84#define MSGF_DONE 0x0001 /* asynch message is complete */
e7906ee5 85#define MSGF_REPLY1 0x0002 /* asynch message has been returned */
ece04fd0
MD
86#define MSGF_QUEUED 0x0004 /* message has been queued sanitychk */
87#define MSGF_ASYNC 0x0008 /* sync/async hint */
df2244e3 88#define MSGF_ABORTED 0x0010 /* message was aborted flag */
e7906ee5
MD
89#define MSGF_PCATCH 0x0020 /* catch proc signal while waiting */
90#define MSGF_REPLY2 0x0040 /* reply processed by rport cpu */
ece04fd0 91
335dda38
MD
92#define MSG_CMD_CDEV 0x00010000
93#define MSG_CMD_VFS 0x00020000
94#define MSG_CMD_SYSCALL 0x00030000
bf82f9b7 95#define MSG_CMD_NETMSG 0x00040000
335dda38
MD
96#define MSG_SUBCMD_MASK 0x0000FFFF
97
9eeaa8a9
JH
98#ifdef _KERNEL
99#ifdef MALLOC_DECLARE
100MALLOC_DECLARE(M_LWKTMSG);
101#endif
102#endif
103
ece04fd0
MD
104typedef struct lwkt_port {
105 lwkt_msg_queue mp_msgq;
106 int mp_flags;
245e4f17 107 int mp_refs; /* references to port structure */
335dda38 108 struct thread *mp_td;
df2244e3
MD
109 int (*mp_putport)(lwkt_port_t, lwkt_msg_t);
110 void * (*mp_waitport)(lwkt_port_t, lwkt_msg_t);
111 void (*mp_replyport)(lwkt_port_t, lwkt_msg_t);
112 void (*mp_abortport)(lwkt_port_t, lwkt_msg_t);
ece04fd0
MD
113} lwkt_port;
114
115#define MSGPORTF_WAITING 0x0001
116
df2244e3
MD
117/*
118 * These functions are good for userland as well as the kernel. The
119 * messaging function support for userland is provided by the kernel's
120 * kern/lwkt_msgport.c. The port functions are provided by userland.
121 */
984ccc17
MD
122void lwkt_initport(lwkt_port_t, struct thread *);
123void lwkt_sendmsg(lwkt_port_t, lwkt_msg_t);
124int lwkt_domsg(lwkt_port_t, lwkt_msg_t);
e7906ee5
MD
125int lwkt_forwardmsg(lwkt_port_t, lwkt_msg_t);
126void lwkt_abortmsg(lwkt_msg_t);
984ccc17
MD
127void *lwkt_getport(lwkt_port_t);
128
129int lwkt_default_putport(lwkt_port_t port, lwkt_msg_t msg);
130void *lwkt_default_waitport(lwkt_port_t port, lwkt_msg_t msg);
131void lwkt_default_replyport(lwkt_port_t port, lwkt_msg_t msg);
132void lwkt_default_abortport(lwkt_port_t port, lwkt_msg_t msg);
ece04fd0 133
ece04fd0 134#endif