Async syscall helper
[akaros.git] / user / parlib / syscall.c
index 10f46bb..f5e4e5d 100644 (file)
@@ -46,36 +46,6 @@ ssize_t sys_shared_page_free(void* addr, pid_t p2)
        return ros_syscall(SYS_shared_page_free, addr, p2, 0, 0, 0, 0);
 }
 
-//Write a buffer over the serial port
-ssize_t sys_serial_write(void* buf, size_t len) 
-{
-       return ros_syscall(SYS_serial_write, buf, len, 0, 0, 0, 0);
-}
-
-//Read a buffer over the serial port
-ssize_t sys_serial_read(void* buf, size_t len) 
-{
-       return ros_syscall(SYS_serial_read, buf, len, 0, 0, 0, 0);
-}
-
-//Write a buffer over ethernet
-ssize_t sys_eth_write(void* buf, size_t len) 
-{
-       if (len == 0)
-               return 0;
-       
-       return ros_syscall(SYS_eth_write, buf, len, 0, 0, 0, 0);
-}
-
-//Read a buffer via ethernet
-ssize_t sys_eth_read(void* buf, size_t len) 
-{
-       if (len == 0)
-               return 0;
-               
-       return ros_syscall(SYS_eth_read, buf, len, 0, 0, 0, 0);
-}
-
 void sys_reboot(void)
 {
        ros_syscall(SYS_reboot, 0, 0, 0, 0, 0, 0);
@@ -107,6 +77,11 @@ void *CT(length) sys_mmap(void *SNT addr, size_t length, int prot, int flags,
        return (void*)ros_syscall(SYS_mmap, addr, length, prot, flags, fd, offset);
 }
 
+int sys_provision(int pid, unsigned int res_type, long res_val)
+{
+       return ros_syscall(SYS_provision, pid, res_type, res_val, 0, 0, 0);
+}
+
 int sys_notify(int pid, unsigned int ev_type, struct event_msg *u_msg)
 {
        return ros_syscall(SYS_notify, pid, ev_type, u_msg, 0, 0, 0);
@@ -182,7 +157,32 @@ int sys_change_to_m(void)
        return ros_syscall(SYS_change_to_m, 0, 0, 0, 0, 0, 0);
 }
 
-int sys_poke_ksched(int res_type)
+int sys_poke_ksched(int pid, unsigned int res_type)
 {
-       return ros_syscall(SYS_poke_ksched, res_type, 0, 0, 0, 0, 0);
+       return ros_syscall(SYS_poke_ksched, pid, res_type, 0, 0, 0, 0);
+}
+
+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);
 }