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 86