VFS messaging/interfacing work stage 5/99. Start work on the new
[dragonfly.git] / sys / sys / sysmsg.h
1 /*
2  * SYS/SYSMSG.H
3  *
4  * $DragonFly: src/sys/sys/sysmsg.h,v 1.6 2004/08/12 19:59:30 eirikn Exp $
5  */
6
7 #ifndef _SYS_SYSMSG_H_
8 #define _SYS_SYSMSG_H_
9
10 #ifdef _KERNEL
11
12 #ifndef _SYS_CALLOUT_H_
13 #include <sys/callout.h>        /* for struct callout */
14 #endif
15 #ifndef _SYS_TIME_H_
16 #include <sys/time.h>           /* for struct timespec */
17 #endif
18
19 /*
20  * The sysmsg holds the kernelland version of a system call.
21  * It typically preceeds the usrmsg and syscall arguments in sysunion
22  * (see sys/sysunion.h).  Note that msgq field is used by the governing
23  * process to record a system call that returns EASYNC in order to be able
24  * to properly abort and/or wait on it in exit1().  This is different from
25  * any localized queueing of the LWKT message that the syscall itself might
26  * do.
27  */
28 union sysunion;
29
30 struct sysmsg {
31         struct lwkt_msg lmsg;
32         void            (*copyout)(union sysunion *sysun);
33         TAILQ_ENTRY(sysmsg)     msgq;
34         union {
35             struct sysmsg_sleep {
36                 struct lwkt_msg lmsg;
37                 struct timespec rmt;
38                 struct timespec rqt;
39                 struct callout  timer;
40             } sleep;
41         } sm;
42 };
43
44 struct proc;
45 union sysunion;
46
47 struct sysmsg *sysmsg_wait(struct proc *p, struct sysmsg *sysmsg, int nonblock);
48 void sysmsg_rundown(struct proc *p, int doabort);
49
50 #endif
51
52 /*
53  * The usrmsg holds the userland version of the system call message which
54  * typically preceeds the original user arguments.  This message structure
55  * is typically loaded by the copyin() and adjusted prior to copyout(), but
56  * not used in the nominal running of the system call.
57  */
58 union usrmsg {
59         struct lwkt_msg umsg;
60 };
61
62 #ifdef _KERNEL
63 typedef struct sysmsg *sysmsg_t;
64 #define sysmsg_copyout  sysmsg.copyout
65 #define sysmsg_lmsg     sysmsg.lmsg
66 #define sysmsg_result   sysmsg.lmsg.u.ms_result
67 #define sysmsg_lresult  sysmsg.lmsg.u.ms_lresult
68 #define sysmsg_resultp  sysmsg.lmsg.u.ms_resultp
69 #define sysmsg_fds      sysmsg.lmsg.u.ms_fds
70 #define sysmsg_offset   sysmsg.lmsg.u.ms_offset
71 #define sysmsg_result32 sysmsg.lmsg.u.ms_result32
72 #define sysmsg_result64 sysmsg.lmsg.u.ms_result64
73 #endif
74
75 typedef union usrmsg *usrmsg_t;
76 #define usrmsg_result   usrmsg.umsg.u.ms_result
77 #define usrmsg_lresult  usrmsg.umsg.u.ms_lresult
78 #define usrmsg_resultp  usrmsg.umsg.u.ms_resultp
79 #define usrmsg_fds      usrmsg.umsg.u.ms_fds
80 #define usrmsg_offset   usrmsg.umsg.u.ms_offset
81 #define usrmsg_result32 usrmsg.umsg.u.ms_result32
82 #define usrmsg_result64 usrmsg.umsg.u.ms_result64
83
84 #endif
85