xref: /dflybsd-src/sys/sys/sysmsg.h (revision bc49aa1be5400e3bdd801519c6936e8947d5d432)
1 /*
2  * SYS/SYSMSG.H
3  *
4  * $DragonFly: src/sys/sys/sysmsg.h,v 1.5 2004/06/04 20:35:39 dillon 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 
46 struct sysmsg *sysmsg_wait(struct proc *p, struct sysmsg *sysmsg, int nonblock);
47 void sysmsg_rundown(struct proc *p, int doabort);
48 
49 #endif
50 
51 /*
52  * The usrmsg holds the userland version of the system call message which
53  * typically preceeds the original user arguments.  This message structure
54  * is typically loaded by the copyin() and adjusted prior to copyout(), but
55  * not used in the nominal running of the system call.
56  */
57 union usrmsg {
58 	struct lwkt_msg umsg;
59 };
60 
61 #ifdef _KERNEL
62 typedef struct sysmsg *sysmsg_t;
63 #define sysmsg_copyout	sysmsg.copyout
64 #define sysmsg_lmsg	sysmsg.lmsg
65 #define sysmsg_result	sysmsg.lmsg.u.ms_result
66 #define sysmsg_lresult	sysmsg.lmsg.u.ms_lresult
67 #define sysmsg_resultp	sysmsg.lmsg.u.ms_resultp
68 #define sysmsg_fds	sysmsg.lmsg.u.ms_fds
69 #define sysmsg_offset	sysmsg.lmsg.u.ms_offset
70 #define sysmsg_result32	sysmsg.lmsg.u.ms_result32
71 #define sysmsg_result64	sysmsg.lmsg.u.ms_result64
72 #endif
73 
74 typedef union usrmsg *usrmsg_t;
75 #define usrmsg_result	usrmsg.umsg.u.ms_result
76 #define usrmsg_lresult	usrmsg.umsg.u.ms_lresult
77 #define usrmsg_resultp	usrmsg.umsg.u.ms_resultp
78 #define usrmsg_fds	usrmsg.umsg.u.ms_fds
79 #define usrmsg_offset	usrmsg.umsg.u.ms_offset
80 #define usrmsg_result32	usrmsg.umsg.u.ms_result32
81 #define usrmsg_result64	usrmsg.umsg.u.ms_result64
82 
83 #endif
84 
85