source: svn/trunk/newcon3bcm2_21bu/toolchain/mipsel-linux-uclibc/include/bits/syscalls.h

Last change on this file was 2, checked in by jglee, 11 years ago

first commit

  • Property svn:executable set to *
File size: 8.8 KB
Line 
1#ifndef _BITS_SYSCALLS_H
2#define _BITS_SYSCALLS_H
3#ifndef _SYSCALL_H
4# error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead."
5#endif
6
7/* This includes the `__NR_<name>' syscall numbers taken from the Linux kernel
8 * header files.  It also defines the traditional `SYS_<name>' macros for older
9 * programs.  */
10#include <bits/sysnum.h>
11
12#ifndef __set_errno
13# define __set_errno(val) (*__errno_location ()) = (val)
14#endif
15#ifndef SYS_ify
16# define SYS_ify(syscall_name)  (__NR_##syscall_name)
17#endif
18
19#ifndef __ASSEMBLER__
20
21#define _syscall0(type,name) \
22type name(void) \
23{                                                                       \
24        long err;                                                       \
25        long sys_result;                                                \
26        {                                                               \
27        register unsigned long __v0 asm("$2");                          \
28        register unsigned long __a3 asm("$7");                          \
29        __asm__ volatile (                                              \
30        ".set   noreorder\n\t"                                          \
31        "li     $2, %2  # " #name "\n\t"                                \
32        "syscall\n\t"                                                   \
33        ".set reorder"                                                  \
34        : "=r" (__v0), "=r" (__a3)                                      \
35        : "i" (SYS_ify(name))                                           \
36        : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",           \
37                "$14", "$15", "$24", "$25", "memory");                  \
38        err = __a3;                                                     \
39        sys_result = __v0;                                              \
40        }                                                               \
41        if (err == 0)                                                   \
42                return (type) sys_result;                               \
43        __set_errno(sys_result);                                        \
44        return (type)-1;                                                \
45}
46
47#define _syscall1(type,name,atype,a) \
48type name(atype a) \
49{                                                                       \
50        long err;                                                       \
51        long sys_result;                                                \
52        {                                                               \
53        register unsigned long __v0 asm("$2");                          \
54        register unsigned long __a0 asm("$4") = (unsigned long) a;      \
55        register unsigned long __a3 asm("$7");                          \
56        __asm__ volatile (                                              \
57        ".set   noreorder\n\t"                                          \
58        "li     $2, %3\t\t\t# " #name "\n\t"                            \
59        "syscall\n\t"                                                   \
60        ".set reorder"                                                  \
61        : "=r" (__v0), "=r" (__a3)                                      \
62        : "r" (__a0), "i" (SYS_ify(name))                               \
63        : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",           \
64                "$14", "$15", "$24", "$25", "memory");                  \
65        err = __a3;                                                     \
66        sys_result = __v0;                                              \
67        }                                                               \
68        if (err == 0)                                                   \
69                return (type) sys_result;                               \
70        __set_errno(sys_result);                                        \
71        return (type)-1;                                                \
72}
73
74#define _syscall2(type,name,atype,a,btype,b) \
75type name(atype a,btype b) \
76{                                                                       \
77        long err;                                                       \
78        long sys_result;                                                \
79        {                                                               \
80        register unsigned long __v0 asm("$2");                          \
81        register unsigned long __a0 asm("$4") = (unsigned long) a;      \
82        register unsigned long __a1 asm("$5") = (unsigned long) b;      \
83        register unsigned long __a3 asm("$7");                          \
84        __asm__ volatile (                                              \
85        ".set   noreorder\n\t"                                          \
86        "li     $2, %4\t\t\t# " #name "\n\t"                            \
87        "syscall\n\t"                                                   \
88        ".set   reorder"                                                \
89        : "=r" (__v0), "=r" (__a3)                                      \
90        : "r" (__a0), "r" (__a1), "i" (SYS_ify(name))                   \
91        : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",           \
92                "$14", "$15", "$24", "$25", "memory");                  \
93        err = __a3;                                                     \
94        sys_result = __v0;                                              \
95        }                                                               \
96        if (err == 0)                                                   \
97                return (type) sys_result;                               \
98        __set_errno(sys_result);                                        \
99        return (type)-1;                                                \
100}
101
102#define _syscall3(type,name,atype,a,btype,b,ctype,c) \
103type name (atype a, btype b, ctype c) \
104{                                                                       \
105        long err;                                                       \
106        long sys_result;                                                \
107        {                                                               \
108        register unsigned long __v0 asm("$2");                          \
109        register unsigned long __a0 asm("$4") = (unsigned long) a;      \
110        register unsigned long __a1 asm("$5") = (unsigned long) b;      \
111        register unsigned long __a2 asm("$6") = (unsigned long) c;      \
112        register unsigned long __a3 asm("$7");                          \
113        __asm__ volatile (                                              \
114        ".set   noreorder\n\t"                                          \
115        "li     $2, %5\t\t\t# " #name "\n\t"                            \
116        "syscall\n\t"                                                   \
117        ".set   reorder"                                                \
118        : "=r" (__v0), "=r" (__a3)                                      \
119        : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name))       \
120        : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",           \
121                "$14", "$15", "$24", "$25", "memory");                  \
122        err = __a3;                                                     \
123        sys_result = __v0;                                              \
124        }                                                               \
125        if (err == 0)                                                   \
126                return (type) sys_result;                               \
127        __set_errno(sys_result);                                        \
128        return (type)-1;                                                \
129}
130
131#define _syscall4(type,name,atype,a,btype,b,ctype,c,dtype,d) \
132type name (atype a, btype b, ctype c, dtype d) \
133{                                                                       \
134        long err;                                                       \
135        long sys_result;                                                \
136        {                                                               \
137        register unsigned long __v0 asm("$2");                          \
138        register unsigned long __a0 asm("$4") = (unsigned long) a;      \
139        register unsigned long __a1 asm("$5") = (unsigned long) b;      \
140        register unsigned long __a2 asm("$6") = (unsigned long) c;      \
141        register unsigned long __a3 asm("$7") = (unsigned long) d;      \
142        __asm__ volatile (                                              \
143        ".set   noreorder\n\t"                                          \
144        "li     $2, %5\t\t\t# " #name "\n\t"                            \
145        "syscall\n\t"                                                   \
146        ".set   reorder"                                                \
147        : "=r" (__v0), "+r" (__a3)                                      \
148        : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name))       \
149        : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",           \
150                "$14", "$15", "$24", "$25", "memory");                  \
151        err = __a3;                                                     \
152        sys_result = __v0;                                              \
153        }                                                               \
154        if (err == 0)                                                   \
155                return (type) sys_result;                               \
156        __set_errno(sys_result);                                        \
157        return (type)-1;                                                \
158}
159
160#define _syscall5(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
161type name (atype a,btype b,ctype c,dtype d,etype e) \
162{                                                                       \
163        long err;                                                       \
164        long sys_result;                                                \
165        const unsigned long *constE = (void*)(unsigned long) e;         \
166        {                                                               \
167        register unsigned long __v0 asm("$2");                          \
168        register unsigned long __a0 asm("$4") = (unsigned long) a;      \
169        register unsigned long __a1 asm("$5") = (unsigned long) b;      \
170        register unsigned long __a2 asm("$6") = (unsigned long) c;      \
171        register unsigned long __a3 asm("$7") = (unsigned long) d;      \
172        __asm__ volatile (                                              \
173        ".set   noreorder\n\t"                                          \
174        "lw     $2, %6\n\t"                                             \
175        "subu   $29, 32\n\t"                                            \
176        "sw     $2, 16($29)\n\t"                                        \
177        "li     $2, %5\t\t\t# " #name "\n\t"                            \
178        "syscall\n\t"                                                   \
179        "addiu  $29, 32\n\t"                                            \
180        ".set   reorder"                                                \
181        : "=r" (__v0), "+r" (__a3)                                      \
182        : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)),      \
183          "m" (constE)                                                  \
184        : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",           \
185                "$14", "$15", "$24", "$25", "memory");                  \
186        err = __a3;                                                     \
187        sys_result = __v0;                                              \
188        }                                                               \
189        if (err == 0)                                                   \
190                return (type) sys_result;                               \
191        __set_errno(sys_result);                                        \
192        return (type)-1;                                                \
193}
194
195#define _syscall6(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f) \
196type name (atype a,btype b,ctype c,dtype d,etype e,ftype f) \
197{                                                                       \
198        long err;                                                       \
199        long sys_result;                                                \
200        const unsigned long *constE = (void*)(unsigned long) e;         \
201        const unsigned long *constF = (void*)(unsigned long) f;         \
202        {                                                               \
203        register unsigned long __v0 asm("$2");                          \
204        register unsigned long __a0 asm("$4") = (unsigned long) a;      \
205        register unsigned long __a1 asm("$5") = (unsigned long) b;      \
206        register unsigned long __a2 asm("$6") = (unsigned long) c;      \
207        register unsigned long __a3 asm("$7") = (unsigned long) d;      \
208        __asm__ volatile (                                              \
209        ".set   noreorder\n\t"                                          \
210        "lw     $2, %6\n\t"                                             \
211        "lw     $8, %7\n\t"                                             \
212        "subu   $29, 32\n\t"                                            \
213        "sw     $2, 16($29)\n\t"                                        \
214        "sw     $8, 20($29)\n\t"                                        \
215        "li     $2, %5\t\t\t# " #name "\n\t"                            \
216        "syscall\n\t"                                                   \
217        "addiu  $29, 32\n\t"                                            \
218        ".set   reorder"                                                \
219        : "=r" (__v0), "+r" (__a3)                                      \
220        : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)),      \
221          "m" (constE), "m" (constF)                                    \
222        : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",           \
223                "$14", "$15", "$24", "$25", "memory");                  \
224        err = __a3;                                                     \
225        sys_result = __v0;                                              \
226        }                                                               \
227        if (err == 0)                                                   \
228                return (type) sys_result;                               \
229        __set_errno(sys_result);                                        \
230        return (type)-1;                                                \
231}
232
233#define _syscall7(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f,gtype,g) \
234type name (atype a,btype b,ctype c,dtype d,etype e,ftype f,gtype g) \
235{                                                                       \
236        long err;                                                       \
237        long sys_result;                                                \
238        const unsigned long *constE = (void*)(unsigned long) e;         \
239        const unsigned long *constF = (void*)(unsigned long) f;         \
240        const unsigned long *constG = (void*)(unsigned long) g;         \
241        {                                                               \
242        register unsigned long __v0 asm("$2");                          \
243        register unsigned long __a0 asm("$4") = (unsigned long) a;      \
244        register unsigned long __a1 asm("$5") = (unsigned long) b;      \
245        register unsigned long __a2 asm("$6") = (unsigned long) c;      \
246        register unsigned long __a3 asm("$7") = (unsigned long) d;      \
247        __asm__ volatile (                                              \
248        ".set   noreorder\n\t"                                          \
249        "lw     $2, %6\n\t"                                             \
250        "lw     $8, %7\n\t"                                             \
251        "lw     $9, %8\n\t"                                             \
252        "subu   $29, 32\n\t"                                            \
253        "sw     $2, 16($29)\n\t"                                        \
254        "sw     $8, 20($29)\n\t"                                        \
255        "sw     $9, 24($29)\n\t"                                        \
256        "li     $2, %5\t\t\t# " #name "\n\t"                            \
257        "syscall\n\t"                                                   \
258        "addiu  $29, 32\n\t"                                            \
259        ".set   reorder"                                                \
260        : "=r" (__v0), "+r" (__a3)                                      \
261        : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)),      \
262          "m" (constE), "m" (constF), "m" (constG)                      \
263        : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",           \
264                "$14", "$15", "$24", "$25", "memory");                  \
265        err = __a3;                                                     \
266        sys_result = __v0;                                              \
267        }                                                               \
268        if (err == 0)                                                   \
269                return (type) sys_result;                               \
270        __set_errno(sys_result);                                        \
271        return (type)-1;                                                \
272}
273
274#endif /* __ASSEMBLER__ */
275#endif /* _BITS_SYSCALLS_H */
Note: See TracBrowser for help on using the repository browser.