Line data Source code
1 : /*
2 : Copyright 2018-2024, Barcelona Supercomputing Center (BSC), Spain
3 : Copyright 2015-2024, Johannes Gutenberg Universitaet Mainz, Germany
4 :
5 : This software was partially supported by the
6 : EC H2020 funded project NEXTGenIO (Project ID: 671951, www.nextgenio.eu).
7 :
8 : This software was partially supported by the
9 : ADA-FS project under the SPPEXA project funded by the DFG.
10 :
11 : This file is part of GekkoFS' POSIX interface.
12 :
13 : GekkoFS' POSIX interface is free software: you can redistribute it and/or
14 : modify it under the terms of the GNU Lesser General Public License as
15 : published by the Free Software Foundation, either version 3 of the License,
16 : or (at your option) any later version.
17 :
18 : GekkoFS' POSIX interface is distributed in the hope that it will be useful,
19 : but WITHOUT ANY WARRANTY; without even the implied warranty of
20 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 : GNU Lesser General Public License for more details.
22 :
23 : You should have received a copy of the GNU Lesser General Public License
24 : along with GekkoFS' POSIX interface. If not, see
25 : <https://www.gnu.org/licenses/>.
26 :
27 : SPDX-License-Identifier: LGPL-3.0-or-later
28 : */
29 :
30 : // This file uses special C formatting for a better overview
31 : // clang-format off
32 :
33 : #define _GNU_SOURCE
34 : #include <syscall.h>
35 : #include <stdbool.h>
36 : #include <stddef.h>
37 : #include <sys/types.h>
38 : #include <sys/stat.h>
39 : #include <fcntl.h>
40 : #include <string.h>
41 : #include <stdlib.h>
42 : #include <client/syscalls/detail/syscall_info.h>
43 :
44 : #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
45 :
46 : #define SYSCALL(id, nargs, ret, ...) \
47 : [SYS_##id] = \
48 : { \
49 : .s_nr = SYS_##id, \
50 : .s_name = #id, \
51 : .s_nargs = nargs, \
52 : .s_return_type = ret, \
53 : .s_args = {__VA_ARGS__} \
54 : }
55 :
56 : #define S_NOARGS() {0}
57 :
58 : #define S_UARG(t) \
59 : { \
60 : .a_type = t, \
61 : .a_name = #t \
62 : }
63 :
64 : #define S_NARG(t, n) \
65 : { \
66 : .a_type = t, \
67 : .a_name = n \
68 : }
69 :
70 : #define S_RET(t) \
71 : { \
72 : .r_type = t \
73 : }
74 :
75 : /* Linux syscalls on x86_64 */
76 : const struct syscall_info syscall_table[] = {
77 : SYSCALL(read, 3, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "buf"), S_NARG(arg, "count")),
78 : SYSCALL(write, 3, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "buf"), S_NARG(arg, "count")),
79 : #ifdef SYS_open
80 : SYSCALL(open, 2, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(open_flags, "flags")),
81 : #endif
82 : SYSCALL(close, 1, S_RET(rdec), S_UARG(fd)),
83 : #ifdef SYS_stat
84 : SYSCALL(stat, 2, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(ptr, "statbuf")),
85 : #endif
86 : SYSCALL(fstat, 2, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "statbuf")),
87 : #ifdef SYS_lstat
88 : SYSCALL(lstat, 2, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(ptr, "statbuf")),
89 : #endif
90 : #ifdef SYS_poll
91 : SYSCALL(poll, 3, S_RET(rdec), S_NARG(ptr, "fds"), S_NARG(dec, "nfds"), S_NARG(dec, "timeout")),
92 : #endif
93 : SYSCALL(lseek, 3, S_RET(rdec), S_UARG(fd), S_UARG(offset), S_UARG(whence)),
94 : SYSCALL(mmap, 6, S_RET(rptr), S_NARG(ptr, "addr"), S_NARG(dec, "length"), S_NARG(mmap_prot, "prot"), S_NARG(mmap_flags, "flags"), S_UARG(fd), S_UARG(offset)),
95 : SYSCALL(mprotect, 3, S_RET(rdec), S_NARG(ptr, "addr"), S_NARG(dec, "length"), S_NARG(mmap_prot, "prot")),
96 : SYSCALL(munmap, 2, S_RET(rdec), S_NARG(ptr, "addr"), S_NARG(dec, "length")),
97 : SYSCALL(brk, 1, S_RET(rdec), S_NARG(ptr, "addr")),
98 : SYSCALL(rt_sigaction, 4, S_RET(rdec), S_NARG(signum, "signum"), S_NARG(ptr, "act"), S_NARG(ptr, "oldact"), S_NARG(dec, "sigsetsize")),
99 : SYSCALL(rt_sigprocmask, 4, S_RET(rdec), S_NARG(sigproc_how, "how"), S_NARG(ptr, "set"), S_NARG(ptr, "oldset"), S_NARG(dec, "sigsetsize")),
100 : SYSCALL(rt_sigreturn, 0, S_RET(rnone), S_NOARGS()),
101 : SYSCALL(ioctl, 3, S_RET(rdec), S_UARG(fd), S_NARG(arg, "cmd"), S_NARG(arg, "argp")),
102 : SYSCALL(pread64, 4, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "buf"), S_NARG(arg, "count"), S_UARG(offset)),
103 : SYSCALL(pwrite64, 4, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "buf"), S_NARG(arg, "count"), S_UARG(offset)),
104 : SYSCALL(readv, 3, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "iov"), S_NARG(dec, "iovcnt")),
105 : SYSCALL(writev, 3, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "iov"), S_NARG(dec, "iovcnt")),
106 : #ifdef SYS_access
107 : SYSCALL(access, 2, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(octal_mode, "mode")),
108 : #endif
109 : #ifdef SYS_pipe
110 : SYSCALL(pipe, 1, S_RET(rdec), S_NARG(ptr, "pipefd")),
111 : #endif
112 : #ifdef SYS_select
113 : SYSCALL(select, 5, S_RET(rdec), S_NARG(dec, "nfds"), S_NARG(ptr, "readfds"), S_NARG(ptr, "writefds"), S_NARG(ptr, "exceptfds"), S_NARG(ptr, "timeout")),
114 : #endif
115 : SYSCALL(sched_yield, 0, S_RET(rdec), S_NOARGS()),
116 : SYSCALL(mremap, 5, S_RET(rdec), S_NARG(ptr, "old_address"), S_NARG(dec, "old_size"), S_NARG(dec, "new_size"), S_NARG(arg, "flags"), S_NARG(ptr, "new_addr")),
117 : SYSCALL(msync, 3, S_RET(rdec), S_NARG(ptr, "addr"), S_NARG(dec, "length"), S_NARG(arg, "flags")),
118 : SYSCALL(mincore, 3, S_RET(rdec), S_NARG(ptr, "addr"), S_NARG(dec, "length"), S_NARG(ptr, "vec")),
119 : SYSCALL(madvise, 3, S_RET(rdec), S_NARG(ptr, "addr"), S_NARG(dec, "length"), S_NARG(arg, "behavior")),
120 : #ifdef SYS_semget
121 : SYSCALL(shmget, 3, S_RET(rdec), S_NARG(arg, "key"), S_NARG(dec, "size"), S_NARG(arg, "flag")),
122 : #endif // SYS_semget
123 : #ifdef SYS_shmat
124 : SYSCALL(shmat, 3, S_RET(rdec), S_NARG(arg, "shmid"), S_NARG(ptr, "shmaddr"), S_NARG(arg, "shmflg")),
125 : #endif // SYS_shmat
126 : #ifdef SYS_shmctl
127 : SYSCALL(shmctl, 3, S_RET(rdec), S_NARG(arg, "shmid"), S_NARG(arg, "cmd"), S_NARG(ptr, "buf")),
128 : #endif // SYS_shmctl
129 : SYSCALL(dup, 1, S_RET(rdec), S_NARG(fd, "oldfd")),
130 : #ifdef SYS_dup2
131 : SYSCALL(dup2, 2, S_RET(rdec), S_NARG(fd, "oldfd"), S_NARG(fd, "newfd")),
132 : #endif
133 : #ifdef SYS_pause
134 : SYSCALL(pause, 0, S_RET(rdec), S_NOARGS()),
135 : #endif
136 : SYSCALL(nanosleep, 2, S_RET(rdec), S_NARG(ptr, "rqtp"), S_NARG(ptr, "rmtp")),
137 : SYSCALL(getitimer, 2, S_RET(rdec), S_NARG(arg, "which"), S_NARG(ptr, "value")),
138 : #ifdef SYS_alarm
139 : SYSCALL(alarm, 1, S_RET(rdec), S_NARG(dec, "seconds")),
140 : #endif
141 : SYSCALL(setitimer, 3, S_RET(rdec), S_NARG(arg, "which"), S_NARG(ptr, "value"), S_NARG(ptr, "ovalue")),
142 : SYSCALL(getpid, 0, S_RET(rdec), S_NOARGS()),
143 : SYSCALL(sendfile, 4, S_RET(rdec), S_NARG(fd, "out_fd"), S_NARG(fd, "in_fd"), S_NARG(ptr, "offset"), S_NARG(arg, "count")),
144 : SYSCALL(socket, 3, S_RET(rdec), S_NARG(arg, "domain"), S_NARG(arg, "type"), S_NARG(arg, "protocol")),
145 : SYSCALL(connect, 3, S_RET(rdec), S_NARG(fd, "sockfd"), S_NARG(ptr, "addr"), S_NARG(arg, "addrlen")),
146 : SYSCALL(accept, 3, S_RET(rdec), S_NARG(fd, "sockfd"), S_NARG(ptr, "addr"), S_NARG(ptr, "addrlen")),
147 : SYSCALL(sendto, 5, S_RET(rdec), S_NARG(fd, "sockfd"), S_NARG(ptr, "dest_addr"), S_NARG(arg, "len"), S_NARG(ptr, "addr"), S_NARG(arg, "addrlen")),
148 : SYSCALL(recvfrom, 5, S_RET(rdec), S_NARG(fd, "sockfd"), S_NARG(ptr, "src_addr"), S_NARG(arg, "len"), S_NARG(ptr, "addr"), S_NARG(ptr, "addrlen")),
149 : SYSCALL(sendmsg, 3, S_RET(rdec), S_NARG(fd, "sockfd"), S_NARG(ptr, "msg"), S_NARG(arg, "flags")),
150 : SYSCALL(recvmsg, 3, S_RET(rdec), S_NARG(fd, "sockfd"), S_NARG(ptr, "msg"), S_NARG(arg, "flags")),
151 : SYSCALL(shutdown, 2, S_RET(rdec), S_NARG(fd, "sockfd"), S_NARG(arg, "how")),
152 : SYSCALL(bind, 3, S_RET(rdec), S_NARG(fd, "sockfd"), S_NARG(ptr, "addr"), S_NARG(arg, "addrlen")),
153 : SYSCALL(listen, 2, S_RET(rdec), S_NARG(fd, "sockfd"), S_NARG(arg, "backlog")),
154 : SYSCALL(getsockname, 3, S_RET(rdec), S_NARG(fd, "sockfd"), S_NARG(ptr, "addr"), S_NARG(ptr, "addrlen")),
155 : SYSCALL(getpeername, 3, S_RET(rdec), S_NARG(fd, "sockfd"), S_NARG(ptr, "addr"), S_NARG(ptr, "addrlen")),
156 : SYSCALL(socketpair, 4, S_RET(rdec), S_NARG(arg, "domain"), S_NARG(arg, "type"), S_NARG(arg, "protocol"), S_NARG(ptr, "sv")),
157 : SYSCALL(setsockopt, 5, S_RET(rdec), S_UARG(fd), S_NARG(arg, "level"), S_NARG(arg, "optname"), S_NARG(ptr, "optval"), S_NARG(arg, "optlen")),
158 : SYSCALL(getsockopt, 5, S_RET(rdec), S_UARG(fd), S_NARG(arg, "level"), S_NARG(arg, "optname"), S_NARG(ptr, "optval"), S_NARG(ptr, "optlen")),
159 : SYSCALL(clone, 5, S_RET(rdec), S_NARG(clone_flags, "flags"), S_NARG(ptr, "child_stack"), S_NARG(ptr, "ptid"), S_NARG(ptr, "ctid"), S_NARG(ptr, "newtls")),
160 : #ifdef SYS_fork
161 : SYSCALL(fork, 0, S_RET(rdec), S_NOARGS()),
162 : #endif
163 : #ifdef SYS_vfork
164 : SYSCALL(vfork, 0, S_RET(rdec), S_NOARGS()),
165 : #endif
166 : SYSCALL(execve, 3, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(ptr, "argv"), S_NARG(ptr, "envp")),
167 : SYSCALL(exit, 1, S_RET(rnone), S_NARG(dec, "status")),
168 : SYSCALL(wait4, 4, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(ptr, "stat_addr"), S_NARG(arg, "options"), S_NARG(ptr, "rusage")),
169 : SYSCALL(kill, 2, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(signum, "sig")),
170 : SYSCALL(uname, 1, S_RET(rdec), S_NARG(ptr, "buf")),
171 : #ifdef SYS_semget
172 : SYSCALL(semget, 3, S_RET(rdec), S_NARG(arg, "key"), S_NARG(dec, "nsems"), S_NARG(arg, "semflg")),
173 : #endif // SYS_semop
174 : #ifdef SYS_semop
175 : SYSCALL(semop, 3, S_RET(rdec), S_NARG(dec, "semid"), S_NARG(ptr, "sops"), S_NARG(arg, "nsops")),
176 : #endif // SYS_semop
177 : #ifdef SYS_semctl
178 : SYSCALL(semctl, 4, S_RET(rdec), S_NARG(dec, "semid"), S_NARG(dec, "semnum"), S_NARG(arg, "cmd"), S_NARG(arg, "arg")),
179 : #endif // SYS_semctl
180 : #ifdef SYS_shmdt
181 : SYSCALL(shmdt, 1, S_RET(rdec), S_NARG(ptr, "shmaddr")),
182 : #endif // SYS_shmdt
183 : #ifdef SYS_msgget
184 : SYSCALL(msgget, 2, S_RET(rdec), S_NARG(arg, "key"), S_NARG(arg, "msflg")),
185 : #endif // SYS_msgget
186 : #ifdef SYS_msgsnd
187 : SYSCALL(msgsnd, 4, S_RET(rdec), S_NARG(arg, "msqid"), S_NARG(ptr, "msgp"), S_NARG(dec, "msgsz"), S_NARG(arg, "msflg")),
188 : #endif // SYS_msgsnd
189 : #ifdef SYS_msgrcv
190 : SYSCALL(msgrcv, 5, S_RET(rdec), S_NARG(arg, "msqid"), S_NARG(ptr, "msgp"), S_NARG(dec, "msgsz"), S_NARG(arg, "msgtyp"), S_NARG(arg, "msflg")),
191 : #endif // SYS_msgrcv
192 : #ifdef SYS_msgctl
193 : SYSCALL(msgctl, 3, S_RET(rdec), S_NARG(arg, "msqid"), S_NARG(arg, "cmd"), S_NARG(ptr, "buf")),
194 : #endif // SYS_msgctl
195 : SYSCALL(fcntl, 3, S_RET(rdec), S_UARG(fd), S_NARG(arg, "cmd"), S_NARG(arg, "arg")),
196 : SYSCALL(flock, 2, S_RET(rdec), S_UARG(fd), S_NARG(arg, "cmd")),
197 : SYSCALL(fsync, 1, S_RET(rdec), S_UARG(fd)),
198 : SYSCALL(fdatasync, 2, S_RET(rdec), S_UARG(fd)),
199 : SYSCALL(truncate, 2, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(arg, "length")),
200 : SYSCALL(ftruncate, 2, S_RET(rdec), S_UARG(fd), S_NARG(offset, "length")),
201 : #ifdef SYS_getdents
202 : SYSCALL(getdents, 3, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "dirent"), S_NARG(arg, "count")),
203 : #endif
204 : SYSCALL(getcwd, 2, S_RET(rdec), S_NARG(ptr, "buf"), S_NARG(dec, "size")),
205 : SYSCALL(chdir, 1, S_RET(rdec), S_NARG(cstr, "pathname")),
206 : SYSCALL(fchdir, 1, S_RET(rdec), S_UARG(fd)),
207 : #ifdef SYS_rename
208 : SYSCALL(rename, 2, S_RET(rdec), S_NARG(cstr, "oldpath"), S_NARG(cstr, "newpath")),
209 : #endif
210 : #ifdef SYS_mkdir
211 : SYSCALL(mkdir, 2, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(octal_mode, "mode")),
212 : #endif
213 : #ifdef SYS_rmdir
214 : SYSCALL(rmdir, 1, S_RET(rdec), S_NARG(cstr, "pathname")),
215 : #endif
216 : #ifdef SYS_creat
217 : SYSCALL(creat, 2, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(octal_mode, "mode")),
218 : #endif
219 : #ifdef SYS_link
220 : SYSCALL(link, 2, S_RET(rdec), S_NARG(cstr, "oldpath"), S_NARG(cstr, "newpath")),
221 : #endif
222 : #ifdef SYS_unlink
223 : SYSCALL(unlink, 1, S_RET(rdec), S_NARG(cstr, "pathname")),
224 : #endif
225 : #ifdef SYS_symlink
226 : SYSCALL(symlink, 2, S_RET(rdec), S_NARG(cstr, "target"), S_NARG(cstr, "linkpath")),
227 : #endif
228 : #ifdef SYS_readlink
229 : SYSCALL(readlink, 2, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(ptr, "buf"), S_NARG(arg, "bufsiz")),
230 : #endif
231 : #ifdef SYS_chmod
232 : SYSCALL(chmod, 2, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(octal_mode, "mode")),
233 : #endif
234 : SYSCALL(fchmod, 2, S_RET(rdec), S_UARG(fd), S_NARG(octal_mode, "mode")),
235 : #ifdef SYS_chown
236 : SYSCALL(chown, 3, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(dec, "user"), S_NARG(dec, "group")),
237 : #endif
238 : SYSCALL(fchown, 3, S_RET(rdec), S_UARG(fd), S_NARG(dec, "user"), S_NARG(dec, "group")),
239 : #ifdef SYS_lchown
240 : SYSCALL(lchown, 3, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(dec, "user"), S_NARG(dec, "group")),
241 : #endif
242 : SYSCALL(umask, 1, S_RET(rdec), S_NARG(arg, "mask")),
243 : SYSCALL(gettimeofday, 2, S_RET(rdec), S_NARG(ptr, "tv"), S_NARG(ptr, "tz")),
244 : SYSCALL(getrlimit, 2, S_RET(rdec), S_NARG(arg, "resource"), S_NARG(ptr, "rlim")),
245 : SYSCALL(getrusage, 2, S_RET(rdec), S_NARG(arg, "who"), S_NARG(ptr, "ru")),
246 : SYSCALL(sysinfo, 1, S_RET(rdec), S_NARG(ptr, "info")),
247 : SYSCALL(times, 1, S_RET(rdec), S_NARG(ptr, "tbuf")),
248 : SYSCALL(ptrace, 4, S_RET(rdec), S_NARG(arg, "request"), S_NARG(dec, "pid"), S_NARG(ptr, "addr"), S_NARG(ptr, "data")),
249 : SYSCALL(getuid, 0, S_RET(rdec), S_NOARGS()),
250 : SYSCALL(syslog, 3, S_RET(rdec), S_NARG(arg, "type"), S_NARG(ptr, "buf"), S_NARG(arg, "length")),
251 : SYSCALL(getgid, 0, S_RET(rdec), S_NOARGS()),
252 : SYSCALL(setuid, 1, S_RET(rdec), S_NARG(dec, "uid")),
253 : SYSCALL(setgid, 1, S_RET(rdec), S_NARG(dec, "gid")),
254 : SYSCALL(geteuid, 0, S_RET(rdec), S_NOARGS()),
255 : SYSCALL(getegid, 0, S_RET(rdec), S_NOARGS()),
256 : SYSCALL(setpgid, 2, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(dec, "pgid")),
257 : SYSCALL(getppid, 0, S_RET(rdec), S_NOARGS()),
258 : #ifdef SYS_getpgrp
259 : SYSCALL(getpgrp, 0, S_RET(rdec), S_NOARGS()),
260 : #endif
261 : SYSCALL(setsid, 0, S_RET(rdec), S_NOARGS()),
262 : SYSCALL(setreuid, 2, S_RET(rdec), S_NARG(dec, "ruid"), S_NARG(dec, "euid")),
263 : SYSCALL(setregid, 2, S_RET(rdec), S_NARG(dec, "rgid"), S_NARG(dec, "egid")),
264 : SYSCALL(getgroups, 2, S_RET(rdec), S_NARG(arg, "gidsetsize"), S_NARG(ptr, "grouplist")),
265 : SYSCALL(setgroups, 2, S_RET(rdec), S_NARG(arg, "gidsetsize"), S_NARG(ptr, "grouplist")),
266 : SYSCALL(setresuid, 3, S_RET(rdec), S_NARG(dec, "ruid"), S_NARG(dec, "euid"), S_NARG(dec, "suid")),
267 : SYSCALL(getresuid, 3, S_RET(rdec), S_NARG(ptr, "ruid"), S_NARG(ptr, "euid"), S_NARG(ptr, "suid")),
268 : SYSCALL(setresgid, 3, S_RET(rdec), S_NARG(dec, "rgid"), S_NARG(dec, "egid"), S_NARG(dec, "sgid")),
269 : SYSCALL(getresgid, 3, S_RET(rdec), S_NARG(ptr, "rgid"), S_NARG(ptr, "egid"), S_NARG(ptr, "sgid")),
270 : SYSCALL(getpgid, 1, S_RET(rdec), S_NARG(dec, "pid")),
271 : SYSCALL(setfsuid, 1, S_RET(rdec), S_NARG(dec, "uid")),
272 : SYSCALL(setfsgid, 1, S_RET(rdec), S_NARG(dec, "gid")),
273 : SYSCALL(getsid, 1, S_RET(rdec), S_NARG(dec, "pid")),
274 : SYSCALL(capget, 2, S_RET(rdec), S_NARG(ptr, "header"), S_NARG(ptr, "datap")),
275 : SYSCALL(capset, 2, S_RET(rdec), S_NARG(ptr, "header"), S_NARG(ptr, "datap")),
276 : SYSCALL(rt_sigpending, 2, S_RET(rdec), S_NARG(ptr, "set"), S_NARG(dec, "sigsetsize")),
277 : SYSCALL(rt_sigtimedwait, 4, S_RET(rdec), S_NARG(ptr, "uthese"), S_NARG(ptr, "uinfo"), S_NARG(ptr, "uts"), S_NARG(dec, "sigsetsize")),
278 : SYSCALL(rt_sigqueueinfo, 4, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(signum, "sig"), S_NARG(ptr, "uinfo")),
279 : SYSCALL(rt_sigsuspend, 2, S_RET(rdec), S_NARG(ptr, "unewset"), S_NARG(dec, "sigsetsize")),
280 : SYSCALL(sigaltstack, 2, S_RET(rdec), S_NARG(ptr, "ss"), S_NARG(ptr, "old_ss")),
281 : #ifdef SYS_utime
282 : SYSCALL(utime, 2, S_RET(rdec), S_NARG(cstr, "filename"), S_NARG(ptr, "times")),
283 : #endif
284 : #ifdef SYS_mknod
285 : SYSCALL(mknod, 3, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(octal_mode, "mode"), S_NARG(arg, "dev")),
286 : #endif
287 : #ifdef SYS_uselib
288 : SYSCALL(uselib, 1, S_RET(rdec), S_NARG(cstr, "library")),
289 : #endif
290 : SYSCALL(personality, 1, S_RET(rdec), S_NARG(arg, "personality")),
291 : #ifdef SYS_ustat
292 : SYSCALL(ustat, 2, S_RET(rdec), S_NARG(arg, "dev"), S_NARG(ptr, "ubuf")),
293 : #endif
294 : SYSCALL(statfs, 2, S_RET(rdec), S_NARG(cstr, "path"), S_NARG(ptr, "buf")),
295 : SYSCALL(fstatfs, 2, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "buf")),
296 : #ifdef SYS_sysfs
297 : SYSCALL(sysfs, 3, S_RET(rdec), S_NARG(arg, "option"), S_NARG(ptr, "arg1"), S_NARG(ptr, "arg2")),
298 : #endif
299 : SYSCALL(getpriority, 2, S_RET(rdec), S_NARG(arg, "which"), S_NARG(arg, "who")),
300 : SYSCALL(setpriority, 3, S_RET(rdec), S_NARG(arg, "which"), S_NARG(arg, "who"), S_NARG(arg, "prio")),
301 : SYSCALL(sched_setparam, 2, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(ptr, "param")),
302 : SYSCALL(sched_getparam, 2, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(ptr, "param")),
303 : SYSCALL(sched_setscheduler, 3, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(arg, "policy"), S_NARG(ptr, "param")),
304 : SYSCALL(sched_getscheduler, 1, S_RET(rdec), S_NARG(dec, "pid")),
305 : SYSCALL(sched_get_priority_max, 1, S_RET(rdec), S_NARG(arg, "policy")),
306 : SYSCALL(sched_get_priority_min, 1, S_RET(rdec), S_NARG(arg, "policy")),
307 : SYSCALL(sched_rr_get_interval, 2, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(ptr, "interval")),
308 : SYSCALL(mlock, 2, S_RET(rdec), S_NARG(ptr, "addr"), S_NARG(dec, "length")),
309 : SYSCALL(munlock, 2, S_RET(rdec), S_NARG(ptr, "addr"), S_NARG(dec, "length")),
310 : SYSCALL(mlockall, 1, S_RET(rdec), S_NARG(arg, "flags")),
311 : SYSCALL(munlockall, 0, S_RET(rdec), S_NOARGS()),
312 : SYSCALL(vhangup, 0, S_RET(rdec), S_NOARGS()),
313 : #ifdef SYS_modify_ldt
314 : SYSCALL(modify_ldt, 3, S_RET(rdec), S_NARG(arg, "func"), S_NARG(ptr, "ptr"), S_NARG(arg, "bytecount")),
315 : #endif
316 : SYSCALL(pivot_root, 2, S_RET(rdec), S_NARG(cstr, "new_root"), S_NARG(cstr, "put_old")),
317 : #ifdef SYS_sysctl
318 : SYSCALL(_sysctl, 1, S_RET(rdec), S_NARG(ptr, "args")),
319 : #endif
320 : SYSCALL(prctl, 5, S_RET(rdec), S_NARG(arg, "option"), S_NARG(arg, "arg2"), S_NARG(arg, "arg3"), S_NARG(arg, "arg4"), S_NARG(arg, "arg5")),
321 : #ifdef SYS_arch_prctl
322 : SYSCALL(arch_prctl, 2, S_RET(rdec), S_NARG(arg, "code"), S_NARG(arg, "addr")),
323 : #endif // SYS_arch_prctl
324 : SYSCALL(adjtimex, 1, S_RET(rdec), S_NARG(ptr, "txc_p")),
325 : SYSCALL(setrlimit, 2, S_RET(rdec), S_NARG(arg, "resource"), S_NARG(ptr, "rlim")),
326 : SYSCALL(chroot, 1, S_RET(rdec), S_NARG(cstr, "pathname")),
327 : SYSCALL(sync, 0, S_RET(rdec), S_NOARGS()),
328 : SYSCALL(acct, 1, S_RET(rdec), S_NARG(cstr, "pathname")),
329 : SYSCALL(settimeofday, 2, S_RET(rdec), S_NARG(ptr, "tv"), S_NARG(ptr, "tz")),
330 : SYSCALL(mount, 5, S_RET(rdec), S_NARG(cstr, "dev_name"), S_NARG(cstr, "dir_name"), S_NARG(cstr, "type"), S_NARG(arg, "flags"), S_NARG(ptr, "data")),
331 : SYSCALL(umount2, 2, S_RET(rdec), S_NARG(cstr, "target"), S_NARG(arg, "flags")),
332 : SYSCALL(swapon, 2, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(arg, "swap_flags")),
333 : SYSCALL(swapoff, 1, S_RET(rdec), S_NARG(cstr, "pathname")),
334 : SYSCALL(reboot, 4, S_RET(rdec), S_NARG(arg, "magic1"), S_NARG(arg, "magic2"), S_NARG(arg, "cmd"), S_NARG(ptr, "arg")),
335 : SYSCALL(sethostname, 2, S_RET(rdec), S_NARG(cstr, "name"), S_NARG(arg, "length")),
336 : SYSCALL(setdomainname, 2, S_RET(rdec), S_NARG(cstr, "name"), S_NARG(arg, "length")),
337 : #ifdef SYS_iopl
338 : SYSCALL(iopl, 1, S_RET(rdec), S_NARG(arg, "level")),
339 : #endif
340 : #ifdef SYS_ioperm
341 : SYSCALL(ioperm, 3, S_RET(rdec), S_NARG(arg, "from"), S_NARG(arg, "num"), S_NARG(arg, "on")),
342 : #endif
343 : #ifdef SYS_create_module
344 : SYSCALL(create_module, 2, S_RET(rdec), S_NARG(cstr, "name"), S_NARG(arg, "size")),
345 : #endif
346 : SYSCALL(init_module, 3, S_RET(rdec), S_NARG(ptr, "module_image"), S_NARG(dec, "length"), S_NARG(cstr, "param_values")),
347 : SYSCALL(delete_module, 2, S_RET(rdec), S_NARG(cstr, "name"), S_NARG(arg, "flags")),
348 : #ifdef SYS_get_kernel_syms
349 : SYSCALL(get_kernel_syms, 1, S_RET(rdec), S_NARG(ptr, "table")),
350 : #endif
351 : #ifdef SYS_query_module
352 : SYSCALL(query_module, 5, S_RET(rdec), S_NARG(cstr, "name"), S_NARG(arg, "which"), S_NARG(ptr, "buf"), S_NARG(arg, "bufsize"), S_NARG(ptr, "ret")),
353 : #endif
354 : #ifdef SYS_quotactl
355 : SYSCALL(quotactl, 4, S_RET(rdec), S_NARG(arg, "cmd"), S_NARG(cstr, "special"), S_NARG(arg, "id"), S_NARG(ptr, "addr")),
356 : #endif
357 : SYSCALL(nfsservctl, 3, S_RET(rdec), S_NARG(arg, "cmd"), S_NARG(ptr, "argp"), S_NARG(ptr, "resp")),
358 : #ifdef SYS_getpmsg
359 : SYSCALL(getpmsg, 5, S_RET(rdec), S_NARG(arg, "arg0"), S_NARG(arg, "arg1"), S_NARG(arg, "arg2"), S_NARG(arg, "arg3"), S_NARG(arg, "arg4")),
360 : #endif
361 : #ifdef SYS_putmsg
362 : SYSCALL(putpmsg, 5, S_RET(rdec), S_NARG(arg, "arg0"), S_NARG(arg, "arg1"), S_NARG(arg, "arg2"), S_NARG(arg, "arg3"), S_NARG(arg, "arg4")),
363 : #endif
364 : #ifdef SYS_afs_syscall
365 : SYSCALL(afs_syscall, 5, S_RET(rdec), S_NARG(arg, "arg0"), S_NARG(arg, "arg1"), S_NARG(arg, "arg2"), S_NARG(arg, "arg3"), S_NARG(arg, "arg4")),
366 : #endif
367 : #ifdef SYS_tuxcall
368 : SYSCALL(tuxcall, 3, S_RET(rdec), S_NARG(arg, "arg0"), S_NARG(arg, "arg1"), S_NARG(arg, "arg2")),
369 : #endif
370 : #ifdef SYS_security
371 : SYSCALL(security, 3, S_RET(rdec), S_NARG(arg, "arg0"), S_NARG(arg, "arg1"), S_NARG(arg, "arg2")),
372 : #endif // SYS_security
373 : SYSCALL(gettid, 0, S_RET(rdec), S_NOARGS()),
374 : SYSCALL(readahead, 3, S_RET(rdec), S_UARG(fd), S_UARG(offset), S_NARG(arg, "count")),
375 : SYSCALL(setxattr, 5, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(cstr, "pathname"), S_NARG(ptr, "value"), S_NARG(dec, "size"), S_NARG(arg, "flags")),
376 : SYSCALL(lsetxattr, 5, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(cstr, "pathname"), S_NARG(ptr, "value"), S_NARG(dec, "size"), S_NARG(arg, "flags")),
377 : SYSCALL(fsetxattr, 5, S_RET(rdec), S_UARG(fd), S_NARG(cstr, "pathname"), S_NARG(ptr, "value"), S_NARG(dec, "size"), S_NARG(arg, "flags")),
378 : SYSCALL(getxattr, 4, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(cstr, "pathname"), S_NARG(ptr, "value"), S_NARG(dec, "size")),
379 : SYSCALL(lgetxattr, 4, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(cstr, "pathname"), S_NARG(ptr, "value"), S_NARG(dec, "size")),
380 : SYSCALL(fgetxattr, 4, S_RET(rdec), S_UARG(fd), S_NARG(cstr, "pathname"), S_NARG(ptr, "value"), S_NARG(dec, "size")),
381 : SYSCALL(listxattr, 3, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(ptr, "list"), S_NARG(dec, "size")),
382 : SYSCALL(llistxattr, 3, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(ptr, "list"), S_NARG(dec, "size")),
383 : SYSCALL(flistxattr, 3, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "list"), S_NARG(dec, "size")),
384 : SYSCALL(removexattr, 2, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(cstr, "pathname")),
385 : SYSCALL(lremovexattr, 2, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(cstr, "pathname")),
386 : SYSCALL(fremovexattr, 2, S_RET(rdec), S_UARG(fd), S_NARG(cstr, "pathname")),
387 : SYSCALL(tkill, 2, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(signum, "sig")),
388 : #ifdef SYS_time
389 : SYSCALL(time, 1, S_RET(rdec), S_NARG(ptr, "tloc")),
390 : #endif
391 : SYSCALL(futex, 6, S_RET(rdec), S_NARG(ptr, "uaddr"), S_NARG(arg, "op"), S_NARG(arg, "val"), S_NARG(ptr, "utime"), S_NARG(ptr, "uaddr2"), S_NARG(arg, "val3")),
392 : SYSCALL(sched_setaffinity, 3, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(arg, "length"), S_NARG(ptr, "mask")),
393 : SYSCALL(sched_getaffinity, 3, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(arg, "length"), S_NARG(ptr, "mask")),
394 : #ifdef SYS_set_thread_area
395 : SYSCALL(set_thread_area, 1, S_RET(rdec), S_NARG(ptr, "u_info")),
396 : #endif // SYS_set_thread_area
397 : SYSCALL(io_setup, 2, S_RET(rdec), S_NARG(dec, "nr_reqs"), S_NARG(ptr, "ctx")),
398 : SYSCALL(io_destroy, 1, S_RET(rdec), S_NARG(ptr, "ctx")),
399 : SYSCALL(io_getevents, 5, S_RET(rdec), S_NARG(ptr, "ctx_id"), S_NARG(dec, "min_nr"), S_NARG(dec, "nr"), S_NARG(ptr, "events"), S_NARG(ptr, "timeout")),
400 : SYSCALL(io_submit, 3, S_RET(rdec), S_NARG(ptr, "ctx_id"), S_NARG(dec, "nr"), S_NARG(ptr, "iocbpp")),
401 : SYSCALL(io_cancel, 3, S_RET(rdec), S_NARG(ptr, "ctx_id"), S_NARG(ptr, "iocb"), S_NARG(ptr, "result")),
402 : #ifdef SYS_get_thread_area
403 : SYSCALL(get_thread_area, 1, S_RET(rdec), S_NARG(ptr, "u_info")),
404 : #endif // SYS_get_thread_area
405 : SYSCALL(lookup_dcookie, 3, S_RET(rdec), S_NARG(arg, "cookie64"), S_NARG(ptr, "buf"), S_NARG(dec, "length")),
406 : #ifdef SYS_epoll_create
407 : SYSCALL(epoll_create, 3, S_RET(rdec), S_NARG(arg, "size")),
408 : #endif
409 : #ifdef SYS_epoll_ctl_old
410 : SYSCALL(epoll_ctl_old, 4, S_RET(rdec), S_NARG(arg, "arg0"), S_NARG(arg, "arg1"), S_NARG(arg, "arg2"), S_NARG(arg, "arg3")),
411 : #endif // SYS_epoll_ctl_old
412 : #ifdef SYS_epoll_wait_old
413 : SYSCALL(epoll_wait_old, 4, S_RET(rdec), S_NARG(arg, "arg0"), S_NARG(arg, "arg1"), S_NARG(arg, "arg2"), S_NARG(arg, "arg3")),
414 : #endif // SYS_epoll_wait_old
415 : SYSCALL(remap_file_pages, 5, S_RET(rdec), S_NARG(ptr, "addr"), S_NARG(dec, "size"), S_NARG(mmap_prot, "prot"), S_NARG(dec, "pgoff"), S_NARG(arg, "flags")),
416 : SYSCALL(getdents64, 3, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "dirent"), S_NARG(arg, "count")),
417 : SYSCALL(set_tid_address, 1, S_RET(rdec), S_NARG(ptr, "tidptr")),
418 : SYSCALL(restart_syscall, 0, S_RET(rdec), S_NOARGS()),
419 : #ifdef SYS_semtimedop
420 : SYSCALL(semtimedop, 4, S_RET(rdec), S_NARG(dec, "semid"), S_NARG(ptr, "sops"), S_NARG(arg, "nsops"), S_NARG(ptr, "timeout")),
421 : #endif // SYS_semtimedop
422 : SYSCALL(fadvise64, 4, S_RET(rdec), S_UARG(fd), S_UARG(offset), S_NARG(dec, "length"), S_NARG(arg, "advice")),
423 : SYSCALL(timer_create, 3, S_RET(rdec), S_NARG(arg, "which_clock"), S_NARG(ptr, "timer_event_spec"), S_NARG(ptr, "created_timer_id")),
424 : SYSCALL(timer_settime, 4, S_RET(rdec), S_NARG(arg, "timer_id"), S_NARG(arg, "flags"), S_NARG(ptr, "new_setting"), S_NARG(ptr, "old_setting")),
425 : SYSCALL(timer_gettime, 2, S_RET(rdec), S_NARG(arg, "timer_id"), S_NARG(ptr, "setting")),
426 : SYSCALL(timer_getoverrun, 1, S_RET(rdec), S_NARG(arg, "timer_id")),
427 : SYSCALL(timer_delete, 1, S_RET(rdec), S_NARG(arg, "timer_id")),
428 : SYSCALL(clock_settime, 2, S_RET(rdec), S_NARG(arg, "which_clock"), S_NARG(ptr, "tp")),
429 : SYSCALL(clock_gettime, 2, S_RET(rdec), S_NARG(arg, "which_clock"), S_NARG(ptr, "tp")),
430 : SYSCALL(clock_getres, 2, S_RET(rdec), S_NARG(arg, "which_clock"), S_NARG(ptr, "tp")),
431 : SYSCALL(clock_nanosleep, 4, S_RET(rdec), S_NARG(arg, "which_clock"), S_NARG(arg, "flags"), S_NARG(ptr, "rqtp"), S_NARG(ptr, "rmtp")),
432 : SYSCALL(exit_group, 1, S_RET(rnone), S_NARG(dec, "status")),
433 : #ifdef SYS_epoll_wait
434 : SYSCALL(epoll_wait, 4, S_RET(rdec), S_NARG(dec, "epfd"), S_NARG(ptr, "events"), S_NARG(dec, "maxevents"), S_NARG(dec32, "timeout")),
435 : #endif
436 : SYSCALL(epoll_ctl, 4, S_RET(rdec), S_NARG(dec, "epfd"), S_NARG(arg, "op"), S_UARG(fd), S_NARG(ptr, "event")),
437 : SYSCALL(tgkill, 3, S_RET(rdec), S_NARG(arg, "tgid"), S_NARG(dec, "pid"), S_NARG(signum, "sig")),
438 : #ifdef SYS_utimes
439 : SYSCALL(utimes, 2, S_RET(rdec), S_NARG(cstr, "filename"), S_NARG(ptr, "utimes")),
440 : #endif
441 : #ifdef SYS_vserver
442 : SYSCALL(vserver, 5, S_RET(rdec), S_NARG(arg, "arg0"), S_NARG(arg, "arg1"), S_NARG(arg, "arg2"), S_NARG(arg, "arg3"), S_NARG(arg, "arg4")),
443 : #endif // SYS_vserver
444 : SYSCALL(mbind, 6, S_RET(rdec), S_NARG(ptr, "addr"), S_NARG(dec, "length"), S_NARG(octal_mode, "mode"), S_NARG(ptr, "nmask"), S_NARG(arg, "maxnode"), S_NARG(arg, "flags")),
445 : SYSCALL(set_mempolicy, 3, S_RET(rdec), S_NARG(octal_mode, "mode"), S_NARG(ptr, "nmask"), S_NARG(arg, "maxnode")),
446 : SYSCALL(get_mempolicy, 5, S_RET(rdec), S_NARG(ptr, "policy"), S_NARG(ptr, "nmask"), S_NARG(arg, "maxnode"), S_NARG(ptr, "addr"), S_NARG(arg, "flags")),
447 : SYSCALL(mq_open, 4, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(open_flags, "oflag"), S_NARG(octal_mode, "mode"), S_NARG(ptr, "attr")),
448 : SYSCALL(mq_unlink, 1, S_RET(rdec), S_NARG(cstr, "pathname")),
449 : SYSCALL(mq_timedsend, 5, S_RET(rdec), S_NARG(arg, "mqdes"), S_NARG(cstr, "msg_ptr"), S_NARG(dec, "msg_len"), S_NARG(arg, "msg_prio"), S_NARG(ptr, "abs_timeout")),
450 : SYSCALL(mq_timedreceive, 5, S_RET(rdec), S_NARG(arg, "mqdes"), S_NARG(ptr, "msg_ptr"), S_NARG(dec, "msg_len"), S_NARG(ptr, "msg_prio"), S_NARG(ptr, "abs_timeout")),
451 : SYSCALL(mq_notify, 2, S_RET(rdec), S_NARG(arg, "mqdes"), S_NARG(ptr, "notification")),
452 : SYSCALL(mq_getsetattr, 3, S_RET(rdec), S_NARG(arg, "mqdes"), S_NARG(ptr, "mqstat"), S_NARG(ptr, "omqstat")),
453 : SYSCALL(kexec_load, 4, S_RET(rdec), S_NARG(arg, "entry"), S_NARG(arg, "nr_segments"), S_NARG(ptr, "segments"), S_NARG(arg, "flags")),
454 : SYSCALL(waitid, 5, S_RET(rdec), S_NARG(arg, "which"), S_NARG(dec, "pid"), S_NARG(ptr, "infop"), S_NARG(arg, "options"), S_NARG(ptr, "ru")),
455 : SYSCALL(add_key, 5, S_RET(rdec), S_NARG(cstr, "type"), S_NARG(cstr, "description"), S_NARG(ptr, "payload"), S_NARG(dec, "plen"), S_NARG(arg, "destringid")),
456 : SYSCALL(request_key, 4, S_RET(rdec), S_NARG(cstr, "type"), S_NARG(cstr, "description"), S_NARG(cstr, "callout_info"), S_NARG(arg, "destringid")),
457 : SYSCALL(keyctl, 5, S_RET(rdec), S_NARG(arg, "cmd"), S_NARG(arg, "arg2"), S_NARG(arg, "arg3"), S_NARG(arg, "arg4"), S_NARG(arg, "arg5")),
458 : SYSCALL(ioprio_set, 3, S_RET(rdec), S_NARG(arg, "which"), S_NARG(arg, "who"), S_NARG(dec, "ioprio")),
459 : SYSCALL(ioprio_get, 2, S_RET(rdec), S_NARG(arg, "which"), S_NARG(arg, "who")),
460 : #ifdef SYS_inotify_init
461 : SYSCALL(inotify_init, 0, S_RET(rdec), S_NOARGS()),
462 : #endif
463 : SYSCALL(inotify_add_watch, 3, S_RET(rdec), S_UARG(fd), S_NARG(cstr, "pathname"), S_NARG(arg, "mask")),
464 : SYSCALL(inotify_rm_watch, 2, S_RET(rdec), S_UARG(fd), S_NARG(dec, "wd")),
465 : SYSCALL(migrate_pages, 4, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(arg, "maxnode"), S_NARG(ptr, "from"), S_NARG(ptr, "to")),
466 : SYSCALL(openat, 3, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "pathname"), S_NARG(open_flags, "flags")),
467 : SYSCALL(mkdirat, 3, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "pathname"), S_NARG(octal_mode, "mode")),
468 : SYSCALL(mknodat, 4, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "filename"), S_NARG(octal_mode, "mode"), S_NARG(arg, "dev")),
469 : SYSCALL(fchownat, 5, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "pathname"), S_NARG(dec, "user"), S_NARG(dec, "group"), S_NARG(arg, "flag")),
470 : #ifdef SYS_futimesat
471 : SYSCALL(futimesat, 3, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "pathname"), S_NARG(ptr, "utimes")),
472 : #endif
473 : SYSCALL(newfstatat, 4, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "pathname"), S_NARG(ptr, "statbuf"), S_NARG(arg, "flag")),
474 : SYSCALL(unlinkat, 3, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "pathname"), S_NARG(arg, "flag")),
475 : SYSCALL(renameat, 4, S_RET(rdec), S_NARG(atfd, "olddfd"), S_NARG(cstr, "oldname"), S_NARG(atfd, "newdfd"), S_NARG(cstr, "newname")),
476 : SYSCALL(linkat, 5, S_RET(rdec), S_NARG(atfd, "olddfd"), S_NARG(cstr, "oldpath"), S_NARG(atfd, "newdfd"), S_NARG(cstr, "newpath"), S_NARG(arg, "flags")),
477 : SYSCALL(symlinkat, 3, S_RET(rdec), S_NARG(cstr, "oldname"), S_NARG(atfd, "newdfd"), S_NARG(cstr, "newname")),
478 : SYSCALL(readlinkat, 4, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "pathname"), S_NARG(ptr, "buf"), S_NARG(arg, "bufsiz")),
479 : SYSCALL(fchmodat, 3, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "filename"), S_NARG(octal_mode, "mode")),
480 : SYSCALL(faccessat, 3, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "pathname"), S_NARG(octal_mode, "mode")),
481 : #ifdef SYS_faccessat2
482 : SYSCALL(faccessat2, 4, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "pathname"), S_NARG(octal_mode, "mode"), S_NARG(arg, "flags")),
483 : #endif
484 : SYSCALL(pselect6, 6, S_RET(rdec), S_NARG(dec, "nfds"), S_NARG(ptr, "readfds"), S_NARG(ptr, "writefds"), S_NARG(ptr, "exceptfds"), S_NARG(ptr, "timeval"), S_NARG(ptr, "sigmask")),
485 : SYSCALL(ppoll, 5, S_RET(rdec), S_NARG(ptr, "fds"), S_NARG(dec, "nfds"), S_NARG(ptr, "tmo_p"), S_NARG(ptr, "sigmask"), S_NARG(dec, "sigsetsize")),
486 : SYSCALL(unshare, 1, S_RET(rdec), S_NARG(arg, "unshare_flags")),
487 : SYSCALL(set_robust_list, 2, S_RET(rdec), S_NARG(ptr, "head"), S_NARG(dec, "length")),
488 : SYSCALL(get_robust_list, 3, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(ptr, "head_ptr"), S_NARG(ptr, "len_ptr")),
489 : SYSCALL(splice, 6, S_RET(rdec), S_NARG(dec, "fd_in"), S_NARG(ptr, "off_in"), S_NARG(dec, "fd_out"), S_NARG(ptr, "off_out"), S_NARG(dec, "length"), S_NARG(arg, "flags")),
490 : SYSCALL(tee, 4, S_RET(rdec), S_NARG(dec, "fd_in"), S_NARG(dec, "fd_out"), S_NARG(dec, "length"), S_NARG(arg, "flags")),
491 : #ifdef SYS_sync_file_range
492 : SYSCALL(sync_file_range, 4, S_RET(rdec), S_UARG(fd), S_UARG(offset), S_NARG(offset, "nbytes"), S_NARG(arg, "flags")),
493 : #endif // SYS_sync_file_range
494 : SYSCALL(vmsplice, 4, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "iov"), S_NARG(arg, "nr_segs"), S_NARG(arg, "flags")),
495 : SYSCALL(move_pages, 6, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(arg, "nr_pages"), S_NARG(ptr, "pages"), S_NARG(ptr, "nodes"), S_NARG(ptr, "status"), S_NARG(arg, "flags")),
496 : SYSCALL(utimensat, 4, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "pathname"), S_NARG(ptr, "utimes"), S_NARG(arg, "flags")),
497 : SYSCALL(epoll_pwait, 6, S_RET(rdec), S_NARG(fd, "epfd"), S_NARG(ptr, "events"), S_NARG(dec, "maxevents"), S_NARG(dec, "timeout"), S_NARG(ptr, "sigmask"), S_NARG(dec, "sigsetsize")),
498 : #ifdef SYS_signalfd
499 : SYSCALL(signalfd, 3, S_RET(rdec), S_NARG(dec, "ufd"), S_NARG(ptr, "user_mask"), S_NARG(dec, "sizemask")),
500 : #endif
501 : SYSCALL(timerfd_create, 2, S_RET(rdec), S_NARG(dec, "clockid"), S_NARG(arg, "flags")),
502 : #ifdef SYS_eventfd
503 : SYSCALL(eventfd, 1, S_RET(rdec), S_NARG(arg, "count")),
504 : #endif
505 : SYSCALL(fallocate, 4, S_RET(rdec), S_UARG(fd), S_NARG(octal_mode, "mode"), S_UARG(offset), S_NARG(offset, "length")),
506 : SYSCALL(timerfd_settime, 4, S_RET(rdec), S_NARG(fd, "ufd"), S_NARG(arg, "flags"), S_NARG(ptr, "utmr"), S_NARG(ptr, "otmr")),
507 : SYSCALL(timerfd_gettime, 2, S_RET(rdec), S_NARG(fd, "ufd"), S_NARG(ptr, "otmr")),
508 : SYSCALL(accept4, 4, S_RET(rdec), S_NARG(fd, "sockfd"), S_NARG(ptr, "addr"), S_NARG(ptr, "addrlen"), S_NARG(arg, "flags")),
509 : SYSCALL(signalfd4, 4, S_RET(rdec), S_NARG(fd, "ufd"), S_NARG(ptr, "user_mask"), S_NARG(dec, "sizemask"), S_NARG(arg, "flags")),
510 : SYSCALL(eventfd2, 2, S_RET(rdec), S_NARG(arg, "count"), S_NARG(arg, "flags")),
511 : SYSCALL(epoll_create1, 1, S_RET(rdec), S_NARG(arg, "flags")),
512 : SYSCALL(dup3, 3, S_RET(rdec), S_NARG(fd, "oldfd"), S_NARG(fd, "newfd"), S_NARG(arg, "flags")),
513 : SYSCALL(pipe2, 2, S_RET(rdec), S_NARG(ptr, "fildes"), S_NARG(arg, "flags")),
514 : SYSCALL(inotify_init1, 1, S_RET(rdec), S_NARG(arg, "flags")),
515 : SYSCALL(preadv, 5, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "iov"), S_NARG(dec, "iovcnt"), S_NARG(arg, "pos_l"), S_NARG(arg, "pos_h")),
516 : SYSCALL(pwritev, 5, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "iov"), S_NARG(dec, "iovcnt"), S_NARG(arg, "pos_l"), S_NARG(arg, "pos_h")),
517 : SYSCALL(rt_tgsigqueueinfo, 4, S_RET(rdec), S_NARG(arg, "tgid"), S_NARG(arg, "pid"), S_NARG(signum, "sig"), S_NARG(ptr, "uinfo")),
518 : SYSCALL(perf_event_open, 5, S_RET(rdec), S_NARG(ptr, "attr_uptr"), S_NARG(dec, "pid"), S_NARG(dec, "cpu"), S_NARG(fd, "group_fd"), S_NARG(arg, "flags")),
519 : SYSCALL(recvmmsg, 5, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "msg"), S_NARG(dec, "vlen"), S_NARG(arg, "flags"), S_NARG(ptr, "timeout")),
520 : SYSCALL(fanotify_init, 2, S_RET(rdec), S_NARG(arg, "flags"), S_NARG(arg, "event_f_flags")),
521 : SYSCALL(fanotify_mark, 5, S_RET(rdec), S_NARG(fd, "fanotify_fd"), S_NARG(arg, "flags"), S_NARG(arg, "mask"), S_UARG(fd), S_NARG(cstr, "pathname")),
522 : SYSCALL(prlimit64, 4, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(arg, "resource"), S_NARG(ptr, "new_rlim"), S_NARG(ptr, "old_rlim")),
523 : SYSCALL(name_to_handle_at, 5, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "pathname"), S_NARG(ptr, "handle"), S_NARG(ptr, "mnt_id"), S_NARG(arg, "flag")),
524 : SYSCALL(open_by_handle_at, 3, S_RET(rdec), S_NARG(fd, "mountdirfd"), S_NARG(ptr, "handle"), S_NARG(arg, "flags")),
525 : SYSCALL(clock_adjtime, 2, S_RET(rdec), S_NARG(arg, "which_clock"), S_NARG(ptr, "tx")),
526 : SYSCALL(syncfs, 2, S_RET(rdec), S_UARG(fd)),
527 : SYSCALL(sendmmsg, 4, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "msg"), S_NARG(dec, "vlen"), S_NARG(arg, "flags")),
528 : SYSCALL(setns, 2, S_RET(rdec), S_UARG(fd), S_NARG(arg, "nstype")),
529 : SYSCALL(getcpu, 3, S_RET(rdec), S_NARG(ptr, "cpu"), S_NARG(ptr, "node"), S_NARG(ptr, "cache")),
530 : SYSCALL(process_vm_readv, 6, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(ptr, "local_iov"), S_NARG(dec, "liovcnt"), S_NARG(ptr, "remote_iov"), S_NARG(dec, "riovcnt"), S_NARG(arg, "flags")),
531 : SYSCALL(process_vm_writev, 6, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(ptr, "local_iov"), S_NARG(dec, "liovcnt"), S_NARG(ptr, "remote_iov"), S_NARG(dec, "riovcnt"), S_NARG(arg, "flags")),
532 : SYSCALL(kcmp, 5, S_RET(rdec), S_NARG(arg, "pid1"), S_NARG(arg, "pid2"), S_NARG(arg, "type"), S_NARG(arg, "idx1"), S_NARG(arg, "idx2")),
533 : SYSCALL(finit_module, 3, S_RET(rdec), S_UARG(fd), S_NARG(cstr, "param_values"), S_NARG(arg, "flags")),
534 : #ifdef SYS_sched_setattr
535 : SYSCALL(sched_setattr, 3, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(ptr, "attr"), S_NARG(arg, "flags")),
536 : #endif // SYS_sched_setattr
537 : #ifdef SYS_sched_getattr
538 : SYSCALL(sched_getattr, 4, S_RET(rdec), S_NARG(dec, "pid"), S_NARG(ptr, "attr"), S_NARG(dec, "size"), S_NARG(arg, "flags")),
539 : #endif // SYS_sched_getattr
540 : #ifdef SYS_renameat2
541 : SYSCALL(renameat2, 5, S_RET(rdec), S_NARG(atfd, "olddfd"), S_NARG(cstr, "oldpath"), S_NARG(atfd, "newdfd"), S_NARG(cstr, "newpath"), S_NARG(arg, "flags")),
542 : #endif // SYS_renameat2
543 : #ifdef SYS_seccomp
544 : SYSCALL(seccomp, 3, S_RET(rdec), S_NARG(arg, "op"), S_NARG(arg, "flags"), S_NARG(ptr, "uargs")),
545 : #endif // SYS_seccomp
546 : #ifdef SYS_getrandom
547 : SYSCALL(getrandom, 3, S_RET(rdec), S_NARG(ptr, "buf"), S_NARG(arg, "count"), S_NARG(arg, "flags")),
548 : #endif // SYS_getrandom
549 : #ifdef SYS_memfd_create
550 : SYSCALL(memfd_create, 2, S_RET(rdec), S_NARG(cstr, "pathname"), S_NARG(arg, "flags")),
551 : #endif // SYS_memfd_create
552 : #ifdef SYS_kexec_file_load
553 : SYSCALL(kexec_file_load, 5, S_RET(rdec), S_NARG(fd, "kernel_fd"), S_NARG(fd, "initrd_fd"), S_NARG(arg, "cmdline_len"), S_NARG(cstr, "cmdline"), S_NARG(arg, "flags")),
554 : #endif // SYS_kexec_file_load
555 :
556 : #ifdef SYS_bpf
557 : SYSCALL(bpf, 2, S_RET(rdec), S_NARG(arg, "cmd"), S_NARG(ptr, "attr"), S_NARG(arg, "size")),
558 : #endif // SYS_bpf
559 :
560 : #ifdef SYS_execveat
561 : SYSCALL(execveat, 5, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "pathname"), S_NARG(ptr, "argv"), S_NARG(ptr, "envp"), S_NARG(arg, "flags")),
562 : #endif // SYS_execveat
563 :
564 : #ifdef SYS_userfaultfd
565 : SYSCALL(userfaultfd, 2, S_RET(rdec), S_NARG(arg, "flags")),
566 : #endif // SYS_userfaultfd
567 :
568 : #ifdef SYS_membarrier
569 : SYSCALL(membarrier, 2, S_RET(rdec), S_NARG(arg, "cmd"), S_NARG(arg, "flags")),
570 : #endif // SYS_membarrier
571 :
572 : #ifdef SYS_mlock2
573 : SYSCALL(mlock2, 3, S_RET(rdec), S_NARG(ptr, "addr"), S_NARG(dec, "length"), S_NARG(arg, "flags")),
574 : #endif // SYS_mlock2
575 : #ifdef SYS_copy_file_range
576 : SYSCALL(copy_file_range, 6, S_RET(rdec), S_NARG(fd, "fd_in"), S_NARG(ptr, "off_in"), S_NARG(fd, "fd_out"), S_NARG(ptr, "off_out"), S_NARG(dec, "length"), S_NARG(arg, "flags")),
577 : #endif
578 : #ifdef SYS_preadv2
579 : SYSCALL(preadv2, 6, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "iov"), S_NARG(arg, "vlen"), S_NARG(arg, "pos_l"), S_NARG(arg, "pos_h"), S_NARG(arg, "flags")),
580 : #endif // SYS_preadv2
581 :
582 : #ifdef SYS_pwritev2
583 : SYSCALL(pwritev2, 6, S_RET(rdec), S_UARG(fd), S_NARG(ptr, "iov"), S_NARG(arg, "vlen"), S_NARG(arg, "pos_l"), S_NARG(arg, "pos_h"), S_NARG(arg, "flags")),
584 : #endif // SYS_pwritev2
585 : #ifdef SYS_pkey_mprotect
586 : SYSCALL(pkey_mprotect, 4, S_RET(rdec), S_NARG(ptr, "addr"), S_NARG(dec, "length"), S_NARG(mmap_prot, "prot"), S_NARG(dec, "pkey")),
587 : SYSCALL(pkey_alloc, 2, S_RET(rdec), S_NARG(arg, "flags"), S_NARG(arg, "init_val")),
588 : SYSCALL(pkey_free, 1, S_RET(rdec), S_NARG(dec, "pkey")),
589 : #endif
590 : #ifdef SYS_statx
591 : SYSCALL(statx, 5, S_RET(rdec), S_NARG(atfd, "dfd"), S_NARG(cstr, "pathname"), S_NARG(arg, "flags"), S_NARG(arg, "mask"), S_NARG(ptr, "buffer")),
592 : #endif // SYS_statx
593 :
594 : #ifdef SYS_io_pgetevents
595 : SYSCALL(io_pgetevents, 6, S_RET(rdec), S_NARG(ptr, "ctx_id"), S_NARG(dec, "min_nr"), S_NARG(dec, "nr"), S_NARG(ptr, "events"), S_NARG(ptr, "timeout"), S_NARG(ptr, "sig")),
596 : #endif // SYS_io_pgetevents
597 :
598 : #ifdef SYS_rseq
599 : SYSCALL(rseq, 4, S_RET(rdec), S_NARG(ptr, "rseq"), S_NARG(dec, "rseq_len"), S_NARG(arg, "flags"), S_NARG(signum, "sig"))
600 : #endif // SYS_rseq
601 : };
602 :
603 : static const struct syscall_info unknown_syscall = {
604 : .s_name = "unknown_syscall",
605 : .s_nargs = MAX_SYSCALL_ARGS,
606 : .s_return_type = S_RET(rdec),
607 : .s_args = {
608 : S_NARG(arg, "arg0"),
609 : S_NARG(arg, "arg1"),
610 : S_NARG(arg, "arg2"),
611 : S_NARG(arg, "arg3"),
612 : S_NARG(arg, "arg4"),
613 : S_NARG(arg, "arg5"),
614 : }
615 : };
616 :
617 : static const struct syscall_info open_with_o_creat = {
618 : .s_name = "open",
619 : .s_nargs = 3,
620 : .s_return_type = S_RET(rdec),
621 : .s_args = {
622 : S_NARG(cstr, "pathname"),
623 : S_NARG(open_flags, "flags"),
624 : S_NARG(octal_mode, "mode")
625 : }
626 : };
627 :
628 : static const struct syscall_info openat_with_o_creat = {
629 : .s_name = "openat",
630 : .s_nargs = 4,
631 : .s_return_type = S_RET(rdec),
632 : .s_args = {
633 : S_NARG(atfd, "dfd"),
634 : S_NARG(cstr, "pathname"),
635 : S_NARG(open_flags, "flags"),
636 : S_NARG(octal_mode, "mode")
637 : }
638 : };
639 :
640 : static bool
641 23488 : requires_mode_arg(int flags) {
642 :
643 23488 : if((flags & O_CREAT) == O_CREAT) {
644 : return true;
645 : }
646 :
647 : #ifdef O_TMPFILE
648 6240 : if ((flags & O_TMPFILE) == O_TMPFILE) {
649 0 : return true;
650 : }
651 : #endif
652 :
653 : return false;
654 : }
655 :
656 : #include <signal.h>
657 :
658 : /**
659 : * get_syscall_info - Return a syscall descriptor
660 : *
661 : * This function returns a pointer to a syscall_info structure that
662 : * appropriately describes the system call identified by 'syscall_number'.
663 : */
664 : const struct syscall_info*
665 3177867 : get_syscall_info(const long syscall_number, const long* argv) {
666 :
667 3177867 : if(syscall_number < 0 ||
668 : syscall_number >= (long) ARRAY_SIZE(syscall_table)) {
669 : return &unknown_syscall;
670 : }
671 :
672 3177867 : if(syscall_table[syscall_number].s_name == NULL) {
673 : return &unknown_syscall;
674 : }
675 :
676 3177867 : if(argv == NULL) {
677 1906738 : return &syscall_table[syscall_number];
678 : }
679 : #ifdef SYS_open
680 1271129 : if(syscall_number == SYS_open && requires_mode_arg(argv[1])) {
681 : return &open_with_o_creat;
682 : }
683 : #endif
684 1271129 : if(syscall_number == SYS_openat && requires_mode_arg(argv[2])) {
685 : return &openat_with_o_creat;
686 : }
687 :
688 1253881 : return &syscall_table[syscall_number];
689 : }
690 :
691 : struct named_syscall_entry {
692 : const char* s_name;
693 : const struct syscall_info* s_info;
694 : };
695 :
696 : #define SYSCALL_BY_NAME(id) \
697 : { \
698 : .s_name = #id, \
699 : .s_info = &syscall_table[SYS_##id] \
700 : }
701 :
702 : /** Linux syscalls ordered by name */
703 : const struct named_syscall_entry syscalls_by_name[] = {
704 : #ifdef SYS__sysctl
705 : SYSCALL_BY_NAME(_sysctl),
706 : #endif
707 : SYSCALL_BY_NAME(accept),
708 : SYSCALL_BY_NAME(accept4),
709 : #ifdef SYS_access
710 : SYSCALL_BY_NAME(access),
711 : #endif
712 : SYSCALL_BY_NAME(acct),
713 : SYSCALL_BY_NAME(add_key),
714 : SYSCALL_BY_NAME(adjtimex),
715 : #ifdef SYS_afs_syscall
716 : SYSCALL_BY_NAME(afs_syscall),
717 : #endif
718 : #ifdef SYS_alarm
719 : SYSCALL_BY_NAME(alarm),
720 : #endif
721 : #ifdef SYS_arch_prctl
722 : SYSCALL_BY_NAME(arch_prctl),
723 : #endif // SYS_arch_prctl
724 : SYSCALL_BY_NAME(bind),
725 : #ifdef SYS_bpf
726 : SYSCALL_BY_NAME(bpf),
727 : #endif // SYS_bpf
728 : SYSCALL_BY_NAME(brk),
729 : SYSCALL_BY_NAME(capget),
730 : SYSCALL_BY_NAME(capset),
731 : SYSCALL_BY_NAME(chdir),
732 : #ifdef SYS_chmod
733 : SYSCALL_BY_NAME(chmod),
734 : #endif
735 : #ifdef SYS_chown
736 : SYSCALL_BY_NAME(chown),
737 : #endif
738 : SYSCALL_BY_NAME(chroot),
739 : SYSCALL_BY_NAME(clock_adjtime),
740 : SYSCALL_BY_NAME(clock_getres),
741 : SYSCALL_BY_NAME(clock_gettime),
742 : SYSCALL_BY_NAME(clock_nanosleep),
743 : SYSCALL_BY_NAME(clock_settime),
744 : SYSCALL_BY_NAME(clone),
745 : SYSCALL_BY_NAME(close),
746 : SYSCALL_BY_NAME(connect),
747 : #ifdef SYS_copy_file_range
748 : SYSCALL_BY_NAME(copy_file_range),
749 : #endif // SYS_copy_file_range
750 : #ifdef SYS_creat
751 : SYSCALL_BY_NAME(creat),
752 : #endif
753 : #ifdef SYS_create_module
754 : SYSCALL_BY_NAME(create_module),
755 : #endif
756 : SYSCALL_BY_NAME(delete_module),
757 : SYSCALL_BY_NAME(dup),
758 : #ifdef SYS_dup2
759 : SYSCALL_BY_NAME(dup2),
760 : #endif
761 : SYSCALL_BY_NAME(dup3),
762 : #ifdef SYS_epoll_create
763 : SYSCALL_BY_NAME(epoll_create),
764 : #endif
765 : SYSCALL_BY_NAME(epoll_create1),
766 : SYSCALL_BY_NAME(epoll_ctl),
767 : #ifdef SYS_epoll_ctl_old
768 : SYSCALL_BY_NAME(epoll_ctl_old),
769 : #endif // SYS_epoll_ctl_old
770 : SYSCALL_BY_NAME(epoll_pwait),
771 : #ifdef SYS_epoll_wait
772 : SYSCALL_BY_NAME(epoll_wait),
773 : #endif
774 : #ifdef SYS_epoll_wait_old
775 : SYSCALL_BY_NAME(epoll_wait_old),
776 : #endif // SYS_epoll_wait_old
777 : #ifdef SYS_eventfd
778 : SYSCALL_BY_NAME(eventfd),
779 : #endif
780 : SYSCALL_BY_NAME(eventfd2),
781 : SYSCALL_BY_NAME(execve),
782 : #ifdef SYS_execveat
783 : SYSCALL_BY_NAME(execveat),
784 : #endif // SYS_execveat
785 : SYSCALL_BY_NAME(exit),
786 : SYSCALL_BY_NAME(exit_group),
787 : SYSCALL_BY_NAME(faccessat),
788 : #ifdef SYS_faccessat2
789 : SYSCALL_BY_NAME(faccessat2),
790 : #endif
791 : SYSCALL_BY_NAME(fadvise64),
792 : SYSCALL_BY_NAME(fallocate),
793 : SYSCALL_BY_NAME(fanotify_init),
794 : SYSCALL_BY_NAME(fanotify_mark),
795 : SYSCALL_BY_NAME(fchdir),
796 : SYSCALL_BY_NAME(fchmod),
797 : SYSCALL_BY_NAME(fchmodat),
798 : SYSCALL_BY_NAME(fchown),
799 : SYSCALL_BY_NAME(fchownat),
800 : SYSCALL_BY_NAME(fcntl),
801 : SYSCALL_BY_NAME(fdatasync),
802 : SYSCALL_BY_NAME(fgetxattr),
803 : SYSCALL_BY_NAME(finit_module),
804 : SYSCALL_BY_NAME(flistxattr),
805 : SYSCALL_BY_NAME(flock),
806 : #ifdef SYS_fork
807 : SYSCALL_BY_NAME(fork),
808 : #endif
809 : SYSCALL_BY_NAME(fremovexattr),
810 : SYSCALL_BY_NAME(fsetxattr),
811 : SYSCALL_BY_NAME(fstat),
812 : SYSCALL_BY_NAME(fstatfs),
813 : SYSCALL_BY_NAME(fsync),
814 : SYSCALL_BY_NAME(ftruncate),
815 : SYSCALL_BY_NAME(futex),
816 : #ifdef SYS_futimesat
817 : SYSCALL_BY_NAME(futimesat),
818 : #endif
819 : #ifdef SYS_get_kernel_syms
820 : SYSCALL_BY_NAME(get_kernel_syms),
821 : #endif
822 : SYSCALL_BY_NAME(get_mempolicy),
823 : SYSCALL_BY_NAME(get_robust_list),
824 : #ifdef SYS_get_thread_area
825 : SYSCALL_BY_NAME(get_thread_area),
826 : #endif // SYS_get_thread_area
827 : SYSCALL_BY_NAME(getcpu),
828 : SYSCALL_BY_NAME(getcwd),
829 : #ifdef SYS_getdents
830 : SYSCALL_BY_NAME(getdents),
831 : #endif
832 : SYSCALL_BY_NAME(getdents64),
833 : SYSCALL_BY_NAME(getegid),
834 : SYSCALL_BY_NAME(geteuid),
835 : SYSCALL_BY_NAME(getgid),
836 : SYSCALL_BY_NAME(getgroups),
837 : SYSCALL_BY_NAME(getitimer),
838 : SYSCALL_BY_NAME(getpeername),
839 : SYSCALL_BY_NAME(getpgid),
840 : #ifdef SYS_getpgrp
841 : SYSCALL_BY_NAME(getpgrp),
842 : #endif
843 : SYSCALL_BY_NAME(getpid),
844 : #ifdef SYS_getpmsg
845 : SYSCALL_BY_NAME(getpmsg),
846 : #endif
847 : SYSCALL_BY_NAME(getppid),
848 : SYSCALL_BY_NAME(getpriority),
849 : SYSCALL_BY_NAME(getrandom),
850 : SYSCALL_BY_NAME(getresgid),
851 : SYSCALL_BY_NAME(getresuid),
852 : SYSCALL_BY_NAME(getrlimit),
853 : SYSCALL_BY_NAME(getrusage),
854 : SYSCALL_BY_NAME(getsid),
855 : SYSCALL_BY_NAME(getsockname),
856 : SYSCALL_BY_NAME(getsockopt),
857 : SYSCALL_BY_NAME(gettid),
858 : SYSCALL_BY_NAME(gettimeofday),
859 : SYSCALL_BY_NAME(getuid),
860 : SYSCALL_BY_NAME(getxattr),
861 : SYSCALL_BY_NAME(init_module),
862 : SYSCALL_BY_NAME(inotify_add_watch),
863 : #ifdef SYS_inotify_init
864 : SYSCALL_BY_NAME(inotify_init),
865 : #endif
866 : SYSCALL_BY_NAME(inotify_init1),
867 : SYSCALL_BY_NAME(inotify_rm_watch),
868 : SYSCALL_BY_NAME(io_cancel),
869 : SYSCALL_BY_NAME(io_destroy),
870 : SYSCALL_BY_NAME(io_getevents),
871 : #ifdef SYS_io_pgetevents
872 : SYSCALL_BY_NAME(io_pgetevents),
873 : #endif // SYS_io_pgetevents
874 : SYSCALL_BY_NAME(io_setup),
875 : SYSCALL_BY_NAME(io_submit),
876 : SYSCALL_BY_NAME(ioctl),
877 : #ifdef SYS_ioperm
878 : SYSCALL_BY_NAME(ioperm),
879 : #endif
880 : #ifdef SYS_iopl
881 : SYSCALL_BY_NAME(iopl),
882 : #endif
883 : SYSCALL_BY_NAME(ioprio_get),
884 : SYSCALL_BY_NAME(ioprio_set),
885 : SYSCALL_BY_NAME(kcmp),
886 : #ifdef SYS_kexec_file_load
887 : SYSCALL_BY_NAME(kexec_file_load),
888 : #endif
889 : SYSCALL_BY_NAME(kexec_load),
890 : SYSCALL_BY_NAME(keyctl),
891 : SYSCALL_BY_NAME(kill),
892 : #ifdef SYS_lchown
893 : SYSCALL_BY_NAME(lchown),
894 : #endif
895 : SYSCALL_BY_NAME(lgetxattr),
896 : #ifdef SYS_link
897 : SYSCALL_BY_NAME(link),
898 : #endif
899 : SYSCALL_BY_NAME(linkat),
900 : SYSCALL_BY_NAME(listen),
901 : SYSCALL_BY_NAME(listxattr),
902 : SYSCALL_BY_NAME(llistxattr),
903 : SYSCALL_BY_NAME(lookup_dcookie),
904 : SYSCALL_BY_NAME(lremovexattr),
905 : SYSCALL_BY_NAME(lseek),
906 : SYSCALL_BY_NAME(lsetxattr),
907 : #ifdef SYS_lstat
908 : SYSCALL_BY_NAME(lstat),
909 : #endif
910 : SYSCALL_BY_NAME(madvise),
911 : SYSCALL_BY_NAME(mbind),
912 : #ifdef SYS_membarrier
913 : SYSCALL_BY_NAME(membarrier),
914 : #endif // SYS_membarrier
915 : SYSCALL_BY_NAME(memfd_create),
916 : SYSCALL_BY_NAME(migrate_pages),
917 : SYSCALL_BY_NAME(mincore),
918 : #ifdef SYS_mkdir
919 : SYSCALL_BY_NAME(mkdir),
920 : #endif
921 : SYSCALL_BY_NAME(mkdirat),
922 : #ifdef SYS_mknod
923 : SYSCALL_BY_NAME(mknod),
924 : #endif
925 : SYSCALL_BY_NAME(mknodat),
926 : SYSCALL_BY_NAME(mlock),
927 : #ifdef SYS_mlock2
928 : SYSCALL_BY_NAME(mlock2),
929 : #endif // SYS_mlock2
930 : SYSCALL_BY_NAME(mlockall),
931 : SYSCALL_BY_NAME(mmap),
932 : #ifdef SYS_modify_ldt
933 : SYSCALL_BY_NAME(modify_ldt),
934 : #endif
935 : SYSCALL_BY_NAME(mount),
936 : SYSCALL_BY_NAME(move_pages),
937 : SYSCALL_BY_NAME(mprotect),
938 : SYSCALL_BY_NAME(mq_getsetattr),
939 : SYSCALL_BY_NAME(mq_notify),
940 : SYSCALL_BY_NAME(mq_open),
941 : SYSCALL_BY_NAME(mq_timedreceive),
942 : SYSCALL_BY_NAME(mq_timedsend),
943 : SYSCALL_BY_NAME(mq_unlink),
944 : SYSCALL_BY_NAME(mremap),
945 : #ifdef SYS_msgctl
946 : SYSCALL_BY_NAME(msgctl),
947 : #endif // SYS_msgctl
948 : #ifdef SYS_msgget
949 : SYSCALL_BY_NAME(msgget),
950 : #endif // SYS_msgget
951 : #ifdef SYS_msgrcv
952 : SYSCALL_BY_NAME(msgrcv),
953 : #endif // SYS_msgrcv
954 : #ifdef SYS_msgsnd
955 : SYSCALL_BY_NAME(msgsnd),
956 : #endif // SYS_msgsnd
957 : SYSCALL_BY_NAME(msync),
958 : SYSCALL_BY_NAME(munlock),
959 : SYSCALL_BY_NAME(munlockall),
960 : SYSCALL_BY_NAME(munmap),
961 : SYSCALL_BY_NAME(name_to_handle_at),
962 : SYSCALL_BY_NAME(nanosleep),
963 : SYSCALL_BY_NAME(newfstatat),
964 : SYSCALL_BY_NAME(nfsservctl),
965 : #ifdef SYS_open
966 : SYSCALL_BY_NAME(open),
967 : #endif
968 : SYSCALL_BY_NAME(open_by_handle_at),
969 : SYSCALL_BY_NAME(openat),
970 : #ifdef SYS_pause
971 : SYSCALL_BY_NAME(pause),
972 : #endif
973 : SYSCALL_BY_NAME(perf_event_open),
974 : SYSCALL_BY_NAME(personality),
975 : #ifdef SYS_pipe
976 : SYSCALL_BY_NAME(pipe),
977 : #endif
978 : SYSCALL_BY_NAME(pipe2),
979 : SYSCALL_BY_NAME(pivot_root),
980 : #ifdef SYS_poll
981 : SYSCALL_BY_NAME(poll),
982 : #endif
983 : SYSCALL_BY_NAME(ppoll),
984 : SYSCALL_BY_NAME(prctl),
985 : SYSCALL_BY_NAME(pread64),
986 : SYSCALL_BY_NAME(preadv),
987 : #ifdef SYS_preadv2
988 : SYSCALL_BY_NAME(preadv2),
989 : #endif // SYS_preadv2
990 : #ifdef SYS_pkey_mprotect
991 : SYSCALL_BY_NAME(pkey_mprotect),
992 : #endif // SYS_pkey_mprotect
993 : #ifdef SYS_pkey_alloc
994 : SYSCALL_BY_NAME(pkey_alloc),
995 : #endif // SYS_pkey_alloc
996 : #ifdef SYS_pkey_free
997 : SYSCALL_BY_NAME(pkey_free),
998 : #endif // SYS_pkey_free
999 : SYSCALL_BY_NAME(prlimit64),
1000 : SYSCALL_BY_NAME(process_vm_readv),
1001 : SYSCALL_BY_NAME(process_vm_writev),
1002 : SYSCALL_BY_NAME(pselect6),
1003 : SYSCALL_BY_NAME(ptrace),
1004 : #ifdef SYS_putpmsg
1005 : SYSCALL_BY_NAME(putpmsg),
1006 : #endif
1007 : SYSCALL_BY_NAME(pwrite64),
1008 : SYSCALL_BY_NAME(pwritev),
1009 : #ifdef SYS_pwritev2
1010 : SYSCALL_BY_NAME(pwritev2),
1011 : #endif // SYS_pwritev2
1012 : #ifdef SYS_query_module
1013 : SYSCALL_BY_NAME(query_module),
1014 : #endif
1015 : SYSCALL_BY_NAME(quotactl),
1016 : SYSCALL_BY_NAME(read),
1017 : SYSCALL_BY_NAME(readahead),
1018 : #ifdef SYS_readlink
1019 : SYSCALL_BY_NAME(readlink),
1020 : #endif
1021 : SYSCALL_BY_NAME(readlinkat),
1022 : SYSCALL_BY_NAME(readv),
1023 : SYSCALL_BY_NAME(reboot),
1024 : SYSCALL_BY_NAME(recvfrom),
1025 : SYSCALL_BY_NAME(recvmmsg),
1026 : SYSCALL_BY_NAME(recvmsg),
1027 : SYSCALL_BY_NAME(remap_file_pages),
1028 : SYSCALL_BY_NAME(removexattr),
1029 : #ifdef SYS_rename
1030 : SYSCALL_BY_NAME(rename),
1031 : #endif
1032 : SYSCALL_BY_NAME(renameat),
1033 : SYSCALL_BY_NAME(renameat2),
1034 : SYSCALL_BY_NAME(request_key),
1035 : SYSCALL_BY_NAME(restart_syscall),
1036 : #ifdef SYS_rmdir
1037 : SYSCALL_BY_NAME(rmdir),
1038 : #endif
1039 : #ifdef SYS_rseq
1040 : SYSCALL_BY_NAME(rseq),
1041 : #endif // SYS_rseq
1042 : SYSCALL_BY_NAME(rt_sigaction),
1043 : SYSCALL_BY_NAME(rt_sigpending),
1044 : SYSCALL_BY_NAME(rt_sigprocmask),
1045 : SYSCALL_BY_NAME(rt_sigqueueinfo),
1046 : SYSCALL_BY_NAME(rt_sigreturn),
1047 : SYSCALL_BY_NAME(rt_sigsuspend),
1048 : SYSCALL_BY_NAME(rt_sigtimedwait),
1049 : SYSCALL_BY_NAME(rt_tgsigqueueinfo),
1050 : SYSCALL_BY_NAME(sched_get_priority_max),
1051 : SYSCALL_BY_NAME(sched_get_priority_min),
1052 : SYSCALL_BY_NAME(sched_getaffinity),
1053 : SYSCALL_BY_NAME(sched_getattr),
1054 : SYSCALL_BY_NAME(sched_getparam),
1055 : SYSCALL_BY_NAME(sched_getscheduler),
1056 : SYSCALL_BY_NAME(sched_rr_get_interval),
1057 : SYSCALL_BY_NAME(sched_setaffinity),
1058 : SYSCALL_BY_NAME(sched_setattr),
1059 : SYSCALL_BY_NAME(sched_setparam),
1060 : SYSCALL_BY_NAME(sched_setscheduler),
1061 : SYSCALL_BY_NAME(sched_yield),
1062 : SYSCALL_BY_NAME(seccomp),
1063 : #ifdef SYS_security
1064 : SYSCALL_BY_NAME(security),
1065 : #endif // SYS_security
1066 : #ifdef SYS_select
1067 : SYSCALL_BY_NAME(select),
1068 : #endif
1069 : #ifdef SYS_semctl
1070 : SYSCALL_BY_NAME(semctl),
1071 : #endif // SYS_semctl
1072 : #ifdef SYS_semget
1073 : SYSCALL_BY_NAME(semget),
1074 : #endif // SYS_semget
1075 : #ifdef SYS_semop
1076 : SYSCALL_BY_NAME(semop),
1077 : #endif // SYS_semop
1078 : #ifdef SYS_semtimedop
1079 : SYSCALL_BY_NAME(semtimedop),
1080 : #endif // SYS_semtimedop
1081 : SYSCALL_BY_NAME(sendfile),
1082 : SYSCALL_BY_NAME(sendmmsg),
1083 : SYSCALL_BY_NAME(sendmsg),
1084 : SYSCALL_BY_NAME(sendto),
1085 : SYSCALL_BY_NAME(set_mempolicy),
1086 : SYSCALL_BY_NAME(set_robust_list),
1087 : #ifdef SYS_set_thread_area
1088 : SYSCALL_BY_NAME(set_thread_area),
1089 : #endif // SYS_set_thread_area
1090 : SYSCALL_BY_NAME(set_tid_address),
1091 : SYSCALL_BY_NAME(setdomainname),
1092 : SYSCALL_BY_NAME(setfsgid),
1093 : SYSCALL_BY_NAME(setfsuid),
1094 : SYSCALL_BY_NAME(setgid),
1095 : SYSCALL_BY_NAME(setgroups),
1096 : SYSCALL_BY_NAME(sethostname),
1097 : SYSCALL_BY_NAME(setitimer),
1098 : SYSCALL_BY_NAME(setns),
1099 : SYSCALL_BY_NAME(setpgid),
1100 : SYSCALL_BY_NAME(setpriority),
1101 : SYSCALL_BY_NAME(setregid),
1102 : SYSCALL_BY_NAME(setresgid),
1103 : SYSCALL_BY_NAME(setresuid),
1104 : SYSCALL_BY_NAME(setreuid),
1105 : SYSCALL_BY_NAME(setrlimit),
1106 : SYSCALL_BY_NAME(setsid),
1107 : SYSCALL_BY_NAME(setsockopt),
1108 : SYSCALL_BY_NAME(settimeofday),
1109 : SYSCALL_BY_NAME(setuid),
1110 : SYSCALL_BY_NAME(setxattr),
1111 : #ifdef SYS_shmat
1112 : SYSCALL_BY_NAME(shmat),
1113 : #endif // SYS_shmat
1114 : #ifdef SYS_shmctl
1115 : SYSCALL_BY_NAME(shmctl),
1116 : #endif // SYS_shmctl
1117 : #ifdef SYS_shmdt
1118 : SYSCALL_BY_NAME(shmdt),
1119 : #endif // SYS_shmdt
1120 : #ifdef SYS_shmget
1121 : SYSCALL_BY_NAME(shmget),
1122 : #endif // SYS_shmget
1123 : SYSCALL_BY_NAME(shutdown),
1124 : SYSCALL_BY_NAME(sigaltstack),
1125 : #ifdef SYS_signalfd
1126 : SYSCALL_BY_NAME(signalfd),
1127 : #endif
1128 : SYSCALL_BY_NAME(signalfd4),
1129 : SYSCALL_BY_NAME(socket),
1130 : SYSCALL_BY_NAME(socketpair),
1131 : SYSCALL_BY_NAME(splice),
1132 : #ifdef SYS_stat
1133 : SYSCALL_BY_NAME(stat),
1134 : #endif
1135 : SYSCALL_BY_NAME(statfs),
1136 : #ifdef SYS_statx
1137 : SYSCALL_BY_NAME(statx),
1138 : #endif // SYS_statx
1139 : SYSCALL_BY_NAME(swapoff),
1140 : SYSCALL_BY_NAME(swapon),
1141 : #ifdef SYS_symlink
1142 : SYSCALL_BY_NAME(symlink),
1143 : #endif
1144 : SYSCALL_BY_NAME(symlinkat),
1145 : SYSCALL_BY_NAME(sync),
1146 : #ifdef SYS_sync_file_range
1147 : SYSCALL_BY_NAME(sync_file_range),
1148 : #endif // SYS_sync_file_range
1149 : SYSCALL_BY_NAME(syncfs),
1150 : #ifdef SYS_sysfs
1151 : SYSCALL_BY_NAME(sysfs),
1152 : #endif
1153 : SYSCALL_BY_NAME(sysinfo),
1154 : SYSCALL_BY_NAME(syslog),
1155 : SYSCALL_BY_NAME(tee),
1156 : SYSCALL_BY_NAME(tgkill),
1157 : #ifdef SYS_time
1158 : SYSCALL_BY_NAME(time),
1159 : #endif
1160 : SYSCALL_BY_NAME(timer_create),
1161 : SYSCALL_BY_NAME(timer_delete),
1162 : SYSCALL_BY_NAME(timer_getoverrun),
1163 : SYSCALL_BY_NAME(timer_gettime),
1164 : SYSCALL_BY_NAME(timer_settime),
1165 : SYSCALL_BY_NAME(timerfd_create),
1166 : SYSCALL_BY_NAME(timerfd_gettime),
1167 : SYSCALL_BY_NAME(timerfd_settime),
1168 : SYSCALL_BY_NAME(times),
1169 : SYSCALL_BY_NAME(tkill),
1170 : SYSCALL_BY_NAME(truncate),
1171 : #ifdef SYS_tuxcall
1172 : SYSCALL_BY_NAME(tuxcall),
1173 : #endif
1174 : SYSCALL_BY_NAME(umask),
1175 : SYSCALL_BY_NAME(umount2),
1176 : SYSCALL_BY_NAME(uname),
1177 : #ifdef SYS_unlink
1178 : SYSCALL_BY_NAME(unlink),
1179 : #endif
1180 : SYSCALL_BY_NAME(unlinkat),
1181 : SYSCALL_BY_NAME(unshare),
1182 : #ifdef SYS_uselib
1183 : SYSCALL_BY_NAME(uselib),
1184 : #endif
1185 : SYSCALL_BY_NAME(userfaultfd),
1186 : #ifdef SYS_ustat
1187 : SYSCALL_BY_NAME(ustat),
1188 : #endif
1189 : #ifdef SYS_utime
1190 : SYSCALL_BY_NAME(utime),
1191 : #endif
1192 : SYSCALL_BY_NAME(utimensat),
1193 : #ifdef SYS_utimes
1194 : SYSCALL_BY_NAME(utimes),
1195 : #endif
1196 : #ifdef SYS_vfork
1197 : SYSCALL_BY_NAME(vfork),
1198 : #endif
1199 : SYSCALL_BY_NAME(vhangup),
1200 : SYSCALL_BY_NAME(vmsplice),
1201 : #ifdef SYS_vserver
1202 : SYSCALL_BY_NAME(vserver),
1203 : #endif // SYS_vserver
1204 : SYSCALL_BY_NAME(wait4),
1205 : SYSCALL_BY_NAME(waitid),
1206 : SYSCALL_BY_NAME(write),
1207 : SYSCALL_BY_NAME(writev),
1208 : };
1209 :
1210 : static int
1211 3766 : compare_named_entries(const void* k, const void* e) {
1212 3766 : const char* name = (const char*) k;
1213 3766 : struct named_syscall_entry* entry = (struct named_syscall_entry*) e;
1214 3766 : return strcmp(name, entry->s_name);
1215 : }
1216 :
1217 : const struct syscall_info*
1218 538 : get_syscall_info_by_name(const char* syscall_name) {
1219 :
1220 538 : struct named_syscall_entry* res = bsearch(
1221 : syscall_name, &syscalls_by_name[0], ARRAY_SIZE(syscalls_by_name),
1222 : sizeof(struct named_syscall_entry), compare_named_entries);
1223 :
1224 538 : if(res == NULL) {
1225 : return &unknown_syscall;
1226 : }
1227 :
1228 538 : return res->s_info;
1229 : }
1230 :
1231 : #define RETURN_TYPE(scinfo) (scinfo)->s_return_type.r_type
1232 :
1233 : bool
1234 0 : syscall_never_returns(long syscall_number) {
1235 0 : return RETURN_TYPE(get_syscall_info(syscall_number, NULL)) == rnone;
1236 : }
1237 :
1238 :
1239 : #undef SYSCALL
1240 : #undef S_NOARGS
1241 : #undef S_UARG
1242 : #undef S_NARG
1243 : #undef S_RET
1244 : #undef SYSCALL_BY_NAME
1245 : #undef ARRAY_SIZE
1246 :
1247 : // clang-format on
|