]>
Commit | Line | Data |
---|---|---|
6428ce3c DJ |
1 | /* Copyright (C) 2000, 2002, 2003, 2004, 2005, 2006 |
2 | Free Software Foundation, Inc. | |
be122291 AO |
3 | This file is part of the GNU C Library. |
4 | ||
5 | The GNU C Library is free software; you can redistribute it and/or | |
6 | modify it under the terms of the GNU Lesser General Public | |
7 | License as published by the Free Software Foundation; either | |
8 | version 2.1 of the License, or (at your option) any later version. | |
9 | ||
10 | The GNU C Library is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | Lesser General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU Lesser General Public | |
16 | License along with the GNU C Library; if not, write to the Free | |
17 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | |
18 | 02111-1307 USA. */ | |
19 | ||
20 | #ifndef _LINUX_MIPS_SYSDEP_H | |
21 | #define _LINUX_MIPS_SYSDEP_H 1 | |
22 | ||
23 | /* There is some commonality. */ | |
24 | #include <sysdeps/unix/mips/mips64/n32/sysdep.h> | |
25 | ||
26 | /* For Linux we can use the system call table in the header file | |
27 | /usr/include/asm/unistd.h | |
28 | of the kernel. But these symbols do not follow the SYS_* syntax | |
29 | so we have to redefine the `SYS_ify' macro here. */ | |
30 | #undef SYS_ify | |
31 | #ifdef __STDC__ | |
68f3ec56 | 32 | # define SYS_ify(syscall_name) __NR_##syscall_name |
be122291 | 33 | #else |
68f3ec56 | 34 | # define SYS_ify(syscall_name) __NR_/**/syscall_name |
be122291 AO |
35 | #endif |
36 | ||
66a1dc87 RM |
37 | #ifdef __ASSEMBLER__ |
38 | ||
39 | /* We don't want the label for the error handler to be visible in the symbol | |
40 | table when we define it here. */ | |
41 | #ifdef __PIC__ | |
42 | # define SYSCALL_ERROR_LABEL 99b | |
43 | #endif | |
44 | ||
45 | #else /* ! __ASSEMBLER__ */ | |
be122291 | 46 | |
ffd39823 DJ |
47 | /* Convert X to a long long, without losing any bits if it is one |
48 | already or warning if it is a 32-bit pointer. */ | |
49 | #define ARGIFY(X) ((long long) (__typeof__ ((X) - (X))) (X)) | |
50 | ||
be122291 AO |
51 | /* Define a macro which expands into the inline wrapper code for a system |
52 | call. */ | |
53 | #undef INLINE_SYSCALL | |
54 | #define INLINE_SYSCALL(name, nr, args...) \ | |
55 | ({ INTERNAL_SYSCALL_DECL(err); \ | |
56 | long result_var = INTERNAL_SYSCALL (name, err, nr, args); \ | |
57 | if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) ) \ | |
58 | { \ | |
59 | __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err)); \ | |
60 | result_var = -1L; \ | |
61 | } \ | |
62 | result_var; }) | |
63 | ||
64 | #undef INTERNAL_SYSCALL_DECL | |
65 | #define INTERNAL_SYSCALL_DECL(err) long err | |
66 | ||
67 | #undef INTERNAL_SYSCALL_ERROR_P | |
68 | #define INTERNAL_SYSCALL_ERROR_P(val, err) ((long) (err)) | |
69 | ||
70 | #undef INTERNAL_SYSCALL_ERRNO | |
71 | #define INTERNAL_SYSCALL_ERRNO(val, err) (val) | |
72 | ||
73 | #undef INTERNAL_SYSCALL | |
6428ce3c DJ |
74 | #define INTERNAL_SYSCALL(name, err, nr, args...) \ |
75 | internal_syscall##nr (, "li\t$2, %2\t\t\t# " #name "\n\t", \ | |
76 | "i" (SYS_ify (name)), err, args) | |
be122291 | 77 | |
6428ce3c DJ |
78 | #undef INTERNAL_SYSCALL_NCS |
79 | #define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \ | |
80 | internal_syscall##nr (= number, , "r" (__v0), err, args) | |
81 | ||
82 | #define internal_syscall0(ncs_init, cs_init, input, err, dummy...) \ | |
be122291 AO |
83 | ({ \ |
84 | long _sys_result; \ | |
85 | \ | |
86 | { \ | |
6428ce3c DJ |
87 | register long long __v0 asm("$2") ncs_init; \ |
88 | register long long __a3 asm("$7"); \ | |
be122291 AO |
89 | __asm__ volatile ( \ |
90 | ".set\tnoreorder\n\t" \ | |
6428ce3c | 91 | cs_init \ |
be122291 AO |
92 | "syscall\n\t" \ |
93 | ".set reorder" \ | |
94 | : "=r" (__v0), "=r" (__a3) \ | |
6428ce3c | 95 | : input \ |
be122291 AO |
96 | : __SYSCALL_CLOBBERS); \ |
97 | err = __a3; \ | |
98 | _sys_result = __v0; \ | |
99 | } \ | |
100 | _sys_result; \ | |
101 | }) | |
102 | ||
6428ce3c | 103 | #define internal_syscall1(ncs_init, cs_init, input, err, arg1) \ |
be122291 AO |
104 | ({ \ |
105 | long _sys_result; \ | |
106 | \ | |
107 | { \ | |
6428ce3c | 108 | register long long __v0 asm("$2") ncs_init; \ |
ffd39823 | 109 | register long long __a0 asm("$4") = ARGIFY (arg1); \ |
be122291 AO |
110 | register long long __a3 asm("$7"); \ |
111 | __asm__ volatile ( \ | |
112 | ".set\tnoreorder\n\t" \ | |
6428ce3c | 113 | cs_init \ |
be122291 AO |
114 | "syscall\n\t" \ |
115 | ".set reorder" \ | |
116 | : "=r" (__v0), "=r" (__a3) \ | |
6428ce3c | 117 | : input, "r" (__a0) \ |
be122291 AO |
118 | : __SYSCALL_CLOBBERS); \ |
119 | err = __a3; \ | |
120 | _sys_result = __v0; \ | |
121 | } \ | |
122 | _sys_result; \ | |
123 | }) | |
124 | ||
6428ce3c | 125 | #define internal_syscall2(ncs_init, cs_init, input, err, arg1, arg2) \ |
be122291 AO |
126 | ({ \ |
127 | long _sys_result; \ | |
128 | \ | |
129 | { \ | |
6428ce3c | 130 | register long long __v0 asm("$2") ncs_init; \ |
ffd39823 DJ |
131 | register long long __a0 asm("$4") = ARGIFY (arg1); \ |
132 | register long long __a1 asm("$5") = ARGIFY (arg2); \ | |
be122291 AO |
133 | register long long __a3 asm("$7"); \ |
134 | __asm__ volatile ( \ | |
135 | ".set\tnoreorder\n\t" \ | |
6428ce3c | 136 | cs_init \ |
be122291 AO |
137 | "syscall\n\t" \ |
138 | ".set\treorder" \ | |
139 | : "=r" (__v0), "=r" (__a3) \ | |
6428ce3c | 140 | : input, "r" (__a0), "r" (__a1) \ |
be122291 AO |
141 | : __SYSCALL_CLOBBERS); \ |
142 | err = __a3; \ | |
143 | _sys_result = __v0; \ | |
144 | } \ | |
145 | _sys_result; \ | |
146 | }) | |
147 | ||
6428ce3c | 148 | #define internal_syscall3(ncs_init, cs_init, input, err, arg1, arg2, arg3) \ |
be122291 AO |
149 | ({ \ |
150 | long _sys_result; \ | |
151 | \ | |
152 | { \ | |
6428ce3c | 153 | register long long __v0 asm("$2") ncs_init; \ |
ffd39823 DJ |
154 | register long long __a0 asm("$4") = ARGIFY (arg1); \ |
155 | register long long __a1 asm("$5") = ARGIFY (arg2); \ | |
156 | register long long __a2 asm("$6") = ARGIFY (arg3); \ | |
be122291 AO |
157 | register long long __a3 asm("$7"); \ |
158 | __asm__ volatile ( \ | |
159 | ".set\tnoreorder\n\t" \ | |
6428ce3c | 160 | cs_init \ |
be122291 AO |
161 | "syscall\n\t" \ |
162 | ".set\treorder" \ | |
163 | : "=r" (__v0), "=r" (__a3) \ | |
6428ce3c | 164 | : input, "r" (__a0), "r" (__a1), "r" (__a2) \ |
be122291 AO |
165 | : __SYSCALL_CLOBBERS); \ |
166 | err = __a3; \ | |
167 | _sys_result = __v0; \ | |
168 | } \ | |
169 | _sys_result; \ | |
170 | }) | |
171 | ||
6428ce3c | 172 | #define internal_syscall4(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4) \ |
be122291 AO |
173 | ({ \ |
174 | long _sys_result; \ | |
175 | \ | |
176 | { \ | |
6428ce3c | 177 | register long long __v0 asm("$2") ncs_init; \ |
ffd39823 DJ |
178 | register long long __a0 asm("$4") = ARGIFY (arg1); \ |
179 | register long long __a1 asm("$5") = ARGIFY (arg2); \ | |
180 | register long long __a2 asm("$6") = ARGIFY (arg3); \ | |
181 | register long long __a3 asm("$7") = ARGIFY (arg4); \ | |
be122291 AO |
182 | __asm__ volatile ( \ |
183 | ".set\tnoreorder\n\t" \ | |
6428ce3c | 184 | cs_init \ |
be122291 AO |
185 | "syscall\n\t" \ |
186 | ".set\treorder" \ | |
187 | : "=r" (__v0), "+r" (__a3) \ | |
6428ce3c | 188 | : input, "r" (__a0), "r" (__a1), "r" (__a2) \ |
be122291 AO |
189 | : __SYSCALL_CLOBBERS); \ |
190 | err = __a3; \ | |
191 | _sys_result = __v0; \ | |
192 | } \ | |
193 | _sys_result; \ | |
194 | }) | |
195 | ||
6428ce3c | 196 | #define internal_syscall5(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5) \ |
be122291 AO |
197 | ({ \ |
198 | long _sys_result; \ | |
199 | \ | |
200 | { \ | |
6428ce3c | 201 | register long long __v0 asm("$2") ncs_init; \ |
ffd39823 DJ |
202 | register long long __a0 asm("$4") = ARGIFY (arg1); \ |
203 | register long long __a1 asm("$5") = ARGIFY (arg2); \ | |
204 | register long long __a2 asm("$6") = ARGIFY (arg3); \ | |
205 | register long long __a3 asm("$7") = ARGIFY (arg4); \ | |
206 | register long long __a4 asm("$8") = ARGIFY (arg5); \ | |
be122291 AO |
207 | __asm__ volatile ( \ |
208 | ".set\tnoreorder\n\t" \ | |
6428ce3c | 209 | cs_init \ |
be122291 AO |
210 | "syscall\n\t" \ |
211 | ".set\treorder" \ | |
212 | : "=r" (__v0), "+r" (__a3) \ | |
6428ce3c | 213 | : input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4) \ |
be122291 AO |
214 | : __SYSCALL_CLOBBERS); \ |
215 | err = __a3; \ | |
216 | _sys_result = __v0; \ | |
217 | } \ | |
218 | _sys_result; \ | |
219 | }) | |
220 | ||
6428ce3c | 221 | #define internal_syscall6(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6) \ |
be122291 AO |
222 | ({ \ |
223 | long _sys_result; \ | |
224 | \ | |
225 | { \ | |
6428ce3c | 226 | register long long __v0 asm("$2") ncs_init; \ |
ffd39823 DJ |
227 | register long long __a0 asm("$4") = ARGIFY (arg1); \ |
228 | register long long __a1 asm("$5") = ARGIFY (arg2); \ | |
229 | register long long __a2 asm("$6") = ARGIFY (arg3); \ | |
230 | register long long __a3 asm("$7") = ARGIFY (arg4); \ | |
231 | register long long __a4 asm("$8") = ARGIFY (arg5); \ | |
232 | register long long __a5 asm("$9") = ARGIFY (arg6); \ | |
be122291 AO |
233 | __asm__ volatile ( \ |
234 | ".set\tnoreorder\n\t" \ | |
6428ce3c | 235 | cs_init \ |
be122291 AO |
236 | "syscall\n\t" \ |
237 | ".set\treorder" \ | |
238 | : "=r" (__v0), "+r" (__a3) \ | |
6428ce3c DJ |
239 | : input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4), \ |
240 | "r" (__a5) \ | |
be122291 AO |
241 | : __SYSCALL_CLOBBERS); \ |
242 | err = __a3; \ | |
243 | _sys_result = __v0; \ | |
244 | } \ | |
245 | _sys_result; \ | |
246 | }) | |
247 | ||
145f3f8a AJ |
248 | #define __SYSCALL_CLOBBERS "$1", "$3", "$10", "$11", "$12", "$13", \ |
249 | "$14", "$15", "$24", "$25", "memory" | |
be122291 AO |
250 | #endif /* __ASSEMBLER__ */ |
251 | ||
908afa83 DJ |
252 | /* Pointer mangling is not yet supported for MIPS. */ |
253 | #define PTR_MANGLE(var) (void) (var) | |
254 | #define PTR_DEMANGLE(var) (void) (var) | |
255 | ||
be122291 | 256 | #endif /* linux/mips/sysdep.h */ |