1 #ifndef _BITS_SYSCALLS_H
2 #define _BITS_SYSCALLS_H
4 # error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead."
7 #include <bits/wordsize.h>
13 #define SYS_ify(syscall_name) (__NR_##syscall_name)
15 #undef __SYSCALL_STRING
17 # define __SYSCALL_STRING \
21 "sub %%g0, %%o0, %0\n\t" \
23 # define __SYSCALL_RES_CHECK (__res < -255 || __res >= 0)
24 #elif __WORDSIZE == 64
25 # define __SYSCALL_STRING \
27 "sub %%g0, %%o0, %0\n\t" \
28 "movcc %%xcc, %%o0, %0\n\t"
29 # define __SYSCALL_RES_CHECK (__res >= 0)
31 # error unknown __WORDSIZE
34 #define __SYSCALL_RETURN(type) \
35 if (__SYSCALL_RES_CHECK) \
36 return (type) __res; \
37 __set_errno (-__res); \
41 #define _syscall0(type,name) \
45 register long __g1 __asm__ ("g1") = __NR_##name; \
46 __asm__ __volatile__ (__SYSCALL_STRING \
50 __SYSCALL_RETURN(type) \
54 #define _syscall1(type,name,type1,arg1) \
55 type name(type1 arg1) \
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) \
64 __SYSCALL_RETURN(type) \
68 #define _syscall2(type,name,type1,arg1,type2,arg2) \
69 type name(type1 arg1,type2 arg2) \
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) \
79 __SYSCALL_RETURN(type) \
83 #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
84 type name(type1 arg1,type2 arg2,type3 arg3) \
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) \
95 __SYSCALL_RETURN(type) \
99 #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
100 type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
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) \
112 __SYSCALL_RETURN(type) \
116 #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
118 type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
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) \
131 __SYSCALL_RETURN(type) \
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) \
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) \
151 __SYSCALL_RETURN(type) \
154 #endif /* __ASSEMBLER__ */
155 #endif /* _BITS_SYSCALLS_H */