clean up mips64/n32 syscall asm constraints
[musl] / arch / mips64 / syscall_arch.h
1 #define __SYSCALL_LL_E(x) (x)
2 #define __SYSCALL_LL_O(x) (x)
3
4 #define SYSCALL_RLIM_INFINITY (-1UL/2)
5
6 #include <sys/stat.h>
7 struct kernel_stat {
8         unsigned int st_dev;
9         unsigned int __pad1[3];
10         unsigned long long st_ino;
11         unsigned int st_mode;
12         unsigned int st_nlink;
13         int st_uid;
14         int st_gid;
15         unsigned int st_rdev;
16         unsigned int __pad2[3];
17         long long st_size;
18         unsigned int st_atime_sec;
19         unsigned int st_atime_nsec;
20         unsigned int st_mtime_sec;
21         unsigned int st_mtime_nsec;
22         unsigned int st_ctime_sec;
23         unsigned int st_ctime_nsec;
24         unsigned int st_blksize;
25         unsigned int __pad3;
26         unsigned long long st_blocks;
27 };
28
29 static void __stat_fix(struct kernel_stat *kst, struct stat *st)
30 {
31         st->st_dev = kst->st_dev;
32         st->st_ino = kst->st_ino;
33         st->st_mode = kst->st_mode;
34         st->st_nlink = kst->st_nlink;
35         st->st_uid = kst->st_uid;
36         st->st_gid = kst->st_gid;
37         st->st_rdev = kst->st_rdev;
38         st->st_size = kst->st_size;
39         st->st_atim.tv_sec = kst->st_atime_sec;
40         st->st_atim.tv_nsec = kst->st_atime_nsec;
41         st->st_mtim.tv_sec = kst->st_mtime_sec;
42         st->st_mtim.tv_nsec = kst->st_mtime_nsec;
43         st->st_ctim.tv_sec = kst->st_ctime_sec;
44         st->st_ctim.tv_nsec = kst->st_ctime_nsec;
45         st->st_blksize = kst->st_blksize;
46         st->st_blocks = kst->st_blocks;
47 }
48
49 #define SYSCALL_CLOBBERLIST \
50         "$1", "$3", "$10", "$11", "$12", "$13", \
51         "$14", "$15", "$24", "$25", "hi", "lo", "memory"
52
53 static inline long __syscall0(long n)
54 {
55         register long r7 __asm__("$7");
56         register long r2 __asm__("$2") = n;
57         __asm__ __volatile__ (
58                 "syscall"
59                 : "+&r"(r2), "=r"(r7)
60                 :
61                 : SYSCALL_CLOBBERLIST);
62         return r7 ? -r2 : r2;
63 }
64
65 static inline long __syscall1(long n, long a)
66 {
67         register long r4 __asm__("$4") = a;
68         register long r7 __asm__("$7");
69         register long r2 __asm__("$2") = n;
70         __asm__ __volatile__ (
71                 "syscall"
72                 : "+&r"(r2), "=r"(r7)
73                 : "r"(r4)
74                 : SYSCALL_CLOBBERLIST);
75         return r7 ? -r2 : r2;
76 }
77
78 static inline long __syscall2(long n, long a, long b)
79 {
80         struct kernel_stat kst;
81         long ret;
82         register long r4 __asm__("$4") = a;
83         register long r5 __asm__("$5") = b;
84         register long r7 __asm__("$7");
85         register long r2 __asm__("$2") = n;
86
87         if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
88                 r5 = (long) &kst;
89
90         __asm__ __volatile__ (
91                 "syscall"
92                 : "+&r"(r2), "=r"(r7)
93                 : "r"(r4), "r"(r5)
94                 : SYSCALL_CLOBBERLIST);
95
96         if (r7) return -r2;
97         ret = r2;
98
99         if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
100                 __stat_fix(&kst, (struct stat *)b);
101
102         return ret;
103 }
104
105 static inline long __syscall3(long n, long a, long b, long c)
106 {
107         struct kernel_stat kst;
108         long ret;
109         register long r4 __asm__("$4") = a;
110         register long r5 __asm__("$5") = b;
111         register long r6 __asm__("$6") = c;
112         register long r7 __asm__("$7");
113         register long r2 __asm__("$2") = n;
114
115         if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
116                 r5 = (long) &kst;
117
118         __asm__ __volatile__ (
119                 "syscall"
120                 : "+&r"(r2), "=r"(r7)
121                 : "r"(r4), "r"(r5), "r"(r6)
122                 : SYSCALL_CLOBBERLIST);
123
124         if (r7) return -r2;
125         ret = r2;
126
127         if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
128                 __stat_fix(&kst, (struct stat *)b);
129
130         return ret;
131 }
132
133 static inline long __syscall4(long n, long a, long b, long c, long d)
134 {
135         struct kernel_stat kst;
136         long ret;
137         register long r4 __asm__("$4") = a;
138         register long r5 __asm__("$5") = b;
139         register long r6 __asm__("$6") = c;
140         register long r7 __asm__("$7") = d;
141         register long r2 __asm__("$2") = n;
142
143         if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
144                 r5 = (long) &kst;
145         if (n == SYS_newfstatat)
146                 r6 = (long) &kst;
147
148         __asm__ __volatile__ (
149                 "syscall"
150                 : "+&r"(r2), "+r"(r7)
151                 : "r"(r4), "r"(r5), "r"(r6)
152                 : SYSCALL_CLOBBERLIST);
153
154         if (r7) return -r2;
155         ret = r2;
156
157         if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
158                 __stat_fix(&kst, (struct stat *)b);
159         if (n == SYS_newfstatat)
160                 __stat_fix(&kst, (struct stat *)c);
161
162         return ret;
163 }
164
165 static inline long __syscall5(long n, long a, long b, long c, long d, long e)
166 {
167         struct kernel_stat kst;
168         long ret;
169         register long r4 __asm__("$4") = a;
170         register long r5 __asm__("$5") = b;
171         register long r6 __asm__("$6") = c;
172         register long r7 __asm__("$7") = d;
173         register long r8 __asm__("$8") = e;
174         register long r2 __asm__("$2") = n;
175
176         if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
177                 r5 = (long) &kst;
178         if (n == SYS_newfstatat)
179                 r6 = (long) &kst;
180
181         __asm__ __volatile__ (
182                 "syscall"
183                 : "+&r"(r2), "+r"(r7)
184                 : "r"(r4), "r"(r5), "r"(r6), "r"(r8)
185                 : SYSCALL_CLOBBERLIST);
186
187         if (r7) return -r2;
188         ret = r2;
189
190         if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
191                 __stat_fix(&kst, (struct stat *)b);
192         if (n == SYS_newfstatat)
193                 __stat_fix(&kst, (struct stat *)c);
194
195         return ret;
196 }
197
198 static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
199 {
200         struct kernel_stat kst;
201         long ret;
202         register long r4 __asm__("$4") = a;
203         register long r5 __asm__("$5") = b;
204         register long r6 __asm__("$6") = c;
205         register long r7 __asm__("$7") = d;
206         register long r8 __asm__("$8") = e;
207         register long r9 __asm__("$9") = f;
208         register long r2 __asm__("$2") = n;
209
210         if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
211                 r5 = (long) &kst;
212         if (n == SYS_newfstatat)
213                 r6 = (long) &kst;
214
215         __asm__ __volatile__ (
216                 "syscall"
217                 : "+&r"(r2), "+r"(r7)
218                 : "r"(r4), "r"(r5), "r"(r6), "r"(r8), "r"(r9)
219                 : SYSCALL_CLOBBERLIST);
220
221         if (r7) return -r2;
222         ret = r2;
223
224         if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
225                 __stat_fix(&kst, (struct stat *)b);
226         if (n == SYS_newfstatat)
227                 __stat_fix(&kst, (struct stat *)c);
228
229         return ret;
230 }
231
232 #define VDSO_USEFUL
233 #define VDSO_CGT_SYM "__vdso_clock_gettime"
234 #define VDSO_CGT_VER "LINUX_2.6"