Add a helper for async syscalls
[akaros.git] / user / parlib / syscall.c
index 92f14a7..2134dcf 100644 (file)
@@ -186,3 +186,24 @@ void syscall_async(struct syscall *sysc, unsigned long num, ...)
        va_end(args);
        __ros_arch_syscall((long)sysc, 1);
 }
+
+void syscall_async_evq(struct syscall *sysc, struct event_queue *evq,
+                       unsigned long num, ...)
+{
+       va_list args;
+
+       sysc->num = num;
+       atomic_set(&sysc->flags, SC_UEVENT);
+       sysc->ev_q = evq;
+       /* 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);
+}