cleaning up syscalls in preparation for x86_64 port
[musl] / src / internal / syscall.h
1 #ifndef _SYSCALL_H
2 #define _SYSCALL_H
3
4 #define SYSCALL_LL(x) \
5 ((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
6 ((union { long long ll; long l[2]; }){ .ll = x }).l[1]
7
8 #define SYSCALL_SIGSET_SIZE 8
9
10 #if defined(SYSCALL_STANDALONE)
11 #include <errno.h>
12 static inline long __syscall_ret(unsigned long r)
13 {
14         if (r >= (unsigned long)-1 - 4096) {
15                 errno = -(long)r;
16                 return -1;
17         }
18         return (long)r;
19 }
20 #elif defined(SYSCALL_NORETURN)
21 static inline long __syscall_ret(unsigned long r)
22 {
23         for(;;);
24         return 0;
25 }
26 #elif defined(SYSCALL_RETURN_ERRNO)
27 static inline long __syscall_ret(unsigned long r)
28 {
29         return -r;
30 }
31 #else
32 extern long __syscall_ret(unsigned long);
33 #endif
34
35 #define SYSCALL0 "int $128"
36
37 #ifdef __PIC__
38 #define SYSCALL "xchgl %%ebx,%2\n\t" SYSCALL0 "\n\txchgl %%ebx,%2"
39 #define EBX "m"
40 #else
41 #define SYSCALL SYSCALL0
42 #define EBX "b"
43 #endif
44
45 static inline long syscall0(long n)
46 {
47         unsigned long ret;
48         __asm__ __volatile__ (SYSCALL0 : "=a"(ret) : "a"(n) : "memory");
49         return __syscall_ret(ret);
50 }
51
52 static inline long syscall1(long n, long a1)
53 {
54         unsigned long ret;
55         __asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), EBX(a1) : "memory");
56         return __syscall_ret(ret);
57 }
58
59 static inline long syscall2(long n, long a1, long a2)
60 {
61         unsigned long ret;
62         __asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), EBX(a1), "c"(a2) : "memory");
63         return __syscall_ret(ret);
64 }
65
66 static inline long syscall3(long n, long a1, long a2, long a3)
67 {
68         unsigned long ret;
69         __asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), EBX(a1), "c"(a2), "d"(a3) : "memory");
70         return __syscall_ret(ret);
71 }
72
73 static inline long syscall4(long n, long a1, long a2, long a3, long a4)
74 {
75         unsigned long ret;
76         __asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), EBX(a1), "c"(a2), "d"(a3), "S"(a4) : "memory");
77         return __syscall_ret(ret);
78 }
79
80 static inline long syscall5(long n, long a1, long a2, long a3, long a4, long a5)
81 {
82         unsigned long ret;
83         __asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), EBX(a1), "c"(a2), "d"(a3), "S"(a4), "D"(a5) : "memory");
84         return __syscall_ret(ret);
85 }
86
87 #ifdef __PIC__
88 /* note: it's probably only safe to use this when a6 is on the stack */
89 static inline long syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6)
90 {
91         unsigned long ret;
92         __asm__ __volatile__ ("xchgl %%ebx,%2 ; pushl %1 ; pushl %%ebp ; movl %%eax,%%ebp ; movl 4(%%esp),%%eax ; int $128 ; popl %%ebp ; popl %%ecx ; xchgl %%ebx,%2"
93                 : "=a"(ret) : "g"(n), EBX(a1), "c"(a2), "d"(a3), "S"(a4), "D"(a5), "a"(a6) : "memory");
94         return __syscall_ret(ret);
95 }
96 #else
97 static inline long syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6)
98 {
99         unsigned long ret;
100         __asm__ __volatile__ ("pushl %%ebp ; mov %1, %%ebp ; xchg %%ebp, %7 ; int $128 ; popl %%ebp"
101                 : "=a"(ret) : "g"(n), EBX(a1), "c"(a2), "d"(a3), "S"(a4), "D"(a5), "a"(a6) : "memory");
102         return __syscall_ret(ret);
103 }
104 #endif
105
106 #define __NR_restart_syscall      0
107 #define __NR_exit                 1
108 #define __NR_fork                 2
109 #define __NR_read                 3
110 #define __NR_write                4
111 #define __NR_open                 5
112 #define __NR_close                6
113 #define __NR_waitpid              7
114 #define __NR_creat                8
115 #define __NR_link                 9
116 #define __NR_unlink              10
117 #define __NR_execve              11
118 #define __NR_chdir               12
119 #define __NR_time                13
120 #define __NR_mknod               14
121 #define __NR_chmod               15
122 #define __NR_lchown              16
123 #define __NR_break               17
124 #define __NR_oldstat             18
125 #define __NR_lseek               19
126 #define __NR_getpid              20
127 #define __NR_mount               21
128 #define __NR_umount              22
129 #define __NR_setuid              23
130 #define __NR_getuid              24
131 #define __NR_stime               25
132 #define __NR_ptrace              26
133 #define __NR_alarm               27
134 #define __NR_oldfstat            28
135 #define __NR_pause               29
136 #define __NR_utime               30
137 #define __NR_stty                31
138 #define __NR_gtty                32
139 #define __NR_access              33
140 #define __NR_nice                34
141 #define __NR_ftime               35
142 #define __NR_sync                36
143 #define __NR_kill                37
144 #define __NR_rename              38
145 #define __NR_mkdir               39
146 #define __NR_rmdir               40
147 #define __NR_dup                 41
148 #define __NR_pipe                42
149 #define __NR_times               43
150 #define __NR_prof                44
151 #define __NR_brk                 45
152 #define __NR_setgid              46
153 #define __NR_getgid              47
154 #define __NR_signal              48
155 #define __NR_geteuid             49
156 #define __NR_getegid             50
157 #define __NR_acct                51
158 #define __NR_umount2             52
159 #define __NR_lock                53
160 #define __NR_ioctl               54
161 #define __NR_fcntl               55
162 #define __NR_mpx                 56
163 #define __NR_setpgid             57
164 #define __NR_ulimit              58
165 #define __NR_oldolduname         59
166 #define __NR_umask               60
167 #define __NR_chroot              61
168 #define __NR_ustat               62
169 #define __NR_dup2                63
170 #define __NR_getppid             64
171 #define __NR_getpgrp             65
172 #define __NR_setsid              66
173 #define __NR_sigaction           67
174 #define __NR_sgetmask            68
175 #define __NR_ssetmask            69
176 #define __NR_setreuid            70
177 #define __NR_setregid            71
178 #define __NR_sigsuspend          72
179 #define __NR_sigpending          73
180 #define __NR_sethostname         74
181 #define __NR_setrlimit           75
182 #define __NR_getrlimit           76   /* Back compatible 2Gig limited rlimit */
183 #define __NR_getrusage           77
184 #define __NR_gettimeofday        78
185 #define __NR_settimeofday        79
186 #define __NR_getgroups           80
187 #define __NR_setgroups           81
188 #define __NR_select              82
189 #define __NR_symlink             83
190 #define __NR_oldlstat            84
191 #define __NR_readlink            85
192 #define __NR_uselib              86
193 #define __NR_swapon              87
194 #define __NR_reboot              88
195 #define __NR_readdir             89
196 #define __NR_mmap                90
197 #define __NR_munmap              91
198 #define __NR_truncate            92
199 #define __NR_ftruncate           93
200 #define __NR_fchmod              94
201 #define __NR_fchown              95
202 #define __NR_getpriority         96
203 #define __NR_setpriority         97
204 #define __NR_profil              98
205 #define __NR_statfs             99
206 #define __NR_fstatfs            100
207 #define __NR_ioperm             101
208 #define __NR_socketcall         102
209 #define __NR_syslog             103
210 #define __NR_setitimer          104
211 #define __NR_getitimer          105
212 #define __NR_stat               106
213 #define __NR_lstat              107
214 #define __NR_fstat              108
215 #define __NR_olduname           109
216 #define __NR_iopl               110
217 #define __NR_vhangup            111
218 #define __NR_idle               112
219 #define __NR_vm86old            113
220 #define __NR_wait4              114
221 #define __NR_swapoff            115
222 #define __NR_sysinfo            116
223 #define __NR_ipc                117
224 #define __NR_fsync              118
225 #define __NR_sigreturn          119
226 #define __NR_clone              120
227 #define __NR_setdomainname      121
228 #define __NR_uname              122
229 #define __NR_modify_ldt         123
230 #define __NR_adjtimex           124
231 #define __NR_mprotect           125
232 #define __NR_sigprocmask        126
233 #define __NR_create_module      127
234 #define __NR_init_module        128
235 #define __NR_delete_module      129
236 #define __NR_get_kernel_syms    130
237 #define __NR_quotactl           131
238 #define __NR_getpgid            132
239 #define __NR_fchdir             133
240 #define __NR_bdflush            134
241 #define __NR_sysfs              135
242 #define __NR_personality        136
243 #define __NR_afs_syscall        137
244 #define __NR_setfsuid           138
245 #define __NR_setfsgid           139
246 #define __NR__llseek            140
247 #define __NR_getdents           141
248 #define __NR__newselect         142
249 #define __NR_flock              143
250 #define __NR_msync              144
251 #define __NR_readv              145
252 #define __NR_writev             146
253 #define __NR_getsid             147
254 #define __NR_fdatasync          148
255 #define __NR__sysctl            149
256 #define __NR_mlock              150
257 #define __NR_munlock            151
258 #define __NR_mlockall           152
259 #define __NR_munlockall         153
260 #define __NR_sched_setparam             154
261 #define __NR_sched_getparam             155
262 #define __NR_sched_setscheduler         156
263 #define __NR_sched_getscheduler         157
264 #define __NR_sched_yield                158
265 #define __NR_sched_get_priority_max     159
266 #define __NR_sched_get_priority_min     160
267 #define __NR_sched_rr_get_interval      161
268 #define __NR_nanosleep          162
269 #define __NR_mremap             163
270 #define __NR_setresuid          164
271 #define __NR_getresuid          165
272 #define __NR_vm86               166
273 #define __NR_query_module       167
274 #define __NR_poll               168
275 #define __NR_nfsservctl         169
276 #define __NR_setresgid          170
277 #define __NR_getresgid          171
278 #define __NR_prctl              172
279 #define __NR_rt_sigreturn       173
280 #define __NR_rt_sigaction       174
281 #define __NR_rt_sigprocmask     175
282 #define __NR_rt_sigpending      176
283 #define __NR_rt_sigtimedwait    177
284 #define __NR_rt_sigqueueinfo    178
285 #define __NR_rt_sigsuspend      179
286 #define __NR_pread64            180
287 #define __NR_pwrite64           181
288 #define __NR_chown              182
289 #define __NR_getcwd             183
290 #define __NR_capget             184
291 #define __NR_capset             185
292 #define __NR_sigaltstack        186
293 #define __NR_sendfile           187
294 #define __NR_getpmsg            188
295 #define __NR_putpmsg            189
296 #define __NR_vfork              190
297 #define __NR_ugetrlimit         191
298 #define __NR_mmap2              192
299 #define __NR_truncate64         193
300 #define __NR_ftruncate64        194
301 #define __NR_stat64             195
302 #define __NR_lstat64            196
303 #define __NR_fstat64            197
304 #define __NR_lchown32           198
305 #define __NR_getuid32           199
306 #define __NR_getgid32           200
307 #define __NR_geteuid32          201
308 #define __NR_getegid32          202
309 #define __NR_setreuid32         203
310 #define __NR_setregid32         204
311 #define __NR_getgroups32        205
312 #define __NR_setgroups32        206
313 #define __NR_fchown32           207
314 #define __NR_setresuid32        208
315 #define __NR_getresuid32        209
316 #define __NR_setresgid32        210
317 #define __NR_getresgid32        211
318 #define __NR_chown32            212
319 #define __NR_setuid32           213
320 #define __NR_setgid32           214
321 #define __NR_setfsuid32         215
322 #define __NR_setfsgid32         216
323 #define __NR_pivot_root         217
324 #define __NR_mincore            218
325 #define __NR_madvise            219
326 #define __NR_madvise1           219
327 #define __NR_getdents64         220
328 #define __NR_fcntl64            221
329 /* 223 is unused */
330 #define __NR_gettid             224
331 #define __NR_readahead          225
332 #define __NR_setxattr           226
333 #define __NR_lsetxattr          227
334 #define __NR_fsetxattr          228
335 #define __NR_getxattr           229
336 #define __NR_lgetxattr          230
337 #define __NR_fgetxattr          231
338 #define __NR_listxattr          232
339 #define __NR_llistxattr         233
340 #define __NR_flistxattr         234
341 #define __NR_removexattr        235
342 #define __NR_lremovexattr       236
343 #define __NR_fremovexattr       237
344 #define __NR_tkill              238
345 #define __NR_sendfile64         239
346 #define __NR_futex              240
347 #define __NR_sched_setaffinity  241
348 #define __NR_sched_getaffinity  242
349 #define __NR_set_thread_area    243
350 #define __NR_get_thread_area    244
351 #define __NR_io_setup           245
352 #define __NR_io_destroy         246
353 #define __NR_io_getevents       247
354 #define __NR_io_submit          248
355 #define __NR_io_cancel          249
356 #define __NR_fadvise64          250
357 /* 251 is available for reuse (was briefly sys_set_zone_reclaim) */
358 #define __NR_exit_group         252
359 #define __NR_lookup_dcookie     253
360 #define __NR_epoll_create       254
361 #define __NR_epoll_ctl          255
362 #define __NR_epoll_wait         256
363 #define __NR_remap_file_pages   257
364 #define __NR_set_tid_address    258
365 #define __NR_timer_create       259
366 #define __NR_timer_settime      (__NR_timer_create+1)
367 #define __NR_timer_gettime      (__NR_timer_create+2)
368 #define __NR_timer_getoverrun   (__NR_timer_create+3)
369 #define __NR_timer_delete       (__NR_timer_create+4)
370 #define __NR_clock_settime      (__NR_timer_create+5)
371 #define __NR_clock_gettime      (__NR_timer_create+6)
372 #define __NR_clock_getres       (__NR_timer_create+7)
373 #define __NR_clock_nanosleep    (__NR_timer_create+8)
374 #define __NR_statfs64           268
375 #define __NR_fstatfs64          269
376 #define __NR_tgkill             270
377 #define __NR_utimes             271
378 #define __NR_fadvise64_64       272
379 #define __NR_vserver            273
380 #define __NR_mbind              274
381 #define __NR_get_mempolicy      275
382 #define __NR_set_mempolicy      276
383 #define __NR_mq_open            277
384 #define __NR_mq_unlink          (__NR_mq_open+1)
385 #define __NR_mq_timedsend       (__NR_mq_open+2)
386 #define __NR_mq_timedreceive    (__NR_mq_open+3)
387 #define __NR_mq_notify          (__NR_mq_open+4)
388 #define __NR_mq_getsetattr      (__NR_mq_open+5)
389 #define __NR_kexec_load         283
390 #define __NR_waitid             284
391 /* #define __NR_sys_setaltroot  285 */
392 #define __NR_add_key            286
393 #define __NR_request_key        287
394 #define __NR_keyctl             288
395 #define __NR_ioprio_set         289
396 #define __NR_ioprio_get         290
397 #define __NR_inotify_init       291
398 #define __NR_inotify_add_watch  292
399 #define __NR_inotify_rm_watch   293
400 #define __NR_migrate_pages      294
401 #define __NR_openat             295
402 #define __NR_mkdirat            296
403 #define __NR_mknodat            297
404 #define __NR_fchownat           298
405 #define __NR_futimesat          299
406 #define __NR_fstatat64          300
407 #define __NR_unlinkat           301
408 #define __NR_renameat           302
409 #define __NR_linkat             303
410 #define __NR_symlinkat          304
411 #define __NR_readlinkat         305
412 #define __NR_fchmodat           306
413 #define __NR_faccessat          307
414 #define __NR_pselect6           308
415 #define __NR_ppoll              309
416 #define __NR_unshare            310
417 #define __NR_set_robust_list    311
418 #define __NR_get_robust_list    312
419 #define __NR_splice             313
420 #define __NR_sync_file_range    314
421 #define __NR_tee                315
422 #define __NR_vmsplice           316
423 #define __NR_move_pages         317
424 #define __NR_getcpu             318
425 #define __NR_epoll_pwait        319
426 #define __NR_utimensat          320
427 #define __NR_signalfd           321
428 #define __NR_timerfd_create     322
429 #define __NR_eventfd            323
430 #define __NR_fallocate          324
431 #define __NR_timerfd_settime    325
432 #define __NR_timerfd_gettime    326
433 #define __NR_signalfd4          327
434 #define __NR_eventfd2           328
435 #define __NR_epoll_create1      329
436 #define __NR_dup3               330
437 #define __NR_pipe2              331
438 #define __NR_inotify_init1      332
439 #define __NR_preadv             333
440 #define __NR_pwritev            334
441
442 /* fixup legacy 16-bit junk */
443 #undef __NR_lchown
444 #undef __NR_getuid
445 #undef __NR_getgid
446 #undef __NR_geteuid
447 #undef __NR_getegid
448 #undef __NR_setreuid
449 #undef __NR_setregid
450 #undef __NR_getgroups
451 #undef __NR_setgroups
452 #undef __NR_fchown
453 #undef __NR_setresuid
454 #undef __NR_getresuid
455 #undef __NR_setresgid
456 #undef __NR_getresgid
457 #undef __NR_chown
458 #undef __NR_setuid
459 #undef __NR_setgid
460 #undef __NR_setfsuid
461 #undef __NR_setfsgid
462 #define __NR_lchown __NR_lchown32
463 #define __NR_getuid __NR_getuid32
464 #define __NR_getgid __NR_getgid32
465 #define __NR_geteuid __NR_geteuid32
466 #define __NR_getegid __NR_getegid32
467 #define __NR_setreuid __NR_setreuid32
468 #define __NR_setregid __NR_setregid32
469 #define __NR_getgroups __NR_getgroups32
470 #define __NR_setgroups __NR_setgroups32
471 #define __NR_fchown __NR_fchown32
472 #define __NR_setresuid __NR_setresuid32
473 #define __NR_getresuid __NR_getresuid32
474 #define __NR_setresgid __NR_setresgid32
475 #define __NR_getresgid __NR_getresgid32
476 #define __NR_chown __NR_chown32
477 #define __NR_setuid __NR_setuid32
478 #define __NR_setgid __NR_setgid32
479 #define __NR_setfsuid __NR_setfsuid32
480 #define __NR_setfsgid __NR_setfsgid32
481
482
483 #undef O_LARGEFILE
484 #define O_LARGEFILE 0100000
485
486 /* the following are needed for iso c functions to use */
487 #define __syscall_open(filename, flags, mode) syscall3(__NR_open, (long)(filename), (flags)|O_LARGEFILE, (mode))
488 #define __syscall_read(fd, buf, len)          syscall3(__NR_read, (fd), (long)(buf), (len))
489 #define __syscall_write(fd, buf, len)         syscall3(__NR_write, (fd), (long)(buf), (len))
490 #define __syscall_close(fd)                   syscall1(__NR_close, (fd))
491 #define __syscall_fcntl(fd, cmd, arg)         syscall3(__NR_fcntl64, (fd), (cmd), (long)(arg))
492 #define __syscall_dup2(old, new)              syscall2(__NR_dup2, (old), (new))
493 #define __syscall_unlink(path)                syscall1(__NR_unlink, (long)(path))
494 #define __syscall_getpid()                    syscall0(__NR_getpid)
495 #define __syscall_kill(pid,sig)               syscall2(__NR_kill, (pid), (sig))
496 #define __syscall_sigaction(sig,new,old)      syscall4(__NR_rt_sigaction, (sig), (long)(new), (long)(old), SYSCALL_SIGSET_SIZE)
497 #define __syscall_ioctl(fd,ioc,arg)           syscall3(__NR_ioctl, (fd), (ioc), (long)(arg))
498 #define __syscall_exit(code)                  syscall1(__NR_exit, code)
499
500 #endif