Async syscall helper
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 18 Feb 2014 01:59:40 +0000 (17:59 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 18 Feb 2014 03:49:30 +0000 (19:49 -0800)
user/parlib/include/parlib.h
user/parlib/syscall.c

index 6322287..11b8ace 100644 (file)
@@ -55,6 +55,8 @@ int         sys_change_to_m(void);
 int         sys_poke_ksched(int pid, unsigned int res_type);
 int         sys_abort_sysc(struct syscall *sysc);
 
+long           syscall_async(struct syscall *sysc, unsigned long num, ...);
+
 void           init_posix_signals(void);       /* in signal.c */
 #ifdef __cplusplus
 }
index 960d4d4..f5e4e5d 100644 (file)
@@ -166,3 +166,23 @@ int sys_abort_sysc(struct syscall *sysc)
 {
        return ros_syscall(SYS_abort_sysc, sysc, 0, 0, 0, 0, 0);
 }
+
+long syscall_async(struct syscall *sysc, unsigned long num, ...)
+{
+       va_list args;
+
+       sysc->num = num;
+       sysc->flags = 0;
+       sysc->ev_q = 0;         /* not necessary, but good for debugging */
+       /* This is a little dangerous, since we'll usually pull more args than were
+        * passed in, ultimately reading gibberish off the stack. */
+       va_start(args, num);
+       sysc->arg0 = va_arg(args, long);
+       sysc->arg1 = va_arg(args, long);
+       sysc->arg2 = va_arg(args, long);
+       sysc->arg3 = va_arg(args, long);
+       sysc->arg4 = va_arg(args, long);
+       sysc->arg5 = va_arg(args, long);
+       va_end(args);
+       __ros_arch_syscall((long)sysc, 1);
+}