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