OSDN Git Service

9065b0042e8d08f87a599072c932744957bb4f60
[uclinux-h8/uClibc.git] / libc / sysdeps / linux / sparc / bits / syscalls.h
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 #include <bits/wordsize.h>
8
9 #ifndef __ASSEMBLER__
10
11 #include <errno.h>
12
13 #define SYS_ify(syscall_name)  (__NR_##syscall_name)
14
15 #undef __SYSCALL_STRING
16 #if __WORDSIZE == 32
17 # define __SYSCALL_STRING \
18         "t 0x10\n\t" \
19         "bcc 1f\n\t" \
20         "mov %%o0, %0\n\t" \
21         "sub %%g0, %%o0, %0\n\t" \
22         "1:\n\t"
23 # define __SYSCALL_RES_CHECK (__res < -255 || __res >= 0)
24 #elif __WORDSIZE == 64
25 # define __SYSCALL_STRING \
26         "t 0x6d\n\t" \
27         "sub %%g0, %%o0, %0\n\t" \
28         "movcc %%xcc, %%o0, %0\n\t"
29 # define __SYSCALL_RES_CHECK (__res >= 0)
30 #else
31 # error unknown __WORDSIZE
32 #endif
33
34 #define __SYSCALL_RETURN(type) \
35         if (__SYSCALL_RES_CHECK) \
36                 return (type) __res; \
37         __set_errno (-__res); \
38         return (type) -1;
39
40 #undef _syscall0
41 #define _syscall0(type,name) \
42 type name(void) \
43 { \
44 long __res; \
45 register long __g1 __asm__ ("g1") = __NR_##name; \
46 __asm__ __volatile__ (__SYSCALL_STRING \
47                       : "=r" (__res)\
48                       : "r" (__g1) \
49                       : "o0", "cc"); \
50 __SYSCALL_RETURN(type) \
51 }
52
53 #undef _syscall1
54 #define _syscall1(type,name,type1,arg1) \
55 type name(type1 arg1) \
56 { \
57 long __res; \
58 register long __g1 __asm__ ("g1") = __NR_##name; \
59 register long __o0 __asm__ ("o0") = (long)(arg1); \
60 __asm__ __volatile__ (__SYSCALL_STRING \
61                       : "=r" (__res), "=&r" (__o0) \
62                       : "1" (__o0), "r" (__g1) \
63                       : "cc"); \
64 __SYSCALL_RETURN(type) \
65 }
66
67 #undef _syscall2
68 #define _syscall2(type,name,type1,arg1,type2,arg2) \
69 type name(type1 arg1,type2 arg2) \
70 { \
71 long __res; \
72 register long __g1 __asm__ ("g1") = __NR_##name; \
73 register long __o0 __asm__ ("o0") = (long)(arg1); \
74 register long __o1 __asm__ ("o1") = (long)(arg2); \
75 __asm__ __volatile__ (__SYSCALL_STRING \
76                       : "=r" (__res), "=&r" (__o0) \
77                       : "1" (__o0), "r" (__o1), "r" (__g1) \
78                       : "cc"); \
79 __SYSCALL_RETURN(type) \
80 }
81
82 #undef _syscall3
83 #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
84 type name(type1 arg1,type2 arg2,type3 arg3) \
85 { \
86 long __res; \
87 register long __g1 __asm__ ("g1") = __NR_##name; \
88 register long __o0 __asm__ ("o0") = (long)(arg1); \
89 register long __o1 __asm__ ("o1") = (long)(arg2); \
90 register long __o2 __asm__ ("o2") = (long)(arg3); \
91 __asm__ __volatile__ (__SYSCALL_STRING \
92                       : "=r" (__res), "=&r" (__o0) \
93                       : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__g1) \
94                       : "cc"); \
95 __SYSCALL_RETURN(type) \
96 }
97
98 #undef _syscall4
99 #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
100 type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
101 { \
102 long __res; \
103 register long __g1 __asm__ ("g1") = __NR_##name; \
104 register long __o0 __asm__ ("o0") = (long)(arg1); \
105 register long __o1 __asm__ ("o1") = (long)(arg2); \
106 register long __o2 __asm__ ("o2") = (long)(arg3); \
107 register long __o3 __asm__ ("o3") = (long)(arg4); \
108 __asm__ __volatile__ (__SYSCALL_STRING \
109                       : "=r" (__res), "=&r" (__o0) \
110                       : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__g1) \
111                       : "cc"); \
112 __SYSCALL_RETURN(type) \
113
114
115 #undef _syscall5
116 #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
117           type5,arg5) \
118 type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
119 { \
120 long __res; \
121 register long __g1 __asm__ ("g1") = __NR_##name; \
122 register long __o0 __asm__ ("o0") = (long)(arg1); \
123 register long __o1 __asm__ ("o1") = (long)(arg2); \
124 register long __o2 __asm__ ("o2") = (long)(arg3); \
125 register long __o3 __asm__ ("o3") = (long)(arg4); \
126 register long __o4 __asm__ ("o4") = (long)(arg5); \
127 __asm__ __volatile__ (__SYSCALL_STRING \
128                       : "=r" (__res), "=&r" (__o0) \
129                       : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__o4), "r" (__g1) \
130                       : "cc"); \
131 __SYSCALL_RETURN(type) \
132 }
133
134 #undef _syscall6
135 #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
136           type5,arg5,type6,arg6) \
137 type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, type6 arg6) \
138 { \
139 long __res; \
140 register long __g1 __asm__ ("g1") = __NR_##name; \
141 register long __o0 __asm__ ("o0") = (long)(arg1); \
142 register long __o1 __asm__ ("o1") = (long)(arg2); \
143 register long __o2 __asm__ ("o2") = (long)(arg3); \
144 register long __o3 __asm__ ("o3") = (long)(arg4); \
145 register long __o4 __asm__ ("o4") = (long)(arg5); \
146 register long __o5 __asm__ ("o5") = (long)(arg6); \
147 __asm__ __volatile__ (__SYSCALL_STRING \
148                       : "=r" (__res), "=&r" (__o0) \
149                       : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__o4), "r" (__o5), "r" (__g1) \
150                       : "cc"); \
151 __SYSCALL_RETURN(type) \
152 }
153
154 #endif /* __ASSEMBLER__ */
155 #endif /* _BITS_SYSCALLS_H */