summaryrefslogtreecommitdiff
path: root/arch/x86_64/syscall.h
blob: 274fcd72c37d8d48c7935c8bf896d1d8c3ad6b2a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
#ifndef _SYSCALL_H
#define _SYSCALL_H

#define SYSCALL_LL(x) x, 0
#define SYSCALL_SIGSET_SIZE 8

#if defined(SYSCALL_STANDALONE)
#include <errno.h>
static inline long __syscall_ret(unsigned long r)
{
	if (r >= (unsigned long)-1 - 4096) {
		errno = -(long)r;
		return -1;
	}
	return (long)r;
}
#elif defined(SYSCALL_NORETURN)
static inline long __syscall_ret(unsigned long r)
{
	for(;;);
	return 0;
}
#elif defined(SYSCALL_RETURN_ERRNO)
static inline long __syscall_ret(unsigned long r)
{
	return -r;
}
#else
extern long __syscall_ret(unsigned long);
#endif

// 64: di,  si,  dx,  r10, r8,  r9
// 32: ebx, ecx, edx, esi, edi, ebp

#define SYSCALL "syscall"

static inline long syscall0(long n)
{
	unsigned long ret;
	__asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n) : "rcx", "r11", "memory");
	return __syscall_ret(ret);
}

static inline long syscall1(long n, long a1)
{
	unsigned long ret;
	__asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), "D"(a1) : "rcx", "r11", "memory");
	return __syscall_ret(ret);
}

static inline long syscall2(long n, long a1, long a2)
{
	unsigned long ret;
	__asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), "D"(a1), "S"(a2)
						  : "rcx", "r11", "memory");
	return __syscall_ret(ret);
}

static inline long syscall3(long n, long a1, long a2, long a3)
{
	unsigned long ret;
	__asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
						  "d"(a3) : "rcx", "r11", "memory");
	return __syscall_ret(ret);
}

static inline long syscall4(long n, long a1, long a2, long a3, long a4)
{
	unsigned long ret;
	register long r10 __asm__("r10") = a4;
	__asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
						  "d"(a3), "r"(r10): "rcx", "r11", "memory");
	return __syscall_ret(ret);
}

static inline long syscall5(long n, long a1, long a2, long a3, long a4,
							long a5)
{
	unsigned long ret;
	register long r10 __asm__("r10") = a4;
	register long r8 __asm__("r8") = a5;
	__asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
						  "d"(a3), "r"(r10), "r"(r8) : "rcx", "r11", "memory");
	return __syscall_ret(ret);
}

static inline long syscall6(long n, long a1, long a2, long a3, long a4,
							long a5, long a6)
{
	unsigned long ret;
	register long r10 __asm__("r10") = a4;
	register long r8 __asm__("r8") = a5;
	register long r9 __asm__("r9") = a6;
	__asm__ __volatile__ (SYSCALL : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
						  "d"(a3), "r"(r10), "r"(r8), "r"(r9) : "rcx", "r11", "memory");
	return __syscall_ret(ret);
}

#define __NR_read				0
#define __NR_write				1
#define __NR_open				2
#define __NR_close				3
#define __NR_stat				4
#define __NR_fstat				5
#define __NR_lstat				6
#define __NR_poll				7
#define __NR_lseek				8
#define __NR_mmap				9
#define __NR_mprotect			10
#define __NR_munmap				11
#define __NR_brk				12
#define __NR_rt_sigaction		13
#define __NR_rt_sigprocmask		14
#define __NR_rt_sigreturn		15
#define __NR_ioctl				16
#define __NR_pread64			17
#define __NR_pwrite64			18
#define __NR_readv				19
#define __NR_writev				20
#define __NR_access				21
#define __NR_pipe				22
#define __NR_select				23
#define __NR_sched_yield		24
#define __NR_mremap				25
#define __NR_msync				26
#define __NR_mincore			27
#define __NR_madvise			28
#define __NR_shmget				29
#define __NR_shmat				30
#define __NR_shmctl				31
#define __NR_dup				32
#define __NR_dup2				33
#define __NR_pause				34
#define __NR_nanosleep			35
#define __NR_getitimer			36
#define __NR_alarm				37
#define __NR_setitimer			38
#define __NR_getpid				39
#define __NR_sendfile			40
#define __NR_socket				41
#define __NR_connect			42
#define __NR_accept				43
#define __NR_sendto				44
#define __NR_recvfrom			45
#define __NR_sendmsg			46
#define __NR_recvmsg			47
#define __NR_shutdown			48
#define __NR_bind				49
#define __NR_listen				50
#define __NR_getsockname		51
#define __NR_getpeername		52
#define __NR_socketpair			53
#define __NR_setsockopt			54
#define __NR_getsockopt			55
#define __NR_clone				56
#define __NR_fork				57
#define __NR_vfork				58
#define __NR_execve				59
#define __NR_exit				60
#define __NR_wait4				61
#define __NR_kill				62
#define __NR_uname				63
#define __NR_semget				64
#define __NR_semop				65
#define __NR_semctl				66
#define __NR_shmdt				67
#define __NR_msgget				68
#define __NR_msgsnd				69
#define __NR_msgrcv				70
#define __NR_msgctl				71
#define __NR_fcntl				72
#define __NR_flock				73
#define __NR_fsync				74
#define __NR_fdatasync			75
#define __NR_truncate			76
#define __NR_ftruncate			77
#define __NR_getdents			78
#define __NR_getcwd				79
#define __NR_chdir				80
#define __NR_fchdir				81
#define __NR_rename				82
#define __NR_mkdir				83
#define __NR_rmdir				84
#define __NR_creat				85
#define __NR_link				86
#define __NR_unlink				87
#define __NR_symlink			88
#define __NR_readlink			89
#define __NR_chmod				90
#define __NR_fchmod				91
#define __NR_chown				92
#define __NR_fchown				93
#define __NR_lchown				94
#define __NR_umask				95
#define __NR_gettimeofday		96
#define __NR_getrlimit			97
#define __NR_getrusage			98
#define __NR_sysinfo			99
#define __NR_times				100
#define __NR_ptrace				101
#define __NR_getuid				102
#define __NR_syslog				103
#define __NR_getgid				104
#define __NR_setuid				105
#define __NR_setgid				106
#define __NR_geteuid			107
#define __NR_getegid			108
#define __NR_setpgid			109
#define __NR_getppid			110
#define __NR_getpgrp			111
#define __NR_setsid				112
#define __NR_setreuid			113
#define __NR_setregid			114
#define __NR_getgroups			115
#define __NR_setgroups			116
#define __NR_setresuid			117
#define __NR_getresuid			118
#define __NR_setresgid			119
#define __NR_getresgid			120
#define __NR_getpgid			121
#define __NR_setfsuid			122
#define __NR_setfsgid			123
#define __NR_getsid				124
#define __NR_capget				125
#define __NR_capset				126
#define __NR_rt_sigpending		127
#define __NR_rt_sigtimedwait	128
#define __NR_rt_sigqueueinfo	129
#define __NR_rt_sigsuspend		130
#define __NR_sigaltstack		131
#define __NR_utime				132
#define __NR_mknod				133
#define __NR_uselib				134
#define __NR_personality		135
#define __NR_ustat				136
#define __NR_statfs				137
#define __NR_fstatfs			138
#define __NR_sysfs				139
#define __NR_getpriority			140
#define __NR_setpriority			141
#define __NR_sched_setparam			142
#define __NR_sched_getparam			143
#define __NR_sched_setscheduler		144
#define __NR_sched_getscheduler		145
#define __NR_sched_get_priority_max	146
#define __NR_sched_get_priority_min	147
#define __NR_sched_rr_get_interval	148
#define __NR_mlock					149
#define __NR_munlock				150
#define __NR_mlockall				151
#define __NR_munlockall				152
#define __NR_vhangup				153
#define __NR_modify_ldt				154
#define __NR_pivot_root				155
#define __NR__sysctl				156
#define __NR_prctl					157
#define __NR_arch_prctl				158
#define __NR_adjtimex				159
#define __NR_setrlimit				160
#define __NR_chroot					161
#define __NR_sync					162
#define __NR_acct					163
#define __NR_settimeofday			164
#define __NR_mount					165
#define __NR_umount2				166
#define __NR_swapon					167
#define __NR_swapoff				168
#define __NR_reboot					169
#define __NR_sethostname			170
#define __NR_setdomainname			171
#define __NR_iopl					172
#define __NR_ioperm					173
#define __NR_create_module			174
#define __NR_init_module			175
#define __NR_delete_module			176
#define __NR_get_kernel_syms		177
#define __NR_query_module			178
#define __NR_quotactl				179
#define __NR_nfsservctl				180
#define __NR_getpmsg				181
#define __NR_putpmsg				182
#define __NR_afs_syscall			183
#define __NR_tuxcall				184
#define __NR_security				185
#define __NR_gettid					186
#define __NR_readahead				187
#define __NR_setxattr				188
#define __NR_lsetxattr				189
#define __NR_fsetxattr				190
#define __NR_getxattr				191
#define __NR_lgetxattr				192
#define __NR_fgetxattr				193
#define __NR_listxattr				194
#define __NR_llistxattr				195
#define __NR_flistxattr				196
#define __NR_removexattr			197
#define __NR_lremovexattr			198
#define __NR_fremovexattr			199
#define __NR_tkill					200
#define __NR_time					201
#define __NR_futex					202
#define __NR_sched_setaffinity		203
#define __NR_sched_getaffinity		204
#define __NR_set_thread_area		205
#define __NR_io_setup				206
#define __NR_io_destroy				207
#define __NR_io_getevents			208
#define __NR_io_submit				209
#define __NR_io_cancel				210
#define __NR_get_thread_area		211
#define __NR_lookup_dcookie			212
#define __NR_epoll_create			213
#define __NR_epoll_ctl_old			214
#define __NR_epoll_wait_old			215
#define __NR_remap_file_pages		216
#define __NR_getdents64				217
#define __NR_set_tid_address		218
#define __NR_restart_syscall		219
#define __NR_semtimedop				220
#define __NR_fadvise64				221
#define __NR_timer_create			222
#define __NR_timer_settime			223
#define __NR_timer_gettime			224
#define __NR_timer_getoverrun		225
#define __NR_timer_delete			226
#define __NR_clock_settime			227
#define __NR_clock_gettime			228
#define __NR_clock_getres			229
#define __NR_clock_nanosleep		230
#define __NR_exit_group				231
#define __NR_epoll_wait				232
#define __NR_epoll_ctl				233
#define __NR_tgkill					234
#define __NR_utimes					235
#define __NR_vserver				236
#define __NR_mbind					237
#define __NR_set_mempolicy			238
#define __NR_get_mempolicy			239
#define __NR_mq_open				240
#define __NR_mq_unlink				241
#define __NR_mq_timedsend			242
#define __NR_mq_timedreceive		243
#define __NR_mq_notify				244
#define __NR_mq_getsetattr			245
#define __NR_kexec_load				246
#define __NR_waitid					247
#define __NR_add_key				248
#define __NR_request_key			249
#define __NR_keyctl					250
#define __NR_ioprio_set				251
#define __NR_ioprio_get				252
#define __NR_inotify_init			253
#define __NR_inotify_add_watch		254
#define __NR_inotify_rm_watch		255
#define __NR_migrate_pages			256
#define __NR_openat					257
#define __NR_mkdirat				258
#define __NR_mknodat				259
#define __NR_fchownat				260
#define __NR_futimesat				261
#define __NR_newfstatat				262
#define __NR_unlinkat				263
#define __NR_renameat				264
#define __NR_linkat					265
#define __NR_symlinkat				266
#define __NR_readlinkat				267
#define __NR_fchmodat				268
#define __NR_faccessat				269
#define __NR_pselect6				270
#define __NR_ppoll					271
#define __NR_unshare				272
#define __NR_set_robust_list		273
#define __NR_get_robust_list		274
#define __NR_splice					275
#define __NR_tee					276
#define __NR_sync_file_range		277
#define __NR_vmsplice				278
#define __NR_move_pages				279
#define __NR_utimensat				280
#define __NR_epoll_pwait			281
#define __NR_signalfd				282
#define __NR_timerfd_create			283
#define __NR_eventfd				284
#define __NR_fallocate				285
#define __NR_timerfd_settime		286
#define __NR_timerfd_gettime		287
#define __NR_accept4				288
#define __NR_signalfd4				289
#define __NR_eventfd2				290
#define __NR_epoll_create1			291
#define __NR_dup3					292
#define __NR_pipe2					293
#define __NR_inotify_init1			294
#define __NR_preadv					295
#define __NR_pwritev				296
#define __NR_rt_tgsigqueueinfo		297
#define __NR_perf_event_open		298
#define __NR_recvmmsg				299
#define __NR_fanotify_init			300
#define __NR_fanotify_mark			301
#define __NR_prlimit64				302

#undef __NR_fstatat
#undef __NR_pread
#undef __NR_pwrite
#define __NR_fstatat __NR_newfstatat
#define __NR_pread __NR_pread64
#define __NR_pwrite __NR_pwrite64

#undef O_LARGEFILE
#define O_LARGEFILE 0100000

#define socketcall(nm, a, b, c, d, e, f) syscall6(__NR_##nm, \
    (long)a, (long)b, (long)c, (long)d, (long)e, (long)f)

/* the following are needed for iso c functions to use */
#define __syscall_open(filename, flags, mode) syscall3(__NR_open, (long)(filename), (flags)|O_LARGEFILE, (mode))
#define __syscall_read(fd, buf, len)          syscall3(__NR_read, (fd), (long)(buf), (len))
#define __syscall_write(fd, buf, len)         syscall3(__NR_write, (fd), (long)(buf), (len))
#define __syscall_close(fd)                   syscall1(__NR_close, (fd))
#define __syscall_fcntl(fd, cmd, arg)         syscall3(__NR_fcntl, (fd), (cmd), (long)(arg))
#define __syscall_dup2(old, new)              syscall2(__NR_dup2, (old), (new))
#define __syscall_unlink(path)                syscall1(__NR_unlink, (long)(path))
#define __syscall_getpid()                    syscall0(__NR_getpid)
#define __syscall_kill(pid,sig)               syscall2(__NR_kill, (pid), (sig))
#define __syscall_sigaction(sig,new,old)      syscall4(__NR_rt_sigaction, (sig), (long)(new), (long)(old), SYSCALL_SIGSET_SIZE)
#define __syscall_ioctl(fd,ioc,arg)           syscall3(__NR_ioctl, (fd), (ioc), (long)(arg))
#define __syscall_exit(code)                  syscall1(__NR_exit, code)

#define __NEED_off_t
#include <bits/alltypes.h>

static inline off_t __syscall_lseek(int fd, off_t offset, int whence)
{
	return syscall3(__NR_lseek, fd, offset, whence);
}

#endif