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