274fcd72c37d8d48c7935c8bf896d1d8c3ad6b2a
[musl] / arch / x86_64 / syscall.h
1 #ifndef _SYSCALL_H
2 #define _SYSCALL_H
3
4 #define SYSCALL_LL(x) x, 0
5 #define SYSCALL_SIGSET_SIZE 8
6
7 #if defined(SYSCALL_STANDALONE)
8 #include <errno.h>
9 static inline long __syscall_ret(unsigned long r)
10 {
11         if (r >= (unsigned long)-1 - 4096) {
12                 errno = -(long)r;
13                 return -1;
14         }
15         return (long)r;
16 }
17 #elif defined(SYSCALL_NORETURN)
18 static inline long __syscall_ret(unsigned long r)
19 {
20         for(;;);
21         return 0;
22 }
23 #elif defined(SYSCALL_RETURN_ERRNO)
24 static inline long __syscall_ret(unsigned long r)
25 {
26         return -r;
27 }
28 #else
29 extern long __syscall_ret(unsigned long);
30 #endif
31
32 // 64: di,  si,  dx,  r10, r8,  r9
33 // 32: ebx, ecx, edx, esi, edi, ebp
34
35 #define SYSCALL "syscall"
36
37 static inline long syscall0(long n)
38 {
39         unsigned long ret;
40         __asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n) : "rcx", "r11", "memory");
41         return __syscall_ret(ret);
42 }
43
44 static inline long syscall1(long n, long a1)
45 {
46         unsigned long ret;
47         __asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), "D"(a1) : "rcx", "r11", "memory");
48         return __syscall_ret(ret);
49 }
50
51 static inline long syscall2(long n, long a1, long a2)
52 {
53         unsigned long ret;
54         __asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), "D"(a1), "S"(a2)
55                                                   : "rcx", "r11", "memory");
56         return __syscall_ret(ret);
57 }
58
59 static inline long syscall3(long n, long a1, long a2, long a3)
60 {
61         unsigned long ret;
62         __asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
63                                                   "d"(a3) : "rcx", "r11", "memory");
64         return __syscall_ret(ret);
65 }
66
67 static inline long syscall4(long n, long a1, long a2, long a3, long a4)
68 {
69         unsigned long ret;
70         register long r10 __asm__("r10") = a4;
71         __asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
72                                                   "d"(a3), "r"(r10): "rcx", "r11", "memory");
73         return __syscall_ret(ret);
74 }
75
76 static inline long syscall5(long n, long a1, long a2, long a3, long a4,
77                                                         long a5)
78 {
79         unsigned long ret;
80         register long r10 __asm__("r10") = a4;
81         register long r8 __asm__("r8") = a5;
82         __asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
83                                                   "d"(a3), "r"(r10), "r"(r8) : "rcx", "r11", "memory");
84         return __syscall_ret(ret);
85 }
86
87 static inline long syscall6(long n, long a1, long a2, long a3, long a4,
88                                                         long a5, long a6)
89 {
90         unsigned long ret;
91         register long r10 __asm__("r10") = a4;
92         register long r8 __asm__("r8") = a5;
93         register long r9 __asm__("r9") = a6;
94         __asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
95                                                   "d"(a3), "r"(r10), "r"(r8), "r"(r9) : "rcx", "r11", "memory");
96         return __syscall_ret(ret);
97 }
98
99 #define __NR_read                               0
100 #define __NR_write                              1
101 #define __NR_open                               2
102 #define __NR_close                              3
103 #define __NR_stat                               4
104 #define __NR_fstat                              5
105 #define __NR_lstat                              6
106 #define __NR_poll                               7
107 #define __NR_lseek                              8
108 #define __NR_mmap                               9
109 #define __NR_mprotect                   10
110 #define __NR_munmap                             11
111 #define __NR_brk                                12
112 #define __NR_rt_sigaction               13
113 #define __NR_rt_sigprocmask             14
114 #define __NR_rt_sigreturn               15
115 #define __NR_ioctl                              16
116 #define __NR_pread64                    17
117 #define __NR_pwrite64                   18
118 #define __NR_readv                              19
119 #define __NR_writev                             20
120 #define __NR_access                             21
121 #define __NR_pipe                               22
122 #define __NR_select                             23
123 #define __NR_sched_yield                24
124 #define __NR_mremap                             25
125 #define __NR_msync                              26
126 #define __NR_mincore                    27
127 #define __NR_madvise                    28
128 #define __NR_shmget                             29
129 #define __NR_shmat                              30
130 #define __NR_shmctl                             31
131 #define __NR_dup                                32
132 #define __NR_dup2                               33
133 #define __NR_pause                              34
134 #define __NR_nanosleep                  35
135 #define __NR_getitimer                  36
136 #define __NR_alarm                              37
137 #define __NR_setitimer                  38
138 #define __NR_getpid                             39
139 #define __NR_sendfile                   40
140 #define __NR_socket                             41
141 #define __NR_connect                    42
142 #define __NR_accept                             43
143 #define __NR_sendto                             44
144 #define __NR_recvfrom                   45
145 #define __NR_sendmsg                    46
146 #define __NR_recvmsg                    47
147 #define __NR_shutdown                   48
148 #define __NR_bind                               49
149 #define __NR_listen                             50
150 #define __NR_getsockname                51
151 #define __NR_getpeername                52
152 #define __NR_socketpair                 53
153 #define __NR_setsockopt                 54
154 #define __NR_getsockopt                 55
155 #define __NR_clone                              56
156 #define __NR_fork                               57
157 #define __NR_vfork                              58
158 #define __NR_execve                             59
159 #define __NR_exit                               60
160 #define __NR_wait4                              61
161 #define __NR_kill                               62
162 #define __NR_uname                              63
163 #define __NR_semget                             64
164 #define __NR_semop                              65
165 #define __NR_semctl                             66
166 #define __NR_shmdt                              67
167 #define __NR_msgget                             68
168 #define __NR_msgsnd                             69
169 #define __NR_msgrcv                             70
170 #define __NR_msgctl                             71
171 #define __NR_fcntl                              72
172 #define __NR_flock                              73
173 #define __NR_fsync                              74
174 #define __NR_fdatasync                  75
175 #define __NR_truncate                   76
176 #define __NR_ftruncate                  77
177 #define __NR_getdents                   78
178 #define __NR_getcwd                             79
179 #define __NR_chdir                              80
180 #define __NR_fchdir                             81
181 #define __NR_rename                             82
182 #define __NR_mkdir                              83
183 #define __NR_rmdir                              84
184 #define __NR_creat                              85
185 #define __NR_link                               86
186 #define __NR_unlink                             87
187 #define __NR_symlink                    88
188 #define __NR_readlink                   89
189 #define __NR_chmod                              90
190 #define __NR_fchmod                             91
191 #define __NR_chown                              92
192 #define __NR_fchown                             93
193 #define __NR_lchown                             94
194 #define __NR_umask                              95
195 #define __NR_gettimeofday               96
196 #define __NR_getrlimit                  97
197 #define __NR_getrusage                  98
198 #define __NR_sysinfo                    99
199 #define __NR_times                              100
200 #define __NR_ptrace                             101
201 #define __NR_getuid                             102
202 #define __NR_syslog                             103
203 #define __NR_getgid                             104
204 #define __NR_setuid                             105
205 #define __NR_setgid                             106
206 #define __NR_geteuid                    107
207 #define __NR_getegid                    108
208 #define __NR_setpgid                    109
209 #define __NR_getppid                    110
210 #define __NR_getpgrp                    111
211 #define __NR_setsid                             112
212 #define __NR_setreuid                   113
213 #define __NR_setregid                   114
214 #define __NR_getgroups                  115
215 #define __NR_setgroups                  116
216 #define __NR_setresuid                  117
217 #define __NR_getresuid                  118
218 #define __NR_setresgid                  119
219 #define __NR_getresgid                  120
220 #define __NR_getpgid                    121
221 #define __NR_setfsuid                   122
222 #define __NR_setfsgid                   123
223 #define __NR_getsid                             124
224 #define __NR_capget                             125
225 #define __NR_capset                             126
226 #define __NR_rt_sigpending              127
227 #define __NR_rt_sigtimedwait    128
228 #define __NR_rt_sigqueueinfo    129
229 #define __NR_rt_sigsuspend              130
230 #define __NR_sigaltstack                131
231 #define __NR_utime                              132
232 #define __NR_mknod                              133
233 #define __NR_uselib                             134
234 #define __NR_personality                135
235 #define __NR_ustat                              136
236 #define __NR_statfs                             137
237 #define __NR_fstatfs                    138
238 #define __NR_sysfs                              139
239 #define __NR_getpriority                        140
240 #define __NR_setpriority                        141
241 #define __NR_sched_setparam                     142
242 #define __NR_sched_getparam                     143
243 #define __NR_sched_setscheduler         144
244 #define __NR_sched_getscheduler         145
245 #define __NR_sched_get_priority_max     146
246 #define __NR_sched_get_priority_min     147
247 #define __NR_sched_rr_get_interval      148
248 #define __NR_mlock                                      149
249 #define __NR_munlock                            150
250 #define __NR_mlockall                           151
251 #define __NR_munlockall                         152
252 #define __NR_vhangup                            153
253 #define __NR_modify_ldt                         154
254 #define __NR_pivot_root                         155
255 #define __NR__sysctl                            156
256 #define __NR_prctl                                      157
257 #define __NR_arch_prctl                         158
258 #define __NR_adjtimex                           159
259 #define __NR_setrlimit                          160
260 #define __NR_chroot                                     161
261 #define __NR_sync                                       162
262 #define __NR_acct                                       163
263 #define __NR_settimeofday                       164
264 #define __NR_mount                                      165
265 #define __NR_umount2                            166
266 #define __NR_swapon                                     167
267 #define __NR_swapoff                            168
268 #define __NR_reboot                                     169
269 #define __NR_sethostname                        170
270 #define __NR_setdomainname                      171
271 #define __NR_iopl                                       172
272 #define __NR_ioperm                                     173
273 #define __NR_create_module                      174
274 #define __NR_init_module                        175
275 #define __NR_delete_module                      176
276 #define __NR_get_kernel_syms            177
277 #define __NR_query_module                       178
278 #define __NR_quotactl                           179
279 #define __NR_nfsservctl                         180
280 #define __NR_getpmsg                            181
281 #define __NR_putpmsg                            182
282 #define __NR_afs_syscall                        183
283 #define __NR_tuxcall                            184
284 #define __NR_security                           185
285 #define __NR_gettid                                     186
286 #define __NR_readahead                          187
287 #define __NR_setxattr                           188
288 #define __NR_lsetxattr                          189
289 #define __NR_fsetxattr                          190
290 #define __NR_getxattr                           191
291 #define __NR_lgetxattr                          192
292 #define __NR_fgetxattr                          193
293 #define __NR_listxattr                          194
294 #define __NR_llistxattr                         195
295 #define __NR_flistxattr                         196
296 #define __NR_removexattr                        197
297 #define __NR_lremovexattr                       198
298 #define __NR_fremovexattr                       199
299 #define __NR_tkill                                      200
300 #define __NR_time                                       201
301 #define __NR_futex                                      202
302 #define __NR_sched_setaffinity          203
303 #define __NR_sched_getaffinity          204
304 #define __NR_set_thread_area            205
305 #define __NR_io_setup                           206
306 #define __NR_io_destroy                         207
307 #define __NR_io_getevents                       208
308 #define __NR_io_submit                          209
309 #define __NR_io_cancel                          210
310 #define __NR_get_thread_area            211
311 #define __NR_lookup_dcookie                     212
312 #define __NR_epoll_create                       213
313 #define __NR_epoll_ctl_old                      214
314 #define __NR_epoll_wait_old                     215
315 #define __NR_remap_file_pages           216
316 #define __NR_getdents64                         217
317 #define __NR_set_tid_address            218
318 #define __NR_restart_syscall            219
319 #define __NR_semtimedop                         220
320 #define __NR_fadvise64                          221
321 #define __NR_timer_create                       222
322 #define __NR_timer_settime                      223
323 #define __NR_timer_gettime                      224
324 #define __NR_timer_getoverrun           225
325 #define __NR_timer_delete                       226
326 #define __NR_clock_settime                      227
327 #define __NR_clock_gettime                      228
328 #define __NR_clock_getres                       229
329 #define __NR_clock_nanosleep            230
330 #define __NR_exit_group                         231
331 #define __NR_epoll_wait                         232
332 #define __NR_epoll_ctl                          233
333 #define __NR_tgkill                                     234
334 #define __NR_utimes                                     235
335 #define __NR_vserver                            236
336 #define __NR_mbind                                      237
337 #define __NR_set_mempolicy                      238
338 #define __NR_get_mempolicy                      239
339 #define __NR_mq_open                            240
340 #define __NR_mq_unlink                          241
341 #define __NR_mq_timedsend                       242
342 #define __NR_mq_timedreceive            243
343 #define __NR_mq_notify                          244
344 #define __NR_mq_getsetattr                      245
345 #define __NR_kexec_load                         246
346 #define __NR_waitid                                     247
347 #define __NR_add_key                            248
348 #define __NR_request_key                        249
349 #define __NR_keyctl                                     250
350 #define __NR_ioprio_set                         251
351 #define __NR_ioprio_get                         252
352 #define __NR_inotify_init                       253
353 #define __NR_inotify_add_watch          254
354 #define __NR_inotify_rm_watch           255
355 #define __NR_migrate_pages                      256
356 #define __NR_openat                                     257
357 #define __NR_mkdirat                            258
358 #define __NR_mknodat                            259
359 #define __NR_fchownat                           260
360 #define __NR_futimesat                          261
361 #define __NR_newfstatat                         262
362 #define __NR_unlinkat                           263
363 #define __NR_renameat                           264
364 #define __NR_linkat                                     265
365 #define __NR_symlinkat                          266
366 #define __NR_readlinkat                         267
367 #define __NR_fchmodat                           268
368 #define __NR_faccessat                          269
369 #define __NR_pselect6                           270
370 #define __NR_ppoll                                      271
371 #define __NR_unshare                            272
372 #define __NR_set_robust_list            273
373 #define __NR_get_robust_list            274
374 #define __NR_splice                                     275
375 #define __NR_tee                                        276
376 #define __NR_sync_file_range            277
377 #define __NR_vmsplice                           278
378 #define __NR_move_pages                         279
379 #define __NR_utimensat                          280
380 #define __NR_epoll_pwait                        281
381 #define __NR_signalfd                           282
382 #define __NR_timerfd_create                     283
383 #define __NR_eventfd                            284
384 #define __NR_fallocate                          285
385 #define __NR_timerfd_settime            286
386 #define __NR_timerfd_gettime            287
387 #define __NR_accept4                            288
388 #define __NR_signalfd4                          289
389 #define __NR_eventfd2                           290
390 #define __NR_epoll_create1                      291
391 #define __NR_dup3                                       292
392 #define __NR_pipe2                                      293
393 #define __NR_inotify_init1                      294
394 #define __NR_preadv                                     295
395 #define __NR_pwritev                            296
396 #define __NR_rt_tgsigqueueinfo          297
397 #define __NR_perf_event_open            298
398 #define __NR_recvmmsg                           299
399 #define __NR_fanotify_init                      300
400 #define __NR_fanotify_mark                      301
401 #define __NR_prlimit64                          302
402
403 #undef __NR_fstatat
404 #undef __NR_pread
405 #undef __NR_pwrite
406 #define __NR_fstatat __NR_newfstatat
407 #define __NR_pread __NR_pread64
408 #define __NR_pwrite __NR_pwrite64
409
410 #undef O_LARGEFILE
411 #define O_LARGEFILE 0100000
412
413 #define socketcall(nm, a, b, c, d, e, f) syscall6(__NR_##nm, \
414     (long)a, (long)b, (long)c, (long)d, (long)e, (long)f)
415
416 /* the following are needed for iso c functions to use */
417 #define __syscall_open(filename, flags, mode) syscall3(__NR_open, (long)(filename), (flags)|O_LARGEFILE, (mode))
418 #define __syscall_read(fd, buf, len)          syscall3(__NR_read, (fd), (long)(buf), (len))
419 #define __syscall_write(fd, buf, len)         syscall3(__NR_write, (fd), (long)(buf), (len))
420 #define __syscall_close(fd)                   syscall1(__NR_close, (fd))
421 #define __syscall_fcntl(fd, cmd, arg)         syscall3(__NR_fcntl, (fd), (cmd), (long)(arg))
422 #define __syscall_dup2(old, new)              syscall2(__NR_dup2, (old), (new))
423 #define __syscall_unlink(path)                syscall1(__NR_unlink, (long)(path))
424 #define __syscall_getpid()                    syscall0(__NR_getpid)
425 #define __syscall_kill(pid,sig)               syscall2(__NR_kill, (pid), (sig))
426 #define __syscall_sigaction(sig,new,old)      syscall4(__NR_rt_sigaction, (sig), (long)(new), (long)(old), SYSCALL_SIGSET_SIZE)
427 #define __syscall_ioctl(fd,ioc,arg)           syscall3(__NR_ioctl, (fd), (ioc), (long)(arg))
428 #define __syscall_exit(code)                  syscall1(__NR_exit, code)
429
430 #define __NEED_off_t
431 #include <bits/alltypes.h>
432
433 static inline off_t __syscall_lseek(int fd, off_t offset, int whence)
434 {
435         return syscall3(__NR_lseek, fd, offset, whence);
436 }
437
438 #endif