Fixes bug in cpu_relax_vc()
[akaros.git] / user / parlib / syscall.c
index 960d4d4..802d10f 100644 (file)
@@ -56,14 +56,15 @@ void sys_yield(bool being_nice)
        ros_syscall(SYS_yield, being_nice, 0, 0, 0, 0, 0);
 }
 
-int sys_proc_create(char *path, size_t path_l, char *argv[], char *envp[])
+int sys_proc_create(char *path, size_t path_l, char *argv[], char *envp[],
+                    int flags)
 {
        struct procinfo pi;
        if (procinfo_pack_args(&pi, argv, envp)) {
                errno = ENOMEM;
                return -1;
        }
-       return ros_syscall(SYS_proc_create, path, path_l, &pi, 0, 0, 0);
+       return ros_syscall(SYS_proc_create, path, path_l, &pi, flags, 0, 0);
 }
 
 int sys_proc_run(int pid)
@@ -166,3 +167,28 @@ int sys_abort_sysc(struct syscall *sysc)
 {
        return ros_syscall(SYS_abort_sysc, sysc, 0, 0, 0, 0, 0);
 }
+
+int sys_abort_sysc_fd(int fd)
+{
+       return ros_syscall(SYS_abort_sysc_fd, fd, 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);
+}