7b75db44918b838c4174575c07d727e37d21bd76
[akaros.git] / kern / arch / sparc / ros / syscall.h
1 #include <errno.h>
2
3 #ifndef _ROS_ARCH_SYSCALL_H
4 #define _ROS_ARCH_SYSCALL_H
5
6 #ifndef ROS_KERNEL
7
8 static inline long __attribute__((always_inline))
9 __ros_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         // move a1, a2 into regular variables so they're volatile across
20         // procedure calls
21         long ret = a0, err = a1;
22         if(err != 0)
23                 __set_errno(err);
24
25          return ret;
26 }
27
28 #endif /* ifndef ROS_KERNEL */
29
30 #endif