aarch64: fix CRTJMP in reloc.h
[oweals/musl.git] / 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 #if _MIPSEL || __MIPSEL || __MIPSEL__
11 #define __stat_fix(st) ((st),(void)0)
12 #else
13 #include <sys/stat.h>
14 static inline void __stat_fix(long p)
15 {
16         struct stat *st = (struct stat *)p;
17         st->st_dev >>= 32;
18         st->st_rdev >>= 32;
19 }
20 #endif
21
22 #ifndef __clang__
23
24 static inline long __syscall0(long n)
25 {
26         register long r7 __asm__("$7");
27         register long r2 __asm__("$2");
28         __asm__ __volatile__ (
29                 "addu $2,$0,%2 ; syscall"
30                 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7)
31                 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
32                   "$14", "$15", "$24", "$25", "hi", "lo", "memory");
33         return r7 ? -r2 : r2;
34 }
35
36 static inline long __syscall1(long n, long a)
37 {
38         register long r4 __asm__("$4") = a;
39         register long r7 __asm__("$7");
40         register long r2 __asm__("$2");
41         __asm__ __volatile__ (
42                 "addu $2,$0,%2 ; syscall"
43                 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
44                   "r"(r4)
45                 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
46                   "$14", "$15", "$24", "$25", "hi", "lo", "memory");
47         return r7 ? -r2 : r2;
48 }
49
50 static inline long __syscall2(long n, long a, long b)
51 {
52         register long r4 __asm__("$4") = a;
53         register long r5 __asm__("$5") = b;
54         register long r7 __asm__("$7");
55         register long r2 __asm__("$2");
56         __asm__ __volatile__ (
57                 "addu $2,$0,%2 ; syscall"
58                 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
59                   "r"(r4), "r"(r5)
60                 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
61                   "$14", "$15", "$24", "$25", "hi", "lo", "memory");
62         if (r7) return -r2;
63         long ret = r2;
64         if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
65         return ret;
66 }
67
68 static inline long __syscall3(long n, long a, long b, long c)
69 {
70         register long r4 __asm__("$4") = a;
71         register long r5 __asm__("$5") = b;
72         register long r6 __asm__("$6") = c;
73         register long r7 __asm__("$7");
74         register long r2 __asm__("$2");
75         __asm__ __volatile__ (
76                 "addu $2,$0,%2 ; syscall"
77                 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
78                   "r"(r4), "r"(r5), "r"(r6)
79                 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
80                   "$14", "$15", "$24", "$25", "hi", "lo", "memory");
81         if (r7) return -r2;
82         long ret = r2;
83         if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
84         return ret;
85 }
86
87 static inline long __syscall4(long n, long a, long b, long c, long d)
88 {
89         register long r4 __asm__("$4") = a;
90         register long r5 __asm__("$5") = b;
91         register long r6 __asm__("$6") = c;
92         register long r7 __asm__("$7") = d;
93         register long r2 __asm__("$2");
94         __asm__ __volatile__ (
95                 "addu $2,$0,%2 ; syscall"
96                 : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
97                   "r"(r4), "r"(r5), "r"(r6)
98                 : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
99                   "$14", "$15", "$24", "$25", "hi", "lo", "memory");
100         if (r7) return -r2;
101         long ret = r2;
102         if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
103         if (n == SYS_fstatat) __stat_fix(c);
104         return ret;
105 }
106
107 #else
108
109 static inline long __syscall0(long n)
110 {
111         return (__syscall)(n);
112 }
113
114 static inline long __syscall1(long n, long a)
115 {
116         return (__syscall)(n, a);
117 }
118
119 static inline long __syscall2(long n, long a, long b)
120 {
121         long r2 = (__syscall)(n, a, b);
122         if (r2 > -4096UL) return r2;
123         if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
124         return r2;
125 }
126
127 static inline long __syscall3(long n, long a, long b, long c)
128 {
129         long r2 = (__syscall)(n, a, b, c);
130         if (r2 > -4096UL) return r2;
131         if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
132         return r2;
133 }
134
135 static inline long __syscall4(long n, long a, long b, long c, long d)
136 {
137         long r2 = (__syscall)(n, a, b, c, d);
138         if (r2 > -4096UL) return r2;
139         if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
140         if (n == SYS_fstatat) __stat_fix(c);
141         return r2;
142 }
143
144 #endif
145
146 static inline long __syscall5(long n, long a, long b, long c, long d, long e)
147 {
148         long r2 = (__syscall)(n, a, b, c, d, e);
149         if (r2 > -4096UL) return r2;
150         if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
151         if (n == SYS_fstatat) __stat_fix(c);
152         return r2;
153 }
154
155 static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
156 {
157         long r2 = (__syscall)(n, a, b, c, d, e, f);
158         if (r2 > -4096UL) return r2;
159         if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
160         if (n == SYS_fstatat) __stat_fix(c);
161         return r2;
162 }