e62c33985486abf52ea662cff157db73c6647374
[musl] / arch / mips / syscall_arch.h
1 #define __SYSCALL_LL_E(x) \
2 ((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
3 ((union { long long ll; long l[2]; }){ .ll = x }).l[1]
4 #define __SYSCALL_LL_O(x) 0, __SYSCALL_LL_E((x))
5
6 long (__syscall)(long, ...);
7
8 #define SYSCALL_RLIM_INFINITY (-1UL/2)
9
10 #ifndef __clang__
11
12 #define __asm_syscall(...) do { \
13         register long r2 __asm__("$2"); \
14         __asm__ __volatile__ ( \
15         "addu $2,$0,%2 ; syscall" \
16         : "=&r"(r2), "=r"(r7) : "ir"(n), __VA_ARGS__, "0"(r2), "1"(r7) \
17         : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", \
18           "$14", "$15", "$24", "$25", "hi", "lo", "memory"); \
19         return r7 ? -r2 : r2; \
20         } while (0)
21
22 static inline long __syscall0(long n)
23 {
24         register long r7 __asm__("$7");
25         __asm_syscall("i"(0));
26 }
27
28 static inline long __syscall1(long n, long a)
29 {
30         register long r4 __asm__("$4") = a;
31         register long r7 __asm__("$7");
32         __asm_syscall("r"(r4));
33 }
34
35 static inline long __syscall2(long n, long a, long b)
36 {
37         register long r4 __asm__("$4") = a;
38         register long r5 __asm__("$5") = b;
39         register long r7 __asm__("$7");
40         __asm_syscall("r"(r4), "r"(r5));
41 }
42
43 static inline long __syscall3(long n, long a, long b, long c)
44 {
45         register long r4 __asm__("$4") = a;
46         register long r5 __asm__("$5") = b;
47         register long r6 __asm__("$6") = c;
48         register long r7 __asm__("$7");
49         __asm_syscall("r"(r4), "r"(r5), "r"(r6));
50 }
51
52 static inline long __syscall4(long n, long a, long b, long c, long d)
53 {
54         register long r4 __asm__("$4") = a;
55         register long r5 __asm__("$5") = b;
56         register long r6 __asm__("$6") = c;
57         register long r7 __asm__("$7") = d;
58         __asm_syscall("r"(r4), "r"(r5), "r"(r6));
59 }
60
61 #else
62
63 static inline long __syscall0(long n)
64 {
65         return (__syscall)(n);
66 }
67
68 static inline long __syscall1(long n, long a)
69 {
70         return (__syscall)(n, a);
71 }
72
73 static inline long __syscall2(long n, long a, long b)
74 {
75         return (__syscall)(n, a, b);
76 }
77
78 static inline long __syscall3(long n, long a, long b, long c)
79 {
80         return (__syscall)(n, a, b, c);
81 }
82
83 static inline long __syscall4(long n, long a, long b, long c, long d)
84 {
85         return (__syscall)(n, a, b, c, d);
86 }
87
88 #endif
89
90 static inline long __syscall5(long n, long a, long b, long c, long d, long e)
91 {
92         return (__syscall)(n, a, b, c, d, e);
93 }
94
95 static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
96 {
97         return (__syscall)(n, a, b, c, d, e, f);
98 }