f3df2dcddf01ae9adee41c503c53487337ed53c2
[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 #define __SYSCALL_SSLEN 16
7
8 #ifndef __clang__
9
10 #define __asm_syscall(...) do { \
11         register long r2 __asm__("$2"); \
12         register long r7 __asm__("$7"); \
13         __asm__ __volatile__ ( \
14         "move $2,%2 ; syscall" \
15         : "=&r"(r2), "=r"(r7) : __VA_ARGS__ \
16         : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", \
17           "$14", "$15", "$24", "hi", "lo", "memory"); \
18         return r7 ? -r2 : r2; \
19         } while (0)
20
21 static inline long __syscall0(long n)
22 {
23         register long r25 __asm__("$25") = n;
24         __asm_syscall("r"(r25));
25 }
26
27 static inline long __syscall1(long n, long a)
28 {
29         register long r25 __asm__("$25") = n;
30         register long r4 __asm__("$4") = a;
31         __asm_syscall("r"(r25), "r"(r4));
32 }
33
34 static inline long __syscall2(long n, long a, long b)
35 {
36         register long r25 __asm__("$25") = n;
37         register long r4 __asm__("$4") = a;
38         register long r5 __asm__("$5") = b;
39         __asm_syscall("r"(r25), "r"(r4), "r"(r5));
40 }
41
42 static inline long __syscall3(long n, long a, long b, long c)
43 {
44         register long r25 __asm__("$25") = n;
45         register long r4 __asm__("$4") = a;
46         register long r5 __asm__("$5") = b;
47         register long r6 __asm__("$6") = c;
48         __asm_syscall("r"(r25), "r"(r4), "r"(r5), "r"(r6));
49 }
50
51 static inline long __syscall4(long n, long a, long b, long c, long d)
52 {
53         register long r25 __asm__("$25") = n;
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"(r25), "r"(r4), "r"(r5), "r"(r6), "r"(r7));
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 }