All local system calls are asynchronous (XCC)
[akaros.git] / kern / arch / sparc / ros / syscall.h
1 #ifndef _ROS_ARCH_SYSCALL_H
2 #define _ROS_ARCH_SYSCALL_H
3
4 #ifndef ROS_KERNEL
5
6 #include <errno.h>
7
8 static inline long __attribute__((always_inline))
9 __ros_arch_syscall(long _num, long _a0, long _a1, long _a2, long _a3, long _a4)
10 {
11         register long num asm("g1") = _num;
12         register long a0 asm("o0") = _a0, a1 asm("o1") = _a1;
13         register long a2 asm("o2") = _a2, a3 asm("o3") = _a3;
14         register long a4 asm("o4") = _a4;
15
16         asm volatile("ta 8" : "=r"(a0),"=r"(a1)
17                      : "r"(num),"0"(a0),"1"(a1),"r"(a2),"r"(a3),"r"(a4));
18
19         // TODO: gut errno
20         // move a1, a2 into regular variables so they're volatile across
21         // procedure calls (of which errno is one)
22         long ret = a0, err = a1;
23         if(err != 0)
24                 errno = err;
25
26          return ret;
27 }
28
29 #endif /* ifndef ROS_KERNEL */
30
31 #endif