1 /*
2 * Copyright (C) 2013-2021 Canonical, Ltd.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 *
18 * This code is a complete clean re-write of the stress tool by
19 * Colin Ian King <colin.king@canonical.com> and attempts to be
20 * backwardly compatible with the stress tool by Amos Waterland
21 * <apw@rossby.metr.ou.edu> but has more stress tests and more
22 * functionality.
23 *
24 */
25 #include "stress-ng.h"
26
27 static const stress_help_t help[] = {
28 { NULL, "sysinval N", "start N workers that pass invalid args to syscalls" },
29 { NULL, "sysinval-ops N", "stop after N sysinval bogo syscalls" },
30 { NULL, NULL, NULL }
31 };
32
33 #if defined(HAVE_SYSCALL_H) && \
34 !defined(__APPLE__) && \
35 !defined(__gnu_hurd__)
36
37 #define ARG_BITMASK(x, bitmask) (((x) & (bitmask)) == (bitmask))
38
39 #define SYSCALL_HASH_TABLE_SIZE (10007) /* Hash table size (prime) */
40 #define SYSCALL_FAIL (0x00) /* Expected behaviour */
41 #define SYSCALL_CRASH (0x01) /* Syscalls that crash the child */
42 #define SYSCALL_ERRNO_ZERO (0x02) /* Syscalls that return 0 */
43 #define SYSCALL_TIMED_OUT (0x03) /* Syscalls that time out */
44
45 #define MAX_CRASHES (10)
46 #define SYSCALL_TIMEOUT_USEC (10000) /* Timeout syscalls duration */
47
48 /*
49 * tuple of system call number and stringified system call
50 */
51 #if defined(__NR_exit)
52 #define SYS(x) __NR_ ## x, # x
53 #define DEFSYS(x) __NR_ ## x
54 #elif defined(SYS_exit)
55 #define SYS(x) SYS_ ## x, # x
56 #define DEFSYS(x) SYS_ ## x
57 #else
58 #define SYS(x) 0, "unknown"
59 #define DEFSYS(x) 0
60 #endif
61
62 /*
63 * system call argument types
64 */
65 #define ARG_NONE 0x00000000UL
66 #define ARG_PTR 0x00000002UL
67 #define ARG_INT 0x00000004UL
68 #define ARG_UINT 0x00000008UL
69 #define ARG_SOCKFD 0x00000010UL
70 #define ARG_STRUCT_SOCKADDR 0x00000020UL
71 #define ARG_SOCKLEN_T 0x00000040UL
72 #define ARG_FLAG 0x00000080UL
73 #define ARG_BRK_ADDR 0x00000100UL
74 #define ARG_MODE 0x00000200UL
75 #define ARG_LEN 0x00000400UL
76 #define ARG_SECONDS 0x00001000UL
77 #define ARG_BPF_ATTR 0x00002000UL
78 #define ARG_EMPTY_FILENAME 0x00004000UL /* "" */
79 #define ARG_DEVZERO_FILENAME 0x00008000UL /* /dev/zero */
80 #define ARG_CLOCKID_T 0x00010000UL
81 #define ARG_FUNC_PTR 0x00020000UL
82 #define ARG_FD 0x00040000UL
83 #define ARG_TIMEOUT 0x00080000UL
84 #define ARG_DIRFD 0x00100000UL
85 #define ARG_DEVNULL_FILENAME 0x00200000UL /* /dev/null */
86 #define ARG_RND 0x00400000UL
87 #define ARG_PID 0x00800000UL
88 #define ARG_NON_NULL_PTR 0x01000000UL
89 #define ARG_NON_ZERO_LEN 0x02000000UL
90 #define ARG_GID 0x04000000UL
91 #define ARG_UID 0x08000000UL
92 #define ARG_FUTEX_PTR 0x10000000UL
93 #define ARG_PTR_WR 0x20000000UL /* kernel writes data to ptr */
94 #define ARG_ACCESS_MODE 0x40000000UL /* faccess modes */
95 #define ARG_MISC 0x80000000UL
96
97 /*
98 * misc system call args
99 */
100 #define ARG_ADD_KEY_TYPES 0x00000001UL | ARG_MISC
101 #define ARG_ADD_KEY_DESCRS 0x00000002UL | ARG_MISC
102 #define ARG_BPF_CMDS 0x00000003UL | ARG_MISC
103 #define ARG_BPF_LEN 0x00000004UL | ARG_MISC
104
105 #define ARG_VALUE(x, v) { (x), SIZEOF_ARRAY(v), (unsigned long *)v }
106 #define ARG_MISC_ID(x) ((x) & ~ARG_MISC)
107
108 /*
109 * rotate right for hashing
110 */
111 #define ROR(val) \
112 do { \
113 unsigned long tmp = val; \
114 const size_t bits = (sizeof(unsigned long) * 8) - 1; \
115 const unsigned long bit0 = (tmp & 1) << bits; \
116 tmp >>= 1; \
117 tmp |= bit0; \
118 val = tmp; \
119 } while (0)
120
121 #define SHR_UL(v, shift) ((unsigned long)(((unsigned long long)v) << shift))
122
123 /*
124 * per system call testing information, each system call
125 * to be exercised has one or more of these records.
126 */
127 typedef struct {
128 const unsigned long syscall; /* system call number */
129 const char *name; /* text name of system call */
130 const int num_args; /* number of arguments */
131 unsigned long arg_bitmasks[6]; /* semantic info about each argument */
132 } stress_syscall_arg_t;
133
134 /*
135 * argument semantic information, unique argument types
136 * have one of these records to represent the different
137 * invalid argument values. Keep these values as short
138 * as possible as each new value increases the number of
139 * permutations
140 */
141 typedef struct {
142 unsigned long bitmask; /* bitmask representing arg type */
143 size_t num_values; /* number of different invalid values */
144 unsigned long *values; /* invalid values */
145 } stress_syscall_arg_values_t;
146
147 /*
148 * hash table entry for syscalls and arguments that need
149 * to be skipped either because they crash the child or
150 * because the system call succeeds
151 */
152 typedef struct stress_syscall_args_hash {
153 struct stress_syscall_args_hash *next; /* next item in list */
154 unsigned long hash; /* has of system call and args */
155 unsigned long syscall; /* system call number */
156 unsigned long args[6]; /* arguments */
157 uint8_t type; /* type of failure */
158 } stress_syscall_arg_hash_t;
159
160 /*
161 * hash table - in the parent context this records system
162 * calls that crash the child. in the child context this
163 * contains the same crasher data that the parent has plus
164 * a cache of the system calls that return 0 and we don't
165 * want to retest - this child cached data is lost when the
166 * child crashes.
167 */
168 static stress_syscall_arg_hash_t *hash_table[SYSCALL_HASH_TABLE_SIZE];
169
170 static double time_end;
171
172 static const int sigs[] = {
173 #if defined(SIGILL)
174 SIGILL,
175 #endif
176 #if defined(SIGTRAP)
177 SIGTRAP,
178 #endif
179 #if defined(SIGFPE)
180 SIGFPE,
181 #endif
182 #if defined(SIGBUS)
183 SIGBUS,
184 #endif
185 #if defined(SIGSEGV)
186 SIGSEGV,
187 #endif
188 #if defined(SIGIOT)
189 SIGIOT,
190 #endif
191 #if defined(SIGEMT)
192 SIGEMT,
193 #endif
194 #if defined(SIGALRM)
195 SIGALRM,
196 #endif
197 #if defined(SIGINT)
198 SIGINT,
199 #endif
200 #if defined(SIGHUP)
201 SIGHUP
202 #endif
203 };
204
205 static uint8_t *small_ptr;
206 static uint8_t *small_ptr_wr;
207 static uint8_t *page_ptr;
208 static uint8_t *page_ptr_wr;
209
210 static const stress_syscall_arg_t stress_syscall_args[] = {
211 #if DEFSYS(_llseek)
212 { SYS(_llseek), 5, { ARG_FD, ARG_UINT, ARG_UINT, ARG_PTR, ARG_INT } },
213 #endif
214 #if DEFSYS(_sysctl)
215 { SYS(_sysctl), 1, { ARG_PTR } },
216 #endif
217 #if DEFSYS(accept)
218 { SYS(accept), 3, { ARG_SOCKFD, ARG_PTR | ARG_STRUCT_SOCKADDR, ARG_PTR, 0, 0, 0 } },
219 #endif
220 #if DEFSYS(accept4)
221 { SYS(accept4), 4, { ARG_SOCKFD, ARG_PTR | ARG_STRUCT_SOCKADDR, ARG_PTR, ARG_FLAG, 0, 0 } },
222 #endif
223 #if DEFSYS(access)
224 { SYS(access), 2, { ARG_PTR | ARG_EMPTY_FILENAME, ARG_MODE, 0, 0, 0, 0 } },
225 { SYS(access), 2, { ARG_PTR | ARG_DEVZERO_FILENAME, ARG_MODE, 0, 0, 0, 0 } },
226 { SYS(access), 2, { ARG_PTR | ARG_EMPTY_FILENAME, ARG_ACCESS_MODE, 0, 0, 0, 0 } },
227 { SYS(access), 2, { ARG_PTR | ARG_DEVZERO_FILENAME, ARG_ACCESS_MODE, 0, 0, 0, 0 } },
228 #endif
229 #if DEFSYS(acct)
230 { SYS(acct), 1, { ARG_PTR | ARG_EMPTY_FILENAME, 0, 0, 0, 0, 0 } },
231 #endif
232 #if DEFSYS(add_key)
233 { SYS(add_key), 5, { ARG_ADD_KEY_TYPES, ARG_ADD_KEY_DESCRS, ARG_PTR, ARG_LEN, ARG_UINT, 0 } },
234 { SYS(add_key), 5, { ARG_PTR, ARG_PTR, ARG_PTR, ARG_LEN, ARG_UINT, 0 } },
235 #endif
236 #if DEFSYS(adjtimex)
237 /* Need to also test invalid args:
238 time.tv_usec < 0
239 time.tv_usec > 1000000
240 tick < 900000/USER_HZ
241 tick > 100000/USER_HZ
242 (txc->modes & ADJ_NANO) and txc->time.tv_usec >= NSEC_PER_SEC
243 */
244 { SYS(adjtimex), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
245 #endif
246 #if DEFSYS(alarm) && 0
247 { SYS(alarm), 1, { ARG_SECONDS, 0, 0, 0, 0, 0 } },
248 #endif
249 #if DEFSYS(alloc_hugepages)
250 /* removed in 2.5.44 */
251 { SYS(alloc_hugepages), 5, { ARG_INT, ARG_PTR, ARG_LEN, ARG_INT, ARG_FLAG } },
252 #endif
253 #if DEFSYS(arc_gettls)
254 /* ARC only */
255 #endif
256 #if DEFSYS(arc_settls)
257 /* ARC only */
258 #endif
259 #if DEFSYS(arc_usr_cmpxchg)
260 /* ARC only */
261 #endif
262 #if DEFSYS(arch_prctl)
263 { SYS(arch_prctl), 2, { ARG_INT, ARG_UINT } },
264 { SYS(arch_prctl), 2, { ARG_INT, ARG_PTR } },
265 #endif
266 #if DEFSYS(atomic_barrier)
267 /* m68k only */
268 #endif
269 #if DEFSYS(atomic_cmpxchg_32)
270 /* m68k only */
271 #endif
272 #if DEFSYS(bdflush)
273 /* deprecated */
274 { SYS(bdflush), 2, { ARG_INT, ARG_PTR } },
275 { SYS(bdflush), 2, { ARG_INT, ARG_UINT } },
276 #endif
277 #if DEFSYS(bfin_spinlock)
278 /* blackfin, removed in 4.17 */
279 #endif
280 #if DEFSYS(bind)
281 { SYS(bind), 3, { ARG_SOCKFD, ARG_PTR | ARG_STRUCT_SOCKADDR, ARG_SOCKLEN_T, 0, 0, 0 } },
282 #endif
283 #if DEFSYS(bpf)
284 { SYS(bpf), 3, { ARG_BPF_CMDS, ARG_PTR | ARG_BPF_ATTR, ARG_BPF_LEN, 0, 0, 0 } },
285 { SYS(bpf), 3, { ARG_BPF_CMDS, ARG_PTR | ARG_BPF_ATTR, ARG_LEN, 0, 0, 0 } },
286 { SYS(bpf), 3, { ARG_INT, ARG_PTR | ARG_BPF_ATTR, ARG_LEN, 0, 0, 0 } },
287
288 #endif
289 #if DEFSYS(brk)
290 { SYS(brk), 1, { ARG_PTR | ARG_BRK_ADDR, 0, 0, 0, 0, 0 } },
291 { SYS(brk), 1, { ARG_PTR_WR | ARG_BRK_ADDR, 0, 0, 0, 0, 0 } },
292 #endif
293 #if DEFSYS(breakpoint)
294 /* ARM OABI only */
295 #endif
296 #if DEFSYS(cacheflush)
297 { SYS(cacheflush), 3, { ARG_PTR, ARG_INT, ARG_INT, 0, 0, 0 } },
298 #endif
299 #if DEFSYS(capget)
300 { SYS(capget), 2, { ARG_INT, ARG_PTR, 0, 0, 0, 0 } },
301 { SYS(capget), 2, { ARG_INT, ARG_PTR_WR, 0, 0, 0, 0 } },
302 #endif
303 #if DEFSYS(capset)
304 { SYS(capset), 2, { ARG_INT, ARG_PTR, 0, 0, 0, 0 } },
305 #endif
306 #if DEFSYS(chdir)
307 { SYS(chdir), 1, { ARG_PTR | ARG_EMPTY_FILENAME, 0, 0, 0, 0, 0 } },
308 { SYS(chdir), 1, { ARG_PTR | ARG_DEVZERO_FILENAME, 0, 0, 0, 0, 0 } },
309 #endif
310 #if DEFSYS(chmod)
311 { SYS(chmod), 2, { ARG_PTR | ARG_EMPTY_FILENAME, ARG_INT, 0, 0, 0, 0 } },
312 #endif
313 #if DEFSYS(chown)
314 { SYS(chown), 2, { ARG_PTR | ARG_EMPTY_FILENAME, ARG_INT, 0, 0, 0, 0 } },
315 #endif
316 #if DEFSYS(chroot)
317 { SYS(chroot), 1, { ARG_PTR | ARG_EMPTY_FILENAME, 0, 0, 0, 0, 0 } },
318 { SYS(chroot), 1, { ARG_PTR | ARG_DEVZERO_FILENAME, 0, 0, 0, 0, 0 } },
319 #endif
320 #if DEFSYS(clock_adjtime)
321 { SYS(clock_adjtime), 2, { ARG_CLOCKID_T, ARG_PTR, 0, 0, 0, 0 } },
322 #endif
323 #if DEFSYS(clock_getres)
324 { SYS(clock_getres), 2, { ARG_CLOCKID_T, ARG_PTR, 0, 0, 0, 0 } },
325 { SYS(clock_getres), 2, { ARG_CLOCKID_T, ARG_PTR_WR, 0, 0, 0, 0 } },
326 #endif
327 #if DEFSYS(clock_gettime)
328 { SYS(clock_gettime), 2, { ARG_CLOCKID_T, ARG_PTR, 0, 0, 0, 0 } },
329 { SYS(clock_gettime), 2, { ARG_CLOCKID_T, ARG_PTR_WR, 0, 0, 0, 0 } },
330 #endif
331 #if DEFSYS(clock_nanosleep)
332 { SYS(clock_nanosleep), 4, { ARG_CLOCKID_T, ARG_UINT, ARG_PTR, ARG_PTR, 0, 0 } },
333 #endif
334 #if DEFSYS(clock_settime)
335 { SYS(clock_settime), 2, { ARG_CLOCKID_T, ARG_PTR, 0, 0, 0, 0 } },
336 #endif
337 #if DEFSYS(clone)
338 /* { SYS(clone), 6, { ARG_FUNC_PTR, ARG_PTR, ARG_INT, ARG_PTR, ARG_PTR, ARG_PTR } }, */
339 #endif
340 #if DEFSYS(clone2)
341 /* IA-64 only */
342 #endif
343 #if DEFSYS(clone3)
344 /* { SYS(clone3), 2, { ARG_PTR, ARG_LEN, 0, 0, 0, 0 } }, */
345 #endif
346 #if DEFSYS(close)
347 { SYS(close), 1, { ARG_FD, 0, 0, 0, 0, 0 } },
348 #endif
349 #if DEFSYS(cmpxchg_badaddr)
350 /* Tile only, removed 4.17 */
351 #endif
352 #if DEFSYS(connect)
353 { SYS(connect), 3, { ARG_SOCKFD, ARG_PTR, ARG_LEN, 0, 0, 0 } },
354 #endif
355 #if DEFSYS(copy_file_range)
356 { SYS(copy_file_range), 6, { ARG_FD, ARG_PTR, ARG_FD, ARG_PTR, ARG_LEN, ARG_FLAG } },
357 #endif
358 #if DEFSYS(creat)
359 { SYS(creat), 3, { ARG_EMPTY_FILENAME, ARG_FLAG, ARG_MODE, 0, 0, 0 } },
360 #endif
361 #if DEFSYS(create_module)
362 { SYS(create_module), 2, { ARG_PTR, ARG_LEN, 0, 0, 0, 0 } },
363 #endif
364 #if DEFSYS(delete_module)
365 { SYS(delete_module), 2, { ARG_PTR, ARG_FLAG, 0, 0, 0, 0 } },
366 #endif
367 #if DEFSYS(dma_memcpy)
368 /* blackfin, removed in 4.17 */
369 #endif
370 #if DEFSYS(dup)
371 { SYS(dup), 1, { ARG_FD, 0, 0, 0, 0, 0 } },
372 #endif
373 #if DEFSYS(dup2)
374 { SYS(dup2), 2, { ARG_FD, ARG_FD, 0, 0, 0, 0 } },
375 #endif
376 #if DEFSYS(dup3)
377 { SYS(dup3), 3, { ARG_FD, ARG_FD, ARG_FLAG, 0, 0, 0 } },
378 #endif
379 #if DEFSYS(epoll_create)
380 { SYS(epoll_create), 1, { ARG_LEN, 0, 0, 0, 0, 0 } },
381 #endif
382 #if DEFSYS(epoll_create1)
383 { SYS(epoll_create1), 1, { ARG_FLAG, 0, 0, 0, 0, 0 } },
384 #endif
385 #if DEFSYS(epoll_ctl)
386 { SYS(epoll_ctl), 4, { ARG_FD, ARG_INT, ARG_FD, ARG_PTR, 0, 0 } },
387 #endif
388 #if DEFSYS(epoll_ctl_add)
389 { SYS(epoll_ctl_add), 4, { ARG_FD, ARG_INT, ARG_FD, ARG_PTR, 0, 0 } },
390 #endif
391 #if DEFSYS(epoll_wait)
392 { SYS(epoll_wait), 4, { ARG_FD, ARG_PTR, ARG_INT, ARG_TIMEOUT, 0, 0 } },
393 { SYS(epoll_wait), 4, { ARG_FD, ARG_PTR_WR, ARG_INT, ARG_TIMEOUT, 0, 0 } },
394 #endif
395 #if DEFSYS(epoll_pwait)
396 { SYS(epoll_pwait), 5, { ARG_FD, ARG_PTR, ARG_INT, ARG_TIMEOUT, ARG_PTR, 0 } },
397 { SYS(epoll_pwait), 5, { ARG_FD, ARG_PTR, ARG_INT, ARG_TIMEOUT, ARG_PTR_WR, 0 } },
398 { SYS(epoll_pwait), 5, { ARG_FD, ARG_PTR_WR, ARG_INT, ARG_TIMEOUT, ARG_PTR_WR, 0 } },
399 #endif
400 #if DEFSYS(evendfd)
401 { SYS(eventfd), 2, { ARG_INT, ARG_FLAG, 0, 0, 0, 0 } },
402 #endif
403 #if DEFSYS(evendfd2)
404 { SYS(eventfd2), 2, { ARG_INT, ARG_FLAG, 0, 0, 0, 0 } },
405 #endif
406 #if DEFSYS(exec)
407 /* too risky for now */
408 #endif
409 #if DEFSYS(execv)
410 /* too risky for now */
411 #endif
412 #if DEFSYS(execve)
413 /* too risky for now */
414 #endif
415 #if DEFSYS(exit)
416 /* exiting the testing child is not a good idea */
417 #endif
418 #if DEFSYS(exit_group)
419 /* exiting the testing child is not a good idea */
420 #endif
421 #if DEFSYS(faccessat)
422 { SYS(faccessat), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_MODE, ARG_FLAG, 0, 0 } },
423 { SYS(faccessat), 4, { ARG_DIRFD, ARG_DEVNULL_FILENAME, ARG_MODE, ARG_FLAG, 0, 0 } },
424 { SYS(faccessat), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_ACCESS_MODE, ARG_FLAG, 0, 0 } },
425 { SYS(faccessat), 4, { ARG_DIRFD, ARG_DEVNULL_FILENAME, ARG_ACCESS_MODE, ARG_FLAG, 0, 0 } },
426 #endif
427 #if DEFSYS(fadvise64)
428 { SYS(fadvise64), 4, { ARG_FD, ARG_UINT, ARG_LEN, ARG_INT, 0, 0 } },
429 #endif
430 #if DEFSYS(fadvise64_64)
431 /* TODO */
432 #endif
433 #if DEFSYS(fallocate)
434 { SYS(fallocate), 4, { ARG_FD, ARG_MODE, ARG_INT, ARG_INT, 0, 0 } },
435 #endif
436 #if DEFSYS(fanotify_init)
437 { SYS(fanotify_init), 2, { ARG_FLAG, ARG_FLAG, 0, 0, 0, 0 } },
438 #endif
439 #if DEFSYS(fanotify_mark)
440 { SYS(fanotify_mark), 5, { ARG_FD, ARG_FLAG, ARG_UINT, ARG_FD, ARG_EMPTY_FILENAME, 0 } },
441 #endif
442 #if DEFSYS(fchdir)
443 { SYS(fchdir), 1, { ARG_FD, 0, 0, 0, 0, 0 } },
444 #endif
445 #if DEFSYS(fchmod)
446 { SYS(fchmod), 2, { ARG_FD, ARG_MODE, 0, 0, 0, 0 } },
447 #endif
448 #if DEFSYS(fchmodat)
449 { SYS(fchmodat), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_MODE, ARG_FLAG, 0, 0 } },
450 #endif
451 #if DEFSYS(fchown)
452 // { SYS(fchown), 3, { ARG_FD, 0, 0, 0, 0, 0 } },
453 #endif
454 #if DEFSYS(fchownat)
455 { SYS(fchownat), 5, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_UINT, ARG_UINT, ARG_UINT, 0 } },
456 #endif
457 #if DEFSYS(fcntl)
458 { SYS(fcntl), 6, { ARG_FD, ARG_RND, ARG_RND, ARG_RND, ARG_RND, ARG_RND } },
459 #endif
460 #if DEFSYS(fcntl64)
461 { SYS(fcntl64), 6, { ARG_FD, ARG_RND, ARG_RND, ARG_RND, ARG_RND, ARG_RND } },
462 #endif
463 #if DEFSYS(fdatasync)
464 { SYS(fdatasync), 1, { ARG_FD, 0, 0, 0, 0, 0 } },
465 #endif
466 #if DEFSYS(fgetxattr)
467 { SYS(fgetxattr), 4, { ARG_FD, ARG_EMPTY_FILENAME, ARG_PTR, ARG_LEN, 0, 0 } },
468 { SYS(fgetxattr), 4, { ARG_FD, ARG_DEVNULL_FILENAME, ARG_PTR, ARG_LEN, 0, 0 } },
469 { SYS(fgetxattr), 4, { ARG_FD, ARG_EMPTY_FILENAME, ARG_PTR_WR, ARG_LEN, 0, 0 } },
470 { SYS(fgetxattr), 4, { ARG_FD, ARG_DEVNULL_FILENAME, ARG_PTR_WR, ARG_LEN, 0, 0 } },
471 #endif
472 #if DEFSYS(finit_module)
473 { SYS(finit_module), 3, { ARG_PTR, ARG_LEN, ARG_PTR, 0, 0, 0 } },
474 #endif
475 #if DEFSYS(flistxattr)
476 { SYS(flistxattr), 3, { ARG_FD, ARG_PTR, ARG_LEN, 0, 0, 0 } },
477 { SYS(flistxattr), 3, { ARG_FD, ARG_PTR_WR, ARG_LEN, 0, 0, 0 } },
478 #endif
479 #if DEFSYS(flock)
480 { SYS(flock), 2, { ARG_FD, ARG_INT, 0, 0, 0, 0 } },
481 #endif
482 #if DEFSYS(fremovexattr)
483 { SYS(fremovexattr), 2, { ARG_FD, ARG_PTR, 0, 0, 0, 0 } },
484 #endif
485 #if DEFSYS(fsconfig)
486 #endif
487 #if defined(fsetxattr)
488 { SYS(fsetxattr), 5, { ARG_FD, ARG_PTR, ARG_PTR, ARG_LEN, ARG_FLAG, 0, } },
489 #endif
490 #if DEFSYS(fsmount)
491 #endif
492 #if DEFSYS(fsopen)
493 #endif
494 #if DEFSYS(fspick)
495 #endif
496 #if DEFSYS(fstat)
497 { SYS(fstat), 2, { ARG_FD, ARG_PTR, 0, 0, 0, 0 } },
498 { SYS(fstat), 2, { ARG_FD, ARG_PTR_WR, 0, 0, 0, 0 } },
499 #endif
500 #if DEFSYS(fstat64)
501 #endif
502 #if DEFSYS(fstatat)
503 { SYS(fstatat), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_PTR, ARG_FLAG, 0, 0 } },
504 { SYS(fstatat), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_PTR_WR, ARG_FLAG, 0, 0 } },
505 { SYS(fstatat), 4, { ARG_DIRFD, ARG_DEVNULL_FILENAME, ARG_PTR, ARG_FLAG, 0, 0 } },
506 { SYS(fstatat), 4, { ARG_DIRFD, ARG_DEVNULL_FILENAME, ARG_PTR_WR, ARG_FLAG, 0, 0 } },
507 #endif
508 #if DEFSYS(fstatat64)
509 { SYS(fstatat64), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_PTR, ARG_FLAG, 0, 0 } },
510 { SYS(fstatat64), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_PTR_WR, ARG_FLAG, 0, 0 } },
511 { SYS(fstatat64), 4, { ARG_DIRFD, ARG_DEVNULL_FILENAME, ARG_PTR, ARG_FLAG, 0, 0 } },
512 { SYS(fstatat64), 4, { ARG_DIRFD, ARG_DEVNULL_FILENAME, ARG_PTR_WR, ARG_FLAG, 0, 0 } },
513 #endif
514 #if DEFSYS(fstatfs)
515 { SYS(fstatfs), 2, { ARG_FD, ARG_PTR, 0, 0, 0, 0 } },
516 { SYS(fstatfs), 2, { ARG_FD, ARG_PTR_WR, 0, 0, 0, 0 } },
517 #endif
518 #if DEFSYS(fsync)
519 { SYS(fsync), 1, { ARG_FD, 0, 0, 0, 0, 0 } },
520 #endif
521 #if DEFSYS(ftruncate)
522 { SYS(ftruncate), 2, { ARG_FD, ARG_LEN, 0, 0, 0, 0 } },
523 #endif
524 #if DEFSYS(ftruncate64)
525 { SYS(ftruncate64), 2, { ARG_FD, ARG_LEN, 0, 0, 0, 0 } },
526 #endif
527 #if DEFSYS(futex)
528 { SYS(futex), 6, { ARG_FUTEX_PTR, ARG_INT, ARG_INT, ARG_FUTEX_PTR, ARG_FUTEX_PTR, ARG_INT } },
529 #endif
530 #if DEFSYS(futimens)
531 { SYS(futimens), 4, { ARG_FD, ARG_EMPTY_FILENAME, ARG_PTR, ARG_FLAG, 0, 0 } },
532 #endif
533 #if DEFSYS(get_kernel_syms)
534 /* deprecated in 2.6 */
535 { SYS(get_kernel_syms), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
536 { SYS(get_kernel_syms), 1, { ARG_PTR_WR, 0, 0, 0, 0, 0 } },
537 #endif
538 #if DEFSYS(get_mempolicy)
539 { SYS(get_mempolicy), 5, { ARG_PTR, ARG_PTR, ARG_UINT, ARG_PTR, ARG_FLAG, 0 } },
540 { SYS(get_mempolicy), 5, { ARG_PTR, ARG_PTR, ARG_UINT, ARG_PTR_WR, ARG_FLAG, 0 } },
541 #endif
542 #if DEFSYS(get_robust_list)
543 { SYS(get_robust_list), 3, { ARG_PID, ARG_PTR, ARG_PTR, 0, 0, 0 } },
544 #endif
545 #if DEFSYS(get_thread_area)
546 { SYS(get_thread_area), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
547 { SYS(get_thread_area), 1, { ARG_PTR_WR, 0, 0, 0, 0, 0 } },
548 #endif
549 #if DEFSYS(get_tls)
550 /* ARM OABI only */
551 #endif
552 #if DEFSYS(getcpu)
553 { SYS(getcpu), 3, { ARG_NON_NULL_PTR, ARG_NON_NULL_PTR, ARG_PTR, 0, 0, 0 } },
554 { SYS(getcpu), 3, { ARG_PTR_WR, ARG_PTR_WR, ARG_PTR_WR, 0, 0, 0 } },
555 #endif
556 #if DEFSYS(getcwd)
557 { SYS(getcwd), 2, { ARG_PTR, ARG_LEN, 0, 0, 0, 0 } },
558 { SYS(getcwd), 2, { ARG_PTR_WR, ARG_LEN, 0, 0, 0, 0 } },
559 #endif
560 #if DEFSYS(getdtablesize)
561 /* SPARC, removed in 2.6.26 */
562 #endif
563 #if DEFSYS(getdents)
564 { SYS(getdents), 3, { ARG_FD, ARG_PTR, ARG_LEN, 0, 0, 0 } },
565 { SYS(getdents), 3, { ARG_FD, ARG_PTR_WR, ARG_LEN, 0, 0, 0 } },
566 #endif
567 #if DEFSYS(getdents64)
568 { SYS(getdents64), 3, { ARG_FD, ARG_PTR, ARG_LEN, 0, 0, 0 } },
569 { SYS(getdents64), 3, { ARG_FD, ARG_PTR_WR, ARG_LEN, 0, 0, 0 } },
570 #endif
571 #if DEFSYS(getdomainname)
572 { SYS(getdomainname), 2, { ARG_PTR, ARG_LEN, 0, 0, 0, 0 } },
573 { SYS(getdomainname), 2, { ARG_PTR_WR, ARG_LEN, 0, 0, 0, 0 } },
574 #endif
575 #if DEFSYS(getegid)
576 /* { SYS(getegid), 0, { 0, 0, 0, 0, 0, 0 } }, */
577 #endif
578 #if DEFSYS(getegid32)
579 /* { SYS(getegid32), 0, { 0, 0, 0, 0, 0, 0 } }, */
580 #endif
581 #if DEFSYS(geteuid)
582 /* { SYS(geteuid), 0, { 0, 0, 0, 0, 0, 0 } }, */
583 #endif
584 #if DEFSYS(geteuid32)
585 /* { SYS(geteuid), 0, { 0, 0, 0, 0, 0, 0 } }, */
586 #endif
587 #if DEFSYS(getgid)
588 /* { SYS(getgid), 0, { 0, 0, 0, 0, 0, 0 } }, */
589 #endif
590 #if DEFSYS(getgid32)
591 /* { SYS(getgid32), 0, { 0, 0, 0, 0, 0, 0 } }, */
592 #endif
593 #if DEFSYS(getgroups)
594 { SYS(getgroups), 2, { ARG_INT, ARG_PTR, 0, 0, 0, 0 } },
595 { SYS(getgroups), 2, { ARG_INT, ARG_PTR_WR, 0, 0, 0, 0 } },
596 #endif
597 #if DEFSYS(getgroups32)
598 { SYS(getgroups32), 2, { ARG_INT, ARG_PTR, 0, 0, 0, 0 } },
599 { SYS(getgroups32), 2, { ARG_INT, ARG_PTR_WR, 0, 0, 0, 0 } },
600 #endif
601 #if DEFSYS(gethostname)
602 { SYS(gethostname), 2, { ARG_PTR, ARG_LEN, 0, 0, 0, 0 } },
603 { SYS(gethostname), 2, { ARG_PTR_WR, ARG_LEN, 0, 0, 0, 0 } },
604 #endif
605 #if DEFSYS(getitimer)
606 { SYS(getitimer), 2, { ARG_INT, ARG_PTR, 0, 0, 0, 0 } },
607 { SYS(getitimer), 2, { ARG_INT, ARG_PTR_WR, 0, 0, 0, 0 } },
608 #endif
609 #if DEFSYS(getpagesize)
610 /* { SYS(getpagesize), 0, { 0, 0, 0, 0, 0, 0 } }, */
611 #endif
612 #if DEFSYS(getpeername)
613 { SYS(getpeername), 3, { ARG_SOCKFD, ARG_PTR, ARG_PTR, 0, 0, 0 } },
614 { SYS(getpeername), 3, { ARG_SOCKFD, ARG_PTR_WR, ARG_PTR_WR, 0, 0, 0 } },
615 #endif
616 #if DEFSYS(getpgid)
617 { SYS(getpgid), 1, { ARG_PID, 0, 0, 0, 0, 0 } },
618 #endif
619 #if DEFSYS(getpid)
620 /* { SYS(getpid), 0, { 0, 0, 0, 0, 0, 0 } }, */
621 #endif
622 #if DEFSYS(getppid)
623 /* { SYS(getppid), 0, { 0, 0, 0, 0, 0, 0 } }, */
624 #endif
625 #if DEFSYS(getpriority)
626 { SYS(getpriority), 2, { ARG_INT, ARG_INT, 0, 0, 0, 0 } },
627 #endif
628 #if DEFSYS(getrandom)
629 { SYS(getrandom), 3, { ARG_PTR, ARG_INT, ARG_FLAG, 0, 0, 0 } },
630 { SYS(getrandom), 3, { ARG_PTR_WR, ARG_INT, ARG_FLAG, 0, 0, 0 } },
631 #endif
632 #if DEFSYS(getresgid)
633 { SYS(getresgid), 3, { ARG_PTR, ARG_PTR, ARG_PTR, 0, 0, 0 } },
634 { SYS(getresgid), 3, { ARG_PTR_WR, ARG_PTR_WR, ARG_PTR_WR, 0, 0, 0 } },
635 #endif
636 #if DEFSYS(getresgid32)
637 { SYS(getresgid32), 3, { ARG_PTR, ARG_PTR, ARG_PTR, 0, 0, 0 } },
638 { SYS(getresgid32), 3, { ARG_PTR_WR, ARG_PTR_WR, ARG_PTR_WR, 0, 0, 0 } },
639 #endif
640 #if DEFSYS(getresuid)
641 { SYS(getresuid), 3, { ARG_PTR, ARG_PTR, ARG_PTR, 0, 0, 0 } },
642 { SYS(getresuid), 3, { ARG_PTR_WR, ARG_PTR_WR, ARG_PTR_WR, 0, 0, 0 } },
643 #endif
644 #if DEFSYS(getresuid32)
645 { SYS(getresuid32), 3, { ARG_PTR, ARG_PTR, ARG_PTR, 0, 0, 0 } },
646 { SYS(getresuid32), 3, { ARG_PTR_WR, ARG_PTR_WR, ARG_PTR_WR, 0, 0, 0 } },
647 #endif
648 #if DEFSYS(getrlimit)
649 { SYS(getrlimit), 2, { ARG_RND, ARG_PTR, 0, 0, 0, 0 } },
650 { SYS(getrlimit), 2, { ARG_INT, ARG_PTR, 0, 0, 0, 0 } },
651 { SYS(getrlimit), 2, { ARG_RND, ARG_PTR_WR, 0, 0, 0, 0 } },
652 { SYS(getrlimit), 2, { ARG_INT, ARG_PTR_WR, 0, 0, 0, 0 } },
653 #endif
654 #if DEFSYS(getrusage)
655 { SYS(getrusage), 2, { ARG_RND, ARG_PTR, 0, 0, 0, 0 } },
656 { SYS(getrusage), 2, { ARG_INT, ARG_PTR, 0, 0, 0, 0 } },
657 { SYS(getrusage), 2, { ARG_RND, ARG_PTR_WR, 0, 0, 0, 0 } },
658 { SYS(getrusage), 2, { ARG_INT, ARG_PTR_WR, 0, 0, 0, 0 } },
659 #endif
660 #if DEFSYS(getsid)
661 { SYS(getsid), 1, { ARG_PID, 0, 0, 0, 0, 0 } },
662 #endif
663 #if DEFSYS(getsockname)
664 { SYS(getsockname), 3, { ARG_SOCKFD, ARG_PTR | ARG_STRUCT_SOCKADDR, ARG_PTR, 0, 0, 0 } },
665 { SYS(getsockname), 3, { ARG_SOCKFD, ARG_PTR | ARG_STRUCT_SOCKADDR, ARG_PTR_WR, 0, 0, 0 } },
666 #endif
667 #if DEFSYS(getsockopt)
668 { SYS(getsockopt), 5, { ARG_SOCKFD, ARG_INT, ARG_INT, ARG_PTR, ARG_PTR, 0 } },
669 { SYS(getsockopt), 5, { ARG_SOCKFD, ARG_INT, ARG_INT, ARG_PTR_WR, ARG_PTR, 0 } },
670 { SYS(getsockopt), 5, { ARG_SOCKFD, ARG_INT, ARG_INT, ARG_PTR, ARG_PTR_WR, 0 } },
671 { SYS(getsockopt), 5, { ARG_SOCKFD, ARG_INT, ARG_INT, ARG_PTR_WR, ARG_PTR_WR, 0 } },
672 #endif
673 #if DEFSYS(gettid)
674 /* { SYS(gettid), 0, { 0, 0, 0, 0, 0, 0 } }, */
675 #endif
676 #if DEFSYS(getuid)
677 /* { SYS(getuid), 0, { 0, 0, 0, 0, 0, 0 } }, */
678 #endif
679 #if DEFSYS(getuid32)
680 /* { SYS(getuid32), 0, { 0, 0, 0, 0, 0, 0 } }, */
681 #endif
682 #if DEFSYS(getunwind)
683 /* IA-64-specific, obsolete too */
684 { SYS(getunwind), 2, { ARG_PTR, ARG_LEN, 0, 0, 0, 0 } },
685 { SYS(getunwind), 2, { ARG_PTR_WR, ARG_LEN, 0, 0, 0, 0 } },
686 #endif
687 #if DEFSYS(gettimeofday)
688 { SYS(gettimeofday), 2, { ARG_NON_NULL_PTR, ARG_NON_NULL_PTR, 0, 0, 0, 0 } },
689 { SYS(gettimeofday), 2, { ARG_PTR_WR, ARG_NON_NULL_PTR, 0, 0, 0, 0 } },
690 { SYS(gettimeofday), 2, { ARG_NON_NULL_PTR, ARG_PTR_WR, 0, 0, 0, 0 } },
691 { SYS(gettimeofday), 2, { ARG_PTR_WR, ARG_PTR_WR, 0, 0, 0, 0 } },
692 #endif
693 #if DEFSYS(getxattr)
694 { SYS(getxattr), 4, { ARG_EMPTY_FILENAME, ARG_PTR, ARG_PTR, ARG_LEN, 0, 0 } },
695 { SYS(getxattr), 4, { ARG_DEVNULL_FILENAME, ARG_PTR, ARG_PTR, ARG_LEN, 0, 0 } },
696 { SYS(getxattr), 4, { ARG_EMPTY_FILENAME, ARG_PTR, ARG_PTR_WR, ARG_LEN, 0, 0 } },
697 { SYS(getxattr), 4, { ARG_DEVNULL_FILENAME, ARG_PTR, ARG_PTR_WR, ARG_LEN, 0, 0 } },
698 #endif
699 #if DEFSYS(getxgid)
700 /* Alpha only */
701 #endif
702 #if DEFSYS(getxpid)
703 /* Alpha only */
704 #endif
705 #if DEFSYS(getxuid)
706 /* Alpha only */
707 #endif
708 #if DEFSYS(init_module)
709 { SYS(init_module), 3, { ARG_PTR, ARG_LEN, ARG_PTR } },
710 #endif
711 #if DEFSYS(inotify_add_watch)
712 { SYS(inotify_add_watch), 3, { ARG_FD, ARG_EMPTY_FILENAME, ARG_UINT, 0, 0, 0 } },
713 { SYS(inotify_add_watch), 3, { ARG_FD, ARG_DEVNULL_FILENAME, ARG_UINT, 0, 0, 0 } },
714 #endif
715 #if DEFSYS(inotify_init)
716 /* { SYS(inotify_init), 0, { 0, 0, 0, 0, 0, 0 } }, */
717 #endif
718 #if DEFSYS(inotify_init1)
719 { SYS(inotify_init1), 3, { ARG_FLAG, 0, 0, 0, 0, 0 } },
720 #endif
721 #if DEFSYS(inotify_rm_watch)
722 { SYS(inotify_rm_watch), 2, { ARG_FD, ARG_INT, 0, 0, 0, 0 } },
723 #endif
724 #if DEFSYS(io_cancel)
725 { SYS(io_cancel), 3, { ARG_INT, ARG_PTR, ARG_PTR, 0, 0, 0 } },
726 #endif
727 #if DEFSYS(io_destroy)
728 { SYS(io_destroy), 1, { ARG_INT, 0, 0, 0, 0, 0 } },
729 #endif
730 #if DEFSYS(io_getevents)
731 { SYS(io_getevents), 5, { ARG_INT, ARG_INT, ARG_INT, ARG_PTR, ARG_PTR, 0 } },
732 #endif
733 #if DEFSYS(io_pgetevents)
734 /* TODO */
735 #endif
736 #if DEFSYS(io_setup)
737 { SYS(io_setup), 2, { ARG_UINT, ARG_PTR, 0, 0, 0, 0 } },
738 #endif
739 #if DEFSYS(io_submit)
740 { SYS(io_setup), 3, { ARG_UINT, ARG_INT, ARG_PTR, 0, 0, 0 } },
741 #endif
742 #if DEFSYS(io_uring_enter)
743 #endif
744 #if DEFSYS(io_uring_register)
745 #endif
746 #if DEFSYS(io_uring_setup)
747 #endif
748 #if DEFSYS(ioctl)
749 { SYS(ioctl), 4, { ARG_FD, ARG_UINT, ARG_PTR, ARG_PTR, 0, 0 } },
750 #endif
751 #if DEFSYS(ioperm)
752 { SYS(ioperm), 3, { ARG_UINT, ARG_UINT, ARG_INT, 0, 0, 0 } },
753 #endif
754 #if DEFSYS(iopl)
755 { SYS(iopl), 1, { ARG_INT, 0, 0, 0, 0, 0 } },
756 #endif
757 #if DEFSYS(ioprio_get)
758 { SYS(ioprio_get), 2, { ARG_INT, ARG_INT, 0, 0, 0, 0 } },
759 #endif
760 #if DEFSYS(ioprio_set)
761 { SYS(ioprio_set), 3, { ARG_INT, ARG_INT, ARG_INT, 0, 0, 0 } },
762 #endif
763 #if DEFSYS(ipc)
764 { SYS(ipc), 6, { ARG_UINT, ARG_INT, ARG_INT, ARG_INT, ARG_PTR, ARG_UINT } },
765 #endif
766 #if DEFSYS(kcmp)
767 { SYS(kcmp), 5, { ARG_PID, ARG_PID, ARG_INT, ARG_UINT, ARG_UINT, 0 } },
768 #endif
769 #if DEFSYS(kern_features)
770 /* SPARC64 only */
771 #endif
772 #if DEFSYS(kexec_file_load)
773 /* { SYS(kexec_file_load), 5, { ARG_FD, ARG_FD, ARG_UINT, ARG_PTR, ARG_FLAG, 0 } }, */
774 #endif
775 #if DEFSYS(kexec_load)
776 /* { SYS(kexec_load), 4, { ARG_UINT, ARG_UINT, ARG_PTR, ARG_FLAG, 0, 0 } }, */
777 #endif
778 #if DEFSYS(keyctl)
779 { SYS(keyctl), 6, { ARG_INT, ARG_UINT, ARG_UINT, ARG_UINT, ARG_UINT, ARG_UINT } },
780 #endif
781 #if DEFSYS(kill)
782 /* { SYS(kill), ARG_PID, ARG_INT, 0, 0, 0, 0 } }, */
783 #endif
784 #if DEFSYS(landlock_add_rule)
785 { SYS(landlock_create_ruleset), 4, { ARG_FD, ARG_INT, ARG_PTR, ARG_FLAG, 0, 0 } },
786 #endif
787 #if DEFSYS(landlock_create_ruleset)
788 { SYS(landlock_create_ruleset), 3, { ARG_PTR, ARG_LEN, ARG_FLAG, 0, 0, 0 } },
789 #endif
790 #if DEFSYS(landlock_restrict_self)
791 { SYS(landlock_restrict_self), 2, { ARG_FD, ARG_FLAG, 0, 0, 0, 0 } },
792 #endif
793 #if DEFSYS(lchown)
794 { SYS(lchown), 3, { ARG_EMPTY_FILENAME, ARG_INT, ARG_INT, 0, 0, 0 } },
795 #endif
796 #if DEFSYS(lchown32)
797 { SYS(lchown32), 3, { ARG_EMPTY_FILENAME, ARG_INT, ARG_INT, 0, 0, 0 } },
798 #endif
799 #if DEFSYS(link)
800 { SYS(link), 2, { ARG_EMPTY_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
801 #endif
802 #if DEFSYS(linkat)
803 { SYS(linkat), 5, { ARG_FD, ARG_EMPTY_FILENAME, ARG_FD, ARG_EMPTY_FILENAME, ARG_INT, 0 } },
804 #endif
805 #if DEFSYS(listen)
806 { SYS(listen), 2, { ARG_SOCKFD, ARG_INT, 0, 0, 0, 0 } },
807 #endif
808 #if DEFSYS(listxattr)
809 { SYS(listxattr), 3, { ARG_EMPTY_FILENAME, ARG_PTR, ARG_LEN, 0, 0, 0 } },
810 { SYS(listxattr), 3, { ARG_EMPTY_FILENAME, ARG_PTR_WR, ARG_LEN, 0, 0, 0 } },
811 { SYS(listxattr), 3, { ARG_DEVNULL_FILENAME, ARG_PTR, ARG_LEN, 0, 0, 0 } },
812 { SYS(listxattr), 3, { ARG_DEVNULL_FILENAME, ARG_PTR_WR, ARG_LEN, 0, 0, 0 } },
813 #endif
814 #if DEFSYS(llistxattr)
815 { SYS(llistxattr), 3, { ARG_EMPTY_FILENAME, ARG_PTR_WR, ARG_LEN, 0, 0, 0 } },
816 { SYS(llistxattr), 3, { ARG_EMPTY_FILENAME, ARG_PTR, ARG_LEN, 0, 0, 0 } },
817 { SYS(llistxattr), 3, { ARG_DEVNULL_FILENAME, ARG_PTR_WR, ARG_LEN, 0, 0, 0 } },
818 { SYS(llistxattr), 3, { ARG_DEVNULL_FILENAME, ARG_PTR, ARG_LEN, 0, 0, 0 } },
819 #endif
820 #if DEFSYS(lookup_dcookie)
821 { SYS(lookup_dcookie), 3, { ARG_UINT, ARG_PTR, ARG_LEN, 0, 0, 0 } },
822 { SYS(lookup_dcookie), 3, { ARG_UINT, ARG_PTR_WR, ARG_LEN, 0, 0, 0 } },
823 #endif
824 #if DEFSYS(lremovexattr)
825 { SYS(lremovexattr), 3, { ARG_EMPTY_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
826 #endif
827 #if DEFSYS(lseek)
828 { SYS(lseek), 3, { ARG_FD, ARG_UINT, ARG_INT, 0, 0, 0 } },
829 #endif
830 #if DEFSYS(lsetxattr)
831 { SYS(lsetxattr), 5, { ARG_EMPTY_FILENAME, ARG_PTR, ARG_PTR, ARG_LEN, ARG_INT, 0 } },
832 #endif
833 #if DEFSYS(lstat)
834 { SYS(lstat), 2, { ARG_EMPTY_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
835 { SYS(lstat), 2, { ARG_EMPTY_FILENAME, ARG_PTR_WR, 0, 0, 0, 0 } },
836 { SYS(lstat), 2, { ARG_DEVNULL_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
837 { SYS(lstat), 2, { ARG_DEVNULL_FILENAME, ARG_PTR_WR, 0, 0, 0, 0 } },
838 #endif
839 #if DEFSYS(lstat64)
840 { SYS(lstat64), 2, { ARG_EMPTY_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
841 { SYS(lstat64), 2, { ARG_EMPTY_FILENAME, ARG_PTR_WR, 0, 0, 0, 0 } },
842 { SYS(lstat64), 2, { ARG_DEVNULL_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
843 { SYS(lstat64), 2, { ARG_DEVNULL_FILENAME, ARG_PTR_WR, 0, 0, 0, 0 } },
844 #endif
845 #if DEFSYS(madvise)
846 { SYS(madvise), 3, { ARG_PTR, ARG_LEN, ARG_INT, 0, 0, 0 } },
847 #endif
848 #if DEFSYS(mbind)
849 { SYS(mbind), 6, { ARG_PTR, ARG_UINT, ARG_INT, ARG_PTR, ARG_UINT, ARG_UINT } },
850 #endif
851 #if DEFSYS(memory_ordering)
852 /* SPARC64 only */
853 #endif
854 #if DEFSYS(membarrier)
855 { SYS(membarrier), 2, { ARG_INT, ARG_FLAG, 0, 0, 0, 0 } },
856 #endif
857 #if DEFSYS(memfd_create)
858 { SYS(memfd_create), 2, { ARG_EMPTY_FILENAME, ARG_UINT, 0, 0, 0, 0 } },
859 #endif
860 #if DEFSYS(migrate_pages)
861 { SYS(migrate_pages), 4, { ARG_PID, ARG_UINT, ARG_PTR, ARG_PTR, 0, 0 } },
862 #endif
863 #if DEFSYS(mincore)
864 { SYS(mincore), 3, { ARG_PTR, ARG_LEN, ARG_PTR, 0, 0, 0 } },
865 { SYS(mincore), 3, { ARG_PTR, ARG_LEN, ARG_PTR_WR, 0, 0, 0 } },
866 #endif
867 #if DEFSYS(mkdir)
868 { SYS(mkdir), 2, { ARG_EMPTY_FILENAME, ARG_MODE, 0, 0, 0, 0 } },
869 #endif
870 #if DEFSYS(mkdirat)
871 { SYS(mkdirat), 3, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_MODE, 0, 0, 0 } },
872 #endif
873 #if DEFSYS(mknod)
874 { SYS(mknod), 3, { ARG_EMPTY_FILENAME, ARG_MODE, ARG_UINT, 0, 0, 0 } },
875 #endif
876 #if DEFSYS(mknodat)
877 { SYS(mknodat), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_MODE, ARG_UINT, 0, 0 } },
878 #endif
879 #if DEFSYS(mlock)
880 { SYS(mlock), 2, { ARG_PTR, ARG_LEN, 0, 0, 0, 0 } },
881 #endif
882 #if DEFSYS(mlock2)
883 { SYS(mlock2), 2, { ARG_PTR, ARG_LEN, ARG_FLAG, 0, 0, 0 } },
884 #endif
885 #if DEFSYS(mlockall)
886 { SYS(mlockall), 1, { ARG_FLAG, 0, 0, 0, 0, 0 } },
887 #endif
888 #if DEFSYS(mmap)
889 { SYS(mmap), 6, { ARG_PTR, ARG_LEN, ARG_INT, ARG_FLAG, ARG_FD, ARG_UINT } },
890 #endif
891 #if DEFSYS(mmap2)
892 { SYS(mmap2), 6, { ARG_PTR, ARG_LEN, ARG_INT, ARG_FLAG, ARG_FD, ARG_UINT } },
893 #endif
894 #if DEFSYS(mmap_pgoff)
895 { SYS(mmap_pgoff), 6, { ARG_PTR, ARG_LEN, ARG_INT, ARG_FLAG, ARG_FD, ARG_UINT } },
896 #endif
897 #if DEFSYS(modify_ldt)
898 { SYS(modify_ldt), 3, { ARG_INT, ARG_PTR, ARG_LEN, 0, 0, 0 } },
899 { SYS(modify_ldt), 3, { ARG_INT, ARG_PTR_WR, ARG_LEN, 0, 0, 0 } },
900 #endif
901 #if DEFSYS(mount)
902 { SYS(mount), 5, { ARG_EMPTY_FILENAME, ARG_EMPTY_FILENAME, ARG_PTR, ARG_UINT, ARG_UINT, 0 } },
903 #endif
904 #if DEFSYS(move_mount)
905 //{ SYS(move_mount), 1, { 0, 0, 0, 0, 0, 0 } },
906 #endif
907 #if DEFSYS(move_pages)
908 { SYS(move_pages), 6, { ARG_PID, ARG_UINT, ARG_PTR, ARG_PTR, ARG_PTR, ARG_FLAG } },
909 #endif
910 #if DEFSYS(mprotect)
911 { SYS(mprotect), 3, { ARG_PTR, ARG_LEN, ARG_UINT, 0, 0, 0 } },
912 #endif
913 #if DEFSYS(mq_close)
914 { SYS(mq_close), 1, { ARG_INT, 0, 0, 0, 0, 0 } },
915 #endif
916 #if DEFSYS(mq_getsetattr)
917 { SYS(mq_getsetattr), 3, { ARG_INT, ARG_PTR, ARG_PTR, 0, 0, 0 } },
918 #endif
919 #if DEFSYS(mq_notify)
920 { SYS(mq_notify), 2, { ARG_INT, ARG_PTR, 0, 0, 0, 0 } },
921 #endif
922 #if DEFSYS(mq_open)
923 { SYS(mq_open), 4, { ARG_EMPTY_FILENAME, ARG_FLAG, ARG_MODE, ARG_PTR, 0, 0 } },
924 { SYS(mq_open), 4, { ARG_DEVNULL_FILENAME, ARG_FLAG, ARG_MODE, ARG_PTR, 0, 0 } },
925 #endif
926 #if DEFSYS(mq_receive)
927 { SYS(mq_receive), 4, { ARG_INT, ARG_PTR, ARG_LEN, ARG_INT, 0, 0 } },
928 { SYS(mq_receive), 4, { ARG_INT, ARG_PTR_WR, ARG_LEN, ARG_INT, 0, 0 } },
929 #endif
930 #if DEFSYS(mq_send)
931 { SYS(mq_send), 4, { ARG_INT, ARG_PTR, ARG_LEN, ARG_UINT, 0, 0 } },
932 #endif
933 #if DEFSYS(mq_timedreceive)
934 { SYS(mq_timedreceive), 4, { ARG_INT, ARG_PTR_WR, ARG_LEN, ARG_PTR, 0, 0 } },
935 #endif
936 #if DEFSYS(mq_timedsend)
937 { SYS(mq_timedsend), 4, { ARG_INT, ARG_PTR, ARG_LEN, ARG_INT, 0, 0 } },
938 #endif
939 #if DEFSYS(mq_unlink)
940 { SYS(mq_unlink), 1, { ARG_EMPTY_FILENAME, 0, 0, 0, 0, 0 } },
941 #endif
942 #if DEFSYS(mremap)
943 { SYS(mremap), 5, { ARG_PTR, ARG_LEN, ARG_PTR, ARG_LEN, ARG_FLAG, ARG_PTR } },
944 #endif
945 #if DEFSYS(msgctl)
946 { SYS(msgctl), 3, { ARG_INT, ARG_INT, ARG_PTR, 0, 0, 0 } },
947 #endif
948 #if DEFSYS(msgget)
949 { SYS(msgget), 2, { ARG_INT, ARG_INT, 0, 0, 0, 0 } },
950 #endif
951 #if DEFSYS(msgrcv)
952 { SYS(msgrcv), 5, { ARG_INT, ARG_PTR, ARG_LEN, ARG_INT, ARG_INT, 0 } },
953 { SYS(msgrcv), 5, { ARG_INT, ARG_PTR_WR, ARG_LEN, ARG_INT, ARG_INT, 0 } },
954 #endif
955 #if DEFSYS(msgsnd)
956 { SYS(msgsnd), 4, { ARG_INT, ARG_PTR, ARG_LEN, ARG_INT, 0, 0 } },
957 #endif
958 #if DEFSYS(msync)
959 { SYS(msync), 3, { ARG_PTR, ARG_LEN, ARG_FLAG, 0, 0, 0 } },
960 #endif
961 #if DEFSYS(munlock)
962 { SYS(munlock), 2, { ARG_PTR, ARG_LEN, 0, 0, 0, 0 } },
963 #endif
964 #if DEFSYS(munlockall)
965 { SYS(munlockall), 1, { ARG_INT, 0, 0, 0, 0, 0 } },
966 #endif
967 #if DEFSYS(munmap)
968 //{ SYS(munmap), 2, { ARG_PTR, ARG_LEN, 0, 0, 0, 0 } },
969 #endif
970 #if DEFSYS(name_to_handle_at)
971 { SYS(name_to_handle_at), 5, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_PTR, ARG_PTR, ARG_FLAG } },
972 { SYS(name_to_handle_at), 5, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_PTR_WR, ARG_PTR, ARG_FLAG } },
973 #endif
974 #if DEFSYS(nanosleep)
975 { SYS(nanosleep), 2, { ARG_PTR, ARG_PTR, 0, 0, 0, 0 } },
976 #endif
977 #if DEFSYS(newfstatat)
978 /* TODO */
979 #endif
980 #if DEFSYS(nfsservctl)
981 { SYS(nfsservctl), 3, { ARG_INT, ARG_PTR, ARG_PTR, 0, 0, 0 } },
982 { SYS(nfsservctl), 3, { ARG_INT, ARG_PTR, ARG_PTR_WR, 0, 0, 0 } },
983 #endif
984 #if DEFSYS(nice)
985 { SYS(nice), 1, { ARG_INT, 0, 0, 0, 0, 0 } },
986 #endif
987 #if DEFSYS(old_adjtimex)
988 /* TODO */
989 #endif
990 #if DEFSYS(old_getrlimit)
991 /* TODO */
992 #endif
993 #if DEFSYS(oldolduname)
994 /* TODO */
995 #endif
996 #if DEFSYS(oldstat)
997 /* TODO */
998 #endif
999 #if DEFSYS(oldumount)
1000 /* TODO */
1001 #endif
1002 #if DEFSYS(olduname)
1003 /* TODO */
1004 #endif
1005 #if DEFSYS(open)
1006 { SYS(open), 3, { ARG_EMPTY_FILENAME, ARG_FLAG, ARG_MODE, 0, 0, 0 } },
1007 #endif
1008 #if DEFSYS(open_by_handle_at)
1009 { SYS(open_by_handle_at), 3, { ARG_FD, ARG_PTR, ARG_FLAG, 0, 0, 0 } },
1010 #endif
1011 #if DEFSYS(open_tree)
1012 //{ SYS(open_tree), 1, { 0, 0, 0, 0, 0, 0 } },
1013 #endif
1014 #if DEFSYS(openat)
1015 { SYS(openat), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_FLAG, ARG_MODE, 0, 0 } },
1016 #endif
1017 #if DEFSYS(openat2)
1018 { SYS(openat2), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_PTR, ARG_LEN, 0, 0 } },
1019 #endif
1020 #if DEFSYS(or1k_atomic)
1021 /* OpenRISC 1000 only */
1022 #endif
1023 #if DEFSYS(pause)
1024 /* { SYS(pause), 0, { 0, 0, 0, 0, 0, 0 } }, */
1025 #endif
1026 #if DEFSYS(pciconfig_iobase)
1027 /* { SYS(pciconfig_iobase), 3, { ARG_UINT, ARG_UINT, ARG_UINT, 0, 0, 0 } }, */
1028 #endif
1029 #if DEFSYS(pciconfig_read)
1030 /* { SYS(pciconfig_read), 3, { ARG_UINT, ARG_UINT, ARG_UINT, ARG_LEN, ARG_PTR, 0 } }, */
1031 #endif
1032 #if DEFSYS(pciconfig_write)
1033 /* { SYS(pciconfig_write), 3, { ARG_UINT, ARG_UINT, ARG_UINT, ARG_LEN, ARG_PTR, 0 } }, */
1034 #endif
1035 #if DEFSYS(perf_event_open)
1036 { SYS(perf_event_open), 5, { ARG_PTR, ARG_PID, ARG_INT, ARG_INT, ARG_FLAG, 0 } },
1037 #endif
1038 #if DEFSYS(personality)
1039 { SYS(personality), 1, { ARG_UINT, 0, 0, 0, 0, 0 } },
1040 #endif
1041 #if DEFSYS(pidfd_getfd)
1042 { SYS(pidfd_getfd), 3, { ARG_INT, ARG_INT, ARG_FLAG, 0, 0, 0 } },
1043 #endif
1044 #if DEFSYS(pidfd_open)
1045 { SYS(pidfd_open), 2, { ARG_PID, ARG_FLAG, 0, 0, 0, 0 } },
1046 #endif
1047 #if DEFSYS(pidfd_send_signal)
1048 { SYS(pidfd_send_signal), 4, { ARG_INT, ARG_INT, ARG_PTR, ARG_FLAG, 0, 0 } },
1049 #endif
1050 #if DEFSYS(pipe)
1051 { SYS(pipe), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1052 { SYS(pipe), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1053 #endif
1054 #if DEFSYS(pipe2)
1055 { SYS(pipe2), 2, { ARG_PTR, ARG_FLAG, 0, 0, 0, 0 } },
1056 #endif
1057 #if DEFSYS(pivot_root)
1058 { SYS(pivot_root), 2, { ARG_EMPTY_FILENAME, ARG_EMPTY_FILENAME, 0, 0, 0, 0 } },
1059 { SYS(pivot_root), 2, { ARG_DEVNULL_FILENAME, ARG_EMPTY_FILENAME, 0, 0, 0, 0 } },
1060 { SYS(pivot_root), 2, { ARG_EMPTY_FILENAME, ARG_DEVNULL_FILENAME, 0, 0, 0, 0 } },
1061 { SYS(pivot_root), 2, { ARG_DEVNULL_FILENAME, ARG_DEVNULL_FILENAME, 0, 0, 0, 0 } },
1062 #endif
1063 #if DEFSYS(pkey_alloc)
1064 { SYS(pkey_alloc), 2, { ARG_FLAG, ARG_UINT, 0, 0, 0, 0 } },
1065 #endif
1066 #if DEFSYS(pkey_free)
1067 { SYS(pkey_free), 1, { ARG_INT, 0, 0, 0, 0, 0 } },
1068 #endif
1069 #if DEFSYS(pkey_get)
1070 { SYS(pkey_get), 1, { ARG_INT, 0, 0, 0, 0, 0 } },
1071 #endif
1072 #if DEFSYS(pkey_mprotect)
1073 { SYS(pkey_mprotect), 3, { ARG_PTR, ARG_LEN, ARG_INT, 0, 0, 0 } },
1074 #endif
1075 #if DEFSYS(pkey_set)
1076 { SYS(pkey_set), 2, { ARG_INT, ARG_INT, 0, 0, 0, 0 } },
1077 #endif
1078 #if DEFSYS(poll)
1079 { SYS(poll), 3, { ARG_PTR, ARG_INT, ARG_INT, 0, 0, 0 } },
1080 #endif
1081 #if DEFSYS(ppoll)
1082 { SYS(ppoll), 4, { ARG_PTR, ARG_INT, ARG_PTR, ARG_PTR, 0, 0 } },
1083 #endif
1084 #if DEFSYS(prctl)
1085 { SYS(prctl), 5, { ARG_INT, ARG_UINT, ARG_UINT, ARG_UINT, ARG_UINT, 0 } },
1086 #endif
1087 #if DEFSYS(pread)
1088 { SYS(pread), 4, { ARG_FD, ARG_PTR, ARG_LEN, ARG_UINT, 0, 0 } },
1089 { SYS(pread), 4, { ARG_FD, ARG_PTR_WR, ARG_LEN, ARG_UINT, 0, 0 } },
1090 #endif
1091 #if DEFSYS(pread64)
1092 { SYS(pread64), 4, { ARG_FD, ARG_PTR, ARG_LEN, ARG_UINT, 0, 0 } },
1093 { SYS(pread64), 4, { ARG_FD, ARG_PTR_WR, ARG_LEN, ARG_UINT, 0, 0 } },
1094 #endif
1095 #if DEFSYS(preadv)
1096 { SYS(preadv), 4, { ARG_FD, ARG_PTR, ARG_INT, ARG_UINT, 0, 0 } },
1097 { SYS(preadv), 4, { ARG_FD, ARG_PTR_WR, ARG_INT, ARG_UINT, 0, 0 } },
1098 #endif
1099 #if DEFSYS(preadv2)
1100 { SYS(preadv2), 4, { ARG_FD, ARG_PTR, ARG_INT, ARG_UINT, ARG_FLAG, 0 } },
1101 { SYS(preadv2), 4, { ARG_FD, ARG_PTR_WR, ARG_INT, ARG_UINT, ARG_FLAG, 0 } },
1102 #endif
1103 #if DEFSYS(prlimit)
1104 { SYS(prlimit), 2, { ARG_INT, ARG_PTR, ARG_PTR, 0, 0, 0 } },
1105 { SYS(prlimit), 2, { ARG_INT, ARG_PTR_WR, ARG_PTR, 0, 0, 0 } },
1106 { SYS(prlimit), 2, { ARG_INT, ARG_PTR, ARG_PTR_WR, 0, 0, 0 } },
1107 { SYS(prlimit), 2, { ARG_INT, ARG_PTR_WR, ARG_PTR_WR, 0, 0, 0 } },
1108 #endif
1109 #if DEFSYS(prlimit64)
1110 { SYS(prlimit64), 2, { ARG_INT, ARG_PTR, ARG_PTR, 0, 0, 0 } },
1111 { SYS(prlimit64), 2, { ARG_INT, ARG_PTR_WR, ARG_PTR, 0, 0, 0 } },
1112 { SYS(prlimit64), 2, { ARG_INT, ARG_PTR, ARG_PTR_WR, 0, 0, 0 } },
1113 { SYS(prlimit64), 2, { ARG_INT, ARG_PTR_WR, ARG_PTR_WR, 0, 0, 0 } },
1114 #endif
1115 #if DEFSYS(process_madvise)
1116 { SYS(process_madvise), 6, { ARG_INT, ARG_PID, ARG_PTR, ARG_LEN, ARG_INT, ARG_FLAG } },
1117 #endif
1118 #if DEFSYS(process_vm_readv)
1119 { SYS(process_vm_readv), 6, { ARG_PID, ARG_PTR, ARG_UINT, ARG_PTR, ARG_UINT, ARG_UINT } },
1120 { SYS(process_vm_readv), 6, { ARG_PID, ARG_PTR, ARG_UINT, ARG_PTR_WR, ARG_UINT, ARG_UINT } },
1121 #endif
1122 #if DEFSYS(process_vm_writev)
1123 { SYS(process_vm_writev), 6, { ARG_PID, ARG_PTR, ARG_UINT, ARG_PTR, ARG_UINT, ARG_UINT } },
1124 #endif
1125 #if DEFSYS(pselect)
1126 { SYS(pselect), 6, { ARG_INT, ARG_PTR, ARG_PTR, ARG_PTR, ARG_PTR, ARG_PTR } },
1127 #endif
1128 #if DEFSYS(ptrace)
1129 { SYS(ptrace), 4, { ARG_INT, ARG_PID, ARG_PTR, ARG_PTR, 0, 0 } },
1130 #endif
1131 #if DEFSYS(pwrite)
1132 { SYS(pwrite), 4, { ARG_FD, ARG_PTR, ARG_LEN, ARG_UINT, 0, 0 } },
1133 #endif
1134 #if DEFSYS(pwritev)
1135 { SYS(pwritev), 4, { ARG_FD, ARG_PTR, ARG_INT, ARG_UINT, 0, 0 } },
1136 #endif
1137 #if DEFSYS(pwritev2)
1138 { SYS(pwritev2), 4, { ARG_FD, ARG_PTR, ARG_INT, ARG_UINT, ARG_FLAG, 0 } },
1139 #endif
1140 #if DEFSYS(query_module)
1141 { SYS(query_module), 5, { ARG_PTR, ARG_INT, ARG_PTR, ARG_LEN, ARG_PTR, 0 } },
1142 { SYS(query_module), 5, { ARG_PTR, ARG_INT, ARG_PTR_WR, ARG_LEN, ARG_PTR, 0 } },
1143 { SYS(query_module), 5, { ARG_PTR, ARG_INT, ARG_PTR, ARG_LEN, ARG_PTR_WR, 0 } },
1144 { SYS(query_module), 5, { ARG_PTR, ARG_INT, ARG_PTR_WR, ARG_LEN, ARG_PTR, 0 } },
1145 #endif
1146 #if DEFSYS(quotactl)
1147 { SYS(quotactl), 4, { ARG_INT, ARG_PTR, ARG_INT, ARG_PTR, 0, 0 } },
1148 #endif
1149 #if DEFSYS(quotactl_fd)
1150 { SYS(quotactl_fd), 4, { ARG_INT, ARG_INT, ARG_INT, ARG_PTR, 0, 0 } },
1151 #endif
1152 #if DEFSYS(read)
1153 { SYS(read), 3, { ARG_FD, ARG_PTR, ARG_LEN, 0, 0, 0 } },
1154 { SYS(read), 3, { ARG_FD, ARG_PTR_WR, ARG_LEN, 0, 0, 0 } },
1155 #endif
1156 #if DEFSYS(readahead)
1157 { SYS(readahead), 3, { ARG_FD, ARG_UINT, ARG_LEN, 0, 0, 0 } },
1158 #endif
1159 #if DEFSYS(readdir)
1160 { SYS(readdir), 3, { ARG_FD, ARG_PTR, ARG_LEN, 0, 0, 0 } },
1161 { SYS(readdir), 3, { ARG_FD, ARG_PTR_WR, ARG_LEN, 0, 0, 0 } },
1162 #endif
1163 #if DEFSYS(readlink)
1164 { SYS(readlink), 3, { ARG_EMPTY_FILENAME, ARG_PTR, ARG_LEN, 0, 0, 0 } },
1165 { SYS(readlink), 3, { ARG_EMPTY_FILENAME, ARG_PTR_WR, ARG_LEN, 0, 0, 0 } },
1166 { SYS(readlink), 3, { ARG_DEVNULL_FILENAME, ARG_PTR, ARG_LEN, 0, 0, 0 } },
1167 { SYS(readlink), 3, { ARG_DEVNULL_FILENAME, ARG_PTR_WR, ARG_LEN, 0, 0, 0 } },
1168 #endif
1169 #if DEFSYS(readlinkat)
1170 { SYS(readlinkat), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_PTR, ARG_LEN, 0, 0 } },
1171 { SYS(readlinkat), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_PTR_WR, ARG_LEN, 0, 0 } },
1172 { SYS(readlinkat), 4, { ARG_DIRFD, ARG_DEVNULL_FILENAME, ARG_PTR, ARG_LEN, 0, 0 } },
1173 { SYS(readlinkat), 4, { ARG_DIRFD, ARG_DEVNULL_FILENAME, ARG_PTR_WR, ARG_LEN, 0, 0 } },
1174 #endif
1175 #if DEFSYS(readv)
1176 { SYS(readv), 3, { ARG_FD, ARG_PTR, ARG_INT, 0, 0, 0 } },
1177 { SYS(readv), 3, { ARG_FD, ARG_PTR_WR, ARG_INT, 0, 0, 0 } },
1178 #endif
1179 #if DEFSYS(reboot)
1180 // { SYS(reboot), 3, { ARG_INT, ARG_INT, ARG_PTR, 0, 0, 0 } },
1181 #endif
1182 #if DEFSYS(recv)
1183 { SYS(recv), 4, { ARG_SOCKFD, ARG_PTR, ARG_LEN, ARG_FLAG, 0, 0 } },
1184 { SYS(recv), 4, { ARG_SOCKFD, ARG_PTR_WR, ARG_LEN, ARG_FLAG, 0, 0 } },
1185 #endif
1186 #if DEFSYS(recvfrom)
1187 { SYS(recvfrom), 6, { ARG_SOCKFD, ARG_PTR, ARG_LEN, ARG_FLAG, ARG_PTR, ARG_PTR } },
1188 { SYS(recvfrom), 6, { ARG_SOCKFD, ARG_PTR, ARG_LEN, ARG_FLAG, ARG_PTR, ARG_PTR } },
1189 #endif
1190 #if DEFSYS(recvmsg)
1191 { SYS(recvmsg), 3, { ARG_SOCKFD, ARG_PTR, ARG_FLAG, 0, 0, 0 } },
1192 { SYS(recvmsg), 3, { ARG_SOCKFD, ARG_PTR_WR, ARG_FLAG, 0, 0, 0 } },
1193 #endif
1194 #if DEFSYS(recvmmsg)
1195 { SYS(recvmmsg), 5, { ARG_SOCKFD, ARG_PTR, ARG_LEN, ARG_FLAG, ARG_PTR, 0 } },
1196 { SYS(recvmmsg), 5, { ARG_SOCKFD, ARG_PTR_WR, ARG_LEN, ARG_FLAG, ARG_PTR, 0 } },
1197 #endif
1198 #if DEFSYS(remap_file_pages)
1199 { SYS(remap_file_pages), 5, { ARG_PTR, ARG_LEN, ARG_INT, ARG_UINT, ARG_FLAG, 0 } },
1200 #endif
1201 #if DEFSYS(removexattr)
1202 { SYS(removexattr), 2, { ARG_EMPTY_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
1203 #endif
1204 #if DEFSYS(rename)
1205 { SYS(rename), 2, { ARG_EMPTY_FILENAME, ARG_EMPTY_FILENAME, 0, 0, 0, 0 } },
1206 #endif
1207 #if DEFSYS(renameat)
1208 { SYS(renameat), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_DIRFD, ARG_EMPTY_FILENAME, 0, 0 } },
1209 #endif
1210 #if DEFSYS(renameat2)
1211 { SYS(renameat2), 5, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_FLAG, 0 } },
1212 #endif
1213 #if DEFSYS(request_key)
1214 { SYS(request_key), 4, { ARG_PTR, ARG_PTR, ARG_PTR, ARG_INT, 0, 0 } },
1215 #endif
1216 #if DEFSYS(riscv_flush_icache)
1217 { SYS(riscv_flush_icache), 3, { ARG_PTR, ARG_PTR, ARG_INT, 0, 0, 0 } },
1218 #endif
1219 #if DEFSYS(rmdir)
1220 //{ SYS(rmdir), 1, { ARG_EMPTY_FILENAME, 0, 0, 0, 0, 0 } },
1221 #endif
1222 #if DEFSYS(rseq)
1223 { SYS(rseq), 4, { ARG_PTR, ARG_LEN, ARG_FLAG, ARG_UINT, 0, 0 } },
1224 #endif
1225 #if DEFSYS(sigaction)
1226 { SYS(sigaction), 3, { ARG_INT, ARG_PTR, ARG_PTR, 0, 0, 0 } },
1227 #endif
1228 #if DEFSYS(rt_sigaction)
1229 { SYS(rt_sigaction), 3, { ARG_INT, ARG_PTR, ARG_PTR, 0, 0, 0 } },
1230 #endif
1231 #if DEFSYS(rt_sigpending)
1232 { SYS(rt_sigpending), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1233 #endif
1234 #if DEFSYS(rt_sigprocmask)
1235 { SYS(rt_sigprocmask), 4, { ARG_INT, ARG_PTR, ARG_PTR, ARG_LEN, 0, 0 } },
1236 #endif
1237 #if DEFSYS(rt_sigqueueinfo)
1238 { SYS(rt_sigqueueinfo), 3, { ARG_PID, ARG_INT, ARG_PTR, 0, 0, 0 } },
1239 #endif
1240 #if DEFSYS(rt_sigreturn)
1241 //{ SYS(rt_sigreturn), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1242 #endif
1243 #if DEFSYS(rt_sigsuspend)
1244 { SYS(rt_sigsuspend), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1245 #endif
1246 #if DEFSYS(rt_sigtimedwait)
1247 { SYS(rt_sigtimedwait), 3, { ARG_PTR, ARG_PTR, ARG_PTR, 0, 0, 0 } },
1248 #endif
1249 #if DEFSYS(rt_tgsigqueueinfo)
1250 { SYS(rt_tgsigqueueinfo), 4, { ARG_PID, ARG_PID, ARG_INT, ARG_PTR, 0, 0 } },
1251 #endif
1252 #if DEFSYS(rtas)
1253 /* TODO s390x */
1254 #endif
1255 #if DEFSYS(s390_runtime_instr)
1256 { SYS(s390_runtime_instr), 2, { ARG_INT, ARG_INT, 0, 0, 0, 0 } },
1257 #endif
1258 #if DEFSYS(s390_pci_mmio_read)
1259 /* { SYS(s390_pci_mmio_read), 3, { ARG_UINT, ARG_PTR, ARG_LEN, 0, 0, 0 } }, */
1260 #endif
1261 #if DEFSYS(s390_pci_mmio_write)
1262 /* { SYS(s390_pci_mmio_write), 3, { ARG_UINT, ARG_PTR, ARG_LEN, 0, 0, 0 } }, */
1263 #endif
1264 #if DEFSYS(s390_sthyi)
1265 { SYS(s390_sthyi), 4, { ARG_UINT, ARG_PTR, ARG_PTR, ARG_FLAG, 0, 0 } },
1266 #endif
1267 #if DEFSYS(s390_guarded_storage)
1268 { SYS(s390_guarded_storage), 4, { ARG_INT, ARG_PTR, 0, 0, 0, 0 } },
1269 #endif
1270 #if DEFSYS(sched_get_priority_max)
1271 { SYS(sched_get_priority_max), 1, { ARG_INT, 0, 0, 0, 0, 0 } },
1272 #endif
1273 #if DEFSYS(sched_get_priority_min)
1274 { SYS(sched_get_priority_min), 1, { ARG_INT, 0, 0, 0, 0, 0 } },
1275 #endif
1276 #if DEFSYS(sched_getaffinity)
1277 { SYS(sched_getaffinity), 3, { ARG_PID, ARG_LEN, ARG_PTR, 0, 0, 0 } },
1278 { SYS(sched_getaffinity), 3, { ARG_PID, ARG_LEN, ARG_PTR_WR, 0, 0, 0 } },
1279 #endif
1280 #if DEFSYS(sched_getattr)
1281 { SYS(sched_getattr), 3, { ARG_PID, ARG_PTR, ARG_FLAG, 0, 0, 0 } },
1282 { SYS(sched_getattr), 3, { ARG_PID, ARG_PTR_WR, ARG_FLAG, 0, 0, 0 } },
1283 #endif
1284 #if DEFSYS(sched_getparam)
1285 { SYS(sched_getparam), 2, { ARG_PID, ARG_PTR, 0, 0, 0, 0 } },
1286 { SYS(sched_getparam), 2, { ARG_PID, ARG_PTR_WR, 0, 0, 0, 0 } },
1287 #endif
1288 #if DEFSYS(sched_getscheduler)
1289 { SYS(sched_getscheduler), 1, { ARG_PID, 0, 0, 0, 0, 0 } },
1290 #endif
1291 #if DEFSYS(sched_get_rr_interval)
1292 { SYS(sched_get_rr_interval), 2, { ARG_PID, ARG_PTR, 0, 0, 0, 0 } },
1293 { SYS(sched_get_rr_interval), 2, { ARG_PID, ARG_PTR_WR, 0, 0, 0, 0 } },
1294 #endif
1295 #if DEFSYS(sched_set_affinity)
1296 /* SPARC & SPARC64 */
1297 { SYS(sched_set_affinity), 3, { ARG_PID, ARG_LEN, ARG_PTR, 0, 0, 0 } },
1298 #endif
1299 #if DEFSYS(sched_setaffinity)
1300 { SYS(sched_setaffinity), 3, { ARG_PID, ARG_LEN, ARG_PTR, 0, 0, 0 } },
1301 #endif
1302 #if DEFSYS(sched_setattr)
1303 { SYS(sched_setattr), 3, { ARG_PID, ARG_PTR, ARG_FLAG, 0, 0, 0 } },
1304 #endif
1305 #if DEFSYS(sched_setparam)
1306 { SYS(sched_setparam), 2, { ARG_PID, ARG_PTR, 0, 0, 0, 0 } },
1307 #endif
1308 #if DEFSYS(sched_yield)
1309 //{ SYS(sched_yield), 0, { 0, 0, 0, 0, 0, 0 } },
1310 #endif
1311 #if DEFSYS(seccomp)
1312 { SYS(seccomp), 3, { ARG_UINT, ARG_FLAG, ARG_PTR, 0, 0, 0 } },
1313 #endif
1314 #if DEFSYS(select)
1315 { SYS(select), 5, { ARG_FD, ARG_PTR, ARG_PTR, ARG_PTR, ARG_PTR, 0 } },
1316 #endif
1317 #if DEFSYS(semctl)
1318 { SYS(semctl), 6, { ARG_INT, ARG_INT, ARG_INT, ARG_PTR, ARG_PTR, ARG_PTR } },
1319 #endif
1320 #if DEFSYS(semget)
1321 { SYS(semget), 3, { ARG_INT, ARG_INT, ARG_FLAG, 0, 0, 0 } },
1322 #endif
1323 #if DEFSYS(semop)
1324 { SYS(semop), 3, { ARG_INT, ARG_PTR, ARG_LEN, 0, 0, 0 } },
1325 #endif
1326 #if DEFSYS(semtimedop)
1327 { SYS(semtimedop), 4, { ARG_INT, ARG_PTR, ARG_LEN, ARG_PTR, 0, 0 } },
1328 #endif
1329 /*
1330 * The following are not system calls, ignored for now
1331 */
1332 #if 0
1333 #if DEFSYS(sem_destroy)
1334 { SYS(sem_destroy), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1335 #endif
1336 #if DEFSYS(sem_init)
1337 { SYS(sem_init), 3, { ARG_PTR, ARG_INT, ARG_INT, 0, 0, 0 } },
1338 #endif
1339 #if DEFSYS(sem_post)
1340 { SYS(sem_post), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1341 #endif
1342 #if DEFSYS(sem_wait)
1343 { SYS(sem_wait), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1344 #endif
1345 #if DEFSYS(sem_trywait)
1346 { SYS(sem_trywait), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1347 #endif
1348 #if DEFSYS(sem_timedwait)
1349 { SYS(sem_timedwait), 2, { ARG_PTR, ARG_PTR, 0, 0, 0, 0 } },
1350 #endif
1351 #endif
1352 #if DEFSYS(send)
1353 { SYS(send), 4, { ARG_SOCKFD, ARG_PTR, ARG_LEN, ARG_FLAG, 0, 0 } },
1354 #endif
1355 #if DEFSYS(sendfile)
1356 { SYS(sendfile), 4, { ARG_FD, ARG_FD, ARG_UINT, ARG_LEN, 0, 0 } },
1357 #endif
1358 #if DEFSYS(sendfile64)
1359 { SYS(sendfile64), 4, { ARG_FD, ARG_FD, ARG_UINT, ARG_LEN, 0, 0 } },
1360 #endif
1361 #if DEFSYS(sendmmsg)
1362 { SYS(sendmmsg), 4, { ARG_SOCKFD, ARG_PTR, ARG_INT, ARG_FLAG, 0, 0 } },
1363 #endif
1364 #if DEFSYS(sendmsg)
1365 { SYS(sendmsg), 3, { ARG_SOCKFD, ARG_PTR, ARG_FLAG, 0, 0, 0 } },
1366 #endif
1367 #if DEFSYS(sendto)
1368 { SYS(sendto), 6, { ARG_SOCKFD, ARG_PTR, ARG_LEN, ARG_FLAG, ARG_PTR, ARG_LEN } },
1369 #endif
1370 #if DEFSYS(set_mempolicy)
1371 { SYS(set_mempolicy), 3, { ARG_INT, ARG_PTR, ARG_UINT, 0, 0, 0 } },
1372 #endif
1373 #if DEFSYS(set_robust_list)
1374 { SYS(set_robust_list), 2, { ARG_PTR, ARG_LEN, 0, 0, 0, 0 } },
1375 #endif
1376 #if DEFSYS(set_thread_area)
1377 { SYS(set_thread_area), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1378 #endif
1379 #if DEFSYS(set_tid_address)
1380 { SYS(set_tid_address), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1381 #endif
1382 #if DEFSYS(setdomainname)
1383 //{ SYS(setdomainname), 2, { ARG_PTR, ARG_LEN, 0, 0, 0, 0 } },
1384 #endif
1385 #if DEFSYS(setfsgid)
1386 { SYS(setfsgid), 1, { ARG_GID, 0, 0, 0, 0, 0 } },
1387 #endif
1388 #if DEFSYS(setfsgid32)
1389 { SYS(setfsgid32), 1, { ARG_GID, 0, 0, 0, 0, 0 } },
1390 #endif
1391 #if DEFSYS(setfsuid)
1392 { SYS(setfsuid), 1, { ARG_GID, 0, 0, 0, 0, 0 } },
1393 #endif
1394 #if DEFSYS(setfsuid32)
1395 { SYS(setfsuid32), 1, { ARG_GID, 0, 0, 0, 0, 0 } },
1396 #endif
1397 #if DEFSYS(setgid)
1398 { SYS(setgid), 1, { ARG_GID, 0, 0, 0, 0, 0 } },
1399 #endif
1400 #if DEFSYS(setgid32)
1401 { SYS(setgid32), 1, { ARG_GID, 0, 0, 0, 0, 0 } },
1402 #endif
1403 #if DEFSYS(setgroups)
1404 { SYS(setgroups), 2, { ARG_LEN, ARG_PTR, 0, 0, 0, 0 } },
1405 #endif
1406 #if DEFSYS(setgroups32)
1407 { SYS(setgroups32), 2, { ARG_LEN, ARG_PTR, 0, 0, 0, 0 } },
1408 #endif
1409 #if DEFSYS(sethae)
1410 /* ALPHA only */
1411 #endif
1412 #if DEFSYS(sethostname)
1413 { SYS(sethostname), 2, { ARG_PTR, ARG_LEN, 0, 0, 0, 0 } },
1414 #endif
1415 #if DEFSYS(setitimer)
1416 { SYS(setitimer), 3, { ARG_INT, ARG_NON_NULL_PTR, ARG_NON_NULL_PTR, 0, 0, 0 } },
1417 #endif
1418 #if DEFSYS(setmntent)
1419 { SYS(setmntent), 2, { ARG_EMPTY_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
1420 #endif
1421 #if DEFSYS(setns)
1422 { SYS(setns), 2, { ARG_FD, ARG_INT, 0, 0, 0, 0 } },
1423 #endif
1424 #if DEFSYS(setpgid)
1425 { SYS(setpgid), 2, { ARG_PID, ARG_PID, 0, 0, 0, 0 } },
1426 #endif
1427 #if DEFSYS(setpgrp)
1428 /* ALPHA, alternative to setpgid */
1429 { SYS(setpgrp), 2, { ARG_PID, ARG_PID, 0, 0, 0, 0 } },
1430 #endif
1431 #if DEFSYS(setpriority)
1432 { SYS(setpriority), 3, { ARG_INT, ARG_INT, ARG_INT, 0, 0, 0 } },
1433 #endif
1434 #if DEFSYS(setregid)
1435 { SYS(setregid), 2, { ARG_GID, ARG_GID, 0, 0, 0, 0 } },
1436 #endif
1437 #if DEFSYS(setregid32)
1438 { SYS(setregid32), 2, { ARG_GID, ARG_GID, 0, 0, 0, 0 } },
1439 #endif
1440 #if DEFSYS(setresgid)
1441 { SYS(setresgid), 3, { ARG_GID, ARG_GID, ARG_GID, 0, 0, 0 } },
1442 #endif
1443 #if DEFSYS(setresgid32)
1444 { SYS(setresgid32), 3, { ARG_GID, ARG_GID, ARG_GID, 0, 0, 0 } },
1445 #endif
1446 #if DEFSYS(setresuid)
1447 { SYS(setresuid), 3, { ARG_UID, ARG_UID, ARG_UID, 0, 0, 0 } },
1448 #endif
1449 #if DEFSYS(setresuid32)
1450 { SYS(setresuid32), 3, { ARG_UID, ARG_UID, ARG_UID, 0, 0, 0 } },
1451 #endif
1452 #if DEFSYS(setreuid)
1453 { SYS(setreuid), 2, { ARG_UID, ARG_UID, 0, 0, 0, 0 } },
1454 #endif
1455 #if DEFSYS(setreuid32)
1456 { SYS(setreuid32), 2, { ARG_UID, ARG_UID, 0, 0, 0, 0 } },
1457 #endif
1458 #if DEFSYS(setrlimit)
1459 { SYS(setrlimit), 2, { ARG_INT, ARG_PTR, 0, 0, 0, 0 } },
1460 #endif
1461 #if DEFSYS(setsid)
1462 //{ SYS(setsid), 0, { 0, 0, 0, 0, 0, 0 } },
1463 #endif
1464 #if DEFSYS(setsockopt)
1465 { SYS(setsockopt), 5, { ARG_SOCKFD, ARG_INT, ARG_INT, ARG_PTR, ARG_LEN, 0 } },
1466 #endif
1467 #if DEFSYS(settimeofday)
1468 { SYS(settimeofday), 2, { ARG_PTR, ARG_PTR, 0, 0, 0, 0 } },
1469 #endif
1470 #if DEFSYS(setuid)
1471 { SYS(setuid), 1, { ARG_UID, 0, 0, 0, 0, 0 } },
1472 #endif
1473 #if DEFSYS(setuid32)
1474 { SYS(setuid32), 1, { ARG_UID, 0, 0, 0, 0, 0 } },
1475 #endif
1476 #if DEFSYS(setxattr)
1477 { SYS(setxattr), 5, { ARG_EMPTY_FILENAME, ARG_PTR, ARG_PTR, ARG_LEN, ARG_FLAG, 0 } },
1478 #endif
1479 #if DEFSYS(sgetmask)
1480 { SYS(sgetmask), 1, { ARG_UINT, 0, 0, 0, 0, 0 } },
1481 #endif
1482 #if DEFSYS(shmat)
1483 { SYS(shmat), 3, { ARG_INT, ARG_PTR, ARG_FLAG, 0, 0, 0 } },
1484 #endif
1485 #if DEFSYS(shmctl)
1486 { SYS(shmctl), 3, { ARG_INT, ARG_INT, ARG_PTR, 0, 0, 0 } },
1487 #endif
1488 #if DEFSYS(shmdt)
1489 { SYS(shmdt), 3, { ARG_INT, ARG_PTR, ARG_FLAG, 0, 0, 0 } },
1490 #endif
1491 #if DEFSYS(shmget)
1492 { SYS(shmget), 3, { ARG_INT, ARG_LEN, ARG_FLAG, 0, 0, 0 } },
1493 #endif
1494 #if DEFSYS(shutdown)
1495 { SYS(shutdown), 2, { ARG_SOCKFD, ARG_INT, 0, 0, 0, 0 } },
1496 #endif
1497 #if DEFSYS(sigaction)
1498 { SYS(sigaction), 3, { ARG_INT, ARG_PTR, ARG_PTR, 0, 0, 0 } },
1499 #endif
1500 #if DEFSYS(sigaltstack)
1501 { SYS(sigaltstack), 3, { ARG_NON_NULL_PTR, ARG_NON_NULL_PTR, 0, 0, 0, 0 } },
1502 #endif
1503 #if DEFSYS(signal)
1504 { SYS(signal), 2, { ARG_INT, ARG_NON_NULL_PTR, 0, 0, 0, 0 } },
1505 #endif
1506 #if DEFSYS(signalfd)
1507 { SYS(signalfd), 3, { ARG_FD, ARG_PTR, ARG_LEN, 0, 0, 0 } },
1508 #endif
1509 #if DEFSYS(signalfd4)
1510 { SYS(signalfd4), 3, { ARG_FD, ARG_PTR, ARG_LEN, ARG_FLAG, 0, 0 } },
1511 #endif
1512 #if DEFSYS(sigpending)
1513 { SYS(sigpending), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1514 #endif
1515 #if DEFSYS(sigreturn)
1516 /* { SYS(sigreturn), 4, { ARG_PTR, ARG_PTR, ARG_PTR, ARG_PTR, 0, 0 } }, */
1517 #endif
1518 #if DEFSYS(sigsuspend)
1519 { SYS(sigsuspend), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1520 #endif
1521 #if DEFSYS(sigtimedwait)
1522 { SYS(sigtimedwait), 3, { ARG_PTR, ARG_PTR, ARG_PTR, 0, 0, 0 } },
1523 #endif
1524 #if DEFSYS(sigwaitinfo)
1525 { SYS(sigwaitinfo), 2, { ARG_PTR, ARG_PTR, 0, 0, 0, 0 } },
1526 #endif
1527 #if DEFSYS(socket)
1528 { SYS(socket), 3, { ARG_INT, ARG_INT, ARG_INT, 0, 0, 0 } },
1529 #endif
1530 #if DEFSYS(socketcall)
1531 { SYS(socketcall), 2, { ARG_INT, ARG_PTR, 0, 0, 0, 0 } },
1532 #endif
1533 #if DEFSYS(socketpair)
1534 { SYS(socketpair), 4, { ARG_INT, ARG_INT, ARG_INT, ARG_PTR, 0, 0 } },
1535 #endif
1536 #if DEFSYS(spill)
1537 /* Xtensa only */
1538 #endif
1539 #if DEFSYS(splice)
1540 { SYS(splice), 6, { ARG_FD, ARG_PTR, ARG_FD, ARG_PTR, ARG_LEN, ARG_FLAG } },
1541 #endif
1542 #if DEFSYS(spu_create)
1543 /* PowerPC/PowerPC64 only */
1544 { SYS(spu_create), 3, { ARG_EMPTY_FILENAME, ARG_FLAG, ARG_MODE, 0, 0, 0 } },
1545 { SYS(spu_create), 4, { ARG_EMPTY_FILENAME, ARG_FLAG, ARG_MODE, ARG_INT, 0, 0 } },
1546 #endif
1547 #if DEFSYS(spu_run)
1548 /* PowerPC/PowerPC64 only */
1549 { SYS(spu_run), 3, { ARG_FD, ARG_PTR, ARG_PTR, 0, 0, 0 } },
1550 #endif
1551 #if DEFSYS(sram_alloc)
1552 /* Blackfin, remove 4.17 */
1553 #endif
1554 #if DEFSYS(sram_free)
1555 /* Blackfin, remove 4.17 */
1556 #endif
1557 #if DEFSYS(ssetmask)
1558 { SYS(ssetmask), 1, { ARG_UINT, 0, 0, 0, 0, 0 } },
1559 #endif
1560 #if DEFSYS(stat)
1561 { SYS(stat), 2, { ARG_EMPTY_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
1562 { SYS(stat), 2, { ARG_EMPTY_FILENAME, ARG_PTR_WR, 0, 0, 0, 0 } },
1563 { SYS(stat), 2, { ARG_DEVNULL_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
1564 { SYS(stat), 2, { ARG_DEVNULL_FILENAME, ARG_PTR_WR, 0, 0, 0, 0 } },
1565 #endif
1566 #if DEFSYS(stat64)
1567 { SYS(stat64), 2, { ARG_EMPTY_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
1568 { SYS(stat64), 2, { ARG_EMPTY_FILENAME, ARG_PTR_WR, 0, 0, 0, 0 } },
1569 { SYS(stat64), 2, { ARG_DEVNULL_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
1570 { SYS(stat64), 2, { ARG_DEVNULL_FILENAME, ARG_PTR_WR, 0, 0, 0, 0 } },
1571 #endif
1572 #if DEFSYS(statfs)
1573 { SYS(statfs), 2, { ARG_EMPTY_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
1574 { SYS(statfs), 2, { ARG_EMPTY_FILENAME, ARG_PTR_WR, 0, 0, 0, 0 } },
1575 { SYS(statfs), 2, { ARG_DEVNULL_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
1576 { SYS(statfs), 2, { ARG_DEVNULL_FILENAME, ARG_PTR_WR, 0, 0, 0, 0 } },
1577 #endif
1578 #if DEFSYS(statfs64)
1579 { SYS(statfs64), 2, { ARG_EMPTY_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
1580 { SYS(statfs64), 2, { ARG_EMPTY_FILENAME, ARG_PTR_WR, 0, 0, 0, 0 } },
1581 { SYS(statfs64), 2, { ARG_DEVNULL_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
1582 { SYS(statfs64), 2, { ARG_DEVNULL_FILENAME, ARG_PTR_WR, 0, 0, 0, 0 } },
1583 #endif
1584 #if DEFSYS(statx)
1585 { SYS(statx), 5, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_FLAG, ARG_UINT, ARG_PTR, 0 } },
1586 { SYS(statx), 5, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_FLAG, ARG_UINT, ARG_PTR_WR, 0 } },
1587 { SYS(statx), 5, { ARG_DIRFD, ARG_DEVNULL_FILENAME, ARG_FLAG, ARG_UINT, ARG_PTR, 0 } },
1588 { SYS(statx), 5, { ARG_DIRFD, ARG_DEVNULL_FILENAME, ARG_FLAG, ARG_UINT, ARG_PTR_WR, 0 } },
1589 #endif
1590 #if DEFSYS(stime)
1591 { SYS(stime), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1592 #endif
1593 #if DEFSYS(subpage_prot)
1594 /* PowerPC/PowerPC64 only */
1595 { SYS(subpage_prot), 3, { ARG_UINT, ARG_LEN, ARG_PTR, 0, 0, 0 } },
1596 #endif
1597 #if DEFSYS(swapcontext)
1598 /* PowerPC/PowerPC64 only, TODO */
1599 #endif
1600 #if DEFSYS(switch_endian)
1601 /* PowerPC/PowerPC64 only, TODO */
1602 #endif
1603 #if DEFSYS(swapon)
1604 { SYS(swapon), 2, { ARG_EMPTY_FILENAME, ARG_INT, 0, 0, 0, 0 } },
1605 #endif
1606 #if DEFSYS(swapoff)
1607 { SYS(swapoff), 1, { ARG_EMPTY_FILENAME, 0 , 0, 0, 0, 0 } },
1608 #endif
1609 #if DEFSYS(symlink)
1610 { SYS(symlink), 2, { ARG_EMPTY_FILENAME, ARG_EMPTY_FILENAME, 0, 0, 0, 0 } },
1611 #endif
1612 #if DEFSYS(symlinkat)
1613 { SYS(symlinkat), 3, { ARG_EMPTY_FILENAME, ARG_FD, ARG_EMPTY_FILENAME, 0, 0, 0 } },
1614 #endif
1615 #if DEFSYS(sync)
1616 //{ SYS(sync), 0, { 0, 0, 0, 0, 0, 0 } },
1617 #endif
1618 #if DEFSYS(sync_file_range)
1619 { SYS(sync_file_range), 4, { ARG_FD, ARG_UINT, ARG_UINT, ARG_FLAG, 0, 0 } },
1620 #endif
1621 #if DEFSYS(sync_file_range2)
1622 { SYS(sync_file_range2), 4, { ARG_FD, ARG_FLAG, ARG_UINT, ARG_UINT, 0, 0 } },
1623 #endif
1624 #if DEFSYS(syncfs)
1625 { SYS(syncfs), 1, { ARG_FD, 0, 0, 0, 0, 0 } },
1626 #endif
1627 #if DEFSYS(sysfs)
1628 { SYS(sysfs), 2, { ARG_INT, ARG_PTR, 0, 0, 0, 0 } },
1629 { SYS(sysfs), 2, { ARG_INT, ARG_PTR_WR, 0, 0, 0, 0 } },
1630 { SYS(sysfs), 3, { ARG_INT, ARG_UINT, ARG_PTR, 0, 0, 0 } },
1631 { SYS(sysfs), 3, { ARG_INT, ARG_UINT, ARG_PTR_WR, 0, 0, 0 } },
1632 { SYS(sysfs), 1, { ARG_INT, 0, 0, 0, 0, 0 } },
1633 #endif
1634 #if DEFSYS(sysinfo)
1635 { SYS(sysinfo), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1636 { SYS(sysinfo), 1, { ARG_PTR_WR, 0, 0, 0, 0, 0 } },
1637 #endif
1638 #if DEFSYS(syslog)
1639 { SYS(syslog), 3, { ARG_INT, ARG_PTR, ARG_PTR, 0, 0, 0 } },
1640 #endif
1641 #if DEFSYS(sysmips)
1642 /* ARM OABI and MIPS O32 ABI, TODO */
1643 #endif
1644 #if DEFSYS(tee)
1645 { SYS(tee), 4, { ARG_FD, ARG_FD, ARG_LEN, ARG_FLAG, 0, 0 } },
1646 #endif
1647 #if DEFSYS(tgkill)
1648 /* { SYS(tgkill), 3, { ARG_PID, ARG_PID, ARG_INT, 0, 0, 0 } },*/
1649 #endif
1650 #if DEFSYS(time)
1651 { SYS(time), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1652 { SYS(time), 1, { ARG_PTR_WR, 0, 0, 0, 0, 0 } },
1653 #endif
1654 #if DEFSYS(timer_create)
1655 { SYS(timer_create), 3, { ARG_CLOCKID_T, ARG_PTR, ARG_PTR, 0, 0, 0 } },
1656 #endif
1657 #if DEFSYS(timer_delete)
1658 { SYS(timer_delete), 1, { ARG_UINT, 0, 0, 0, 0, 0 } },
1659 #endif
1660 #if DEFSYS(timer_getoverrun)
1661 { SYS(timer_getoverrun), 1, { ARG_UINT, 0, 0, 0, 0, 0 } },
1662 #endif
1663 #if DEFSYS(timer_gettime)
1664 { SYS(timer_gettime), 2, { ARG_UINT, ARG_PTR, 0, 0, 0, 0 } },
1665 { SYS(timer_gettime), 2, { ARG_UINT, ARG_PTR_WR, 0, 0, 0, 0 } },
1666 #endif
1667 #if DEFSYS(timer_settime)
1668 { SYS(timer_settime), 4, { ARG_UINT, ARG_FLAG, ARG_PTR, ARG_PTR, 0, 0 } },
1669 #endif
1670 #if DEFSYS(timerfd_create)
1671 { SYS(timerfd_create), 2, { ARG_CLOCKID_T, ARG_FLAG, 0, 0, 0, 0 } },
1672 #endif
1673 #if DEFSYS(timerfd_gettime)
1674 { SYS(timerfd_gettime), 2, { ARG_CLOCKID_T, ARG_PTR, 0, 0, 0, 0 } },
1675 { SYS(timerfd_gettime), 2, { ARG_CLOCKID_T, ARG_PTR_WR, 0, 0, 0, 0 } },
1676 #endif
1677 #if DEFSYS(timerfd_settime)
1678 { SYS(timer_settime), 4, { ARG_FD, ARG_FLAG, ARG_PTR, ARG_PTR, 0, 0 } },
1679 #endif
1680 #if DEFSYS(times)
1681 { SYS(times), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1682 { SYS(times), 1, { ARG_PTR_WR, 0, 0, 0, 0, 0 } },
1683 #endif
1684 #if DEFSYS(tkill)
1685 /* { SYS(tkill), 2, { ARG_PID, ARG_INT, 0, 0, 0, 0 }, */
1686 #endif
1687 #if DEFSYS(truncate)
1688 { SYS(truncate), 2, { ARG_EMPTY_FILENAME, ARG_LEN, 0, 0, 0, 0 } },
1689 #endif
1690 #if DEFSYS(truncate64)
1691 { SYS(truncate64), 2, { ARG_EMPTY_FILENAME, ARG_LEN, 0, 0, 0, 0 } },
1692 #endif
1693 #if DEFSYS(ugetrlimit)
1694 /* TODO */
1695 #endif
1696 #if DEFSYS(umask)
1697 { SYS(umask), 1, { ARG_UINT, 0, 0, 0, 0, 0 } },
1698 #endif
1699 #if DEFSYS(umount)
1700 { SYS(umount), 1, { ARG_EMPTY_FILENAME, 0, 0, 0, 0, 0 } },
1701 { SYS(umount), 1, { ARG_DEVNULL_FILENAME, 0, 0, 0, 0, 0 } },
1702 #endif
1703 #if DEFSYS(umount2)
1704 /* TODO */
1705 #endif
1706 #if DEFSYS(uname)
1707 { SYS(uname), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1708 { SYS(uname), 1, { ARG_PTR_WR, 0, 0, 0, 0, 0 } },
1709 #endif
1710 #if DEFSYS(unlink)
1711 { SYS(unlink), 1, { ARG_EMPTY_FILENAME, 0, 0, 0, 0, 0 } },
1712 #endif
1713 #if DEFSYS(unlinkat)
1714 { SYS(unlinkat), 3, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_FLAG, 0, 0, 0 } },
1715 #endif
1716 #if DEFSYS(unshare)
1717 { SYS(unshare), 1, { ARG_INT, 0, 0, 0, 0, 0 } },
1718 #endif
1719 #if DEFSYS(uselib)
1720 { SYS(uselib), 1, { ARG_EMPTY_FILENAME, 0, 0, 0, 0, 0 } },
1721 { SYS(uselib), 1, { ARG_DEVNULL_FILENAME, 0, 0, 0, 0, 0 } },
1722 #endif
1723 #if DEFSYS(userfaultfd)
1724 { SYS(userfaultfd), 1, { ARG_FLAG, 0, 0, 0, 0, 0 } },
1725 #endif
1726 #if DEFSYS(usr26)
1727 /* ARM OABI only */
1728 #endif
1729 #if DEFSYS(ustat)
1730 { SYS(ustat), 2, { ARG_UINT, ARG_PTR, 0, 0, 0, 0 } },
1731 { SYS(ustat), 2, { ARG_UINT, ARG_PTR_WR, 0, 0, 0, 0 } },
1732 #endif
1733 #if DEFSYS(utime)
1734 { SYS(utime), 2, { ARG_EMPTY_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
1735 { SYS(utime), 2, { ARG_EMPTY_FILENAME, ARG_PTR_WR, 0, 0, 0, 0 } },
1736 #endif
1737 #if DEFSYS(utimensat)
1738 { SYS(utimensat), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_PTR, ARG_FLAG, 0, 0 } },
1739 { SYS(utimensat), 4, { ARG_DIRFD, ARG_EMPTY_FILENAME, ARG_PTR_WR, ARG_FLAG, 0, 0 } },
1740 #endif
1741 #if DEFSYS(utimes)
1742 { SYS(utimes), 2, { ARG_EMPTY_FILENAME, ARG_PTR, 0, 0, 0, 0 } },
1743 { SYS(utimes), 2, { ARG_EMPTY_FILENAME, ARG_PTR_WR, 0, 0, 0, 0 } },
1744 #endif
1745 #if DEFSYS(utrap_install)
1746 /* SPARC64 */
1747 #endif
1748 #if DEFSYS(vm86old)
1749 #endif
1750 #if DEFSYS(vm86)
1751 #endif
1752 #if DEFSYS(vmsplice)
1753 { SYS(vmsplice), 4, { ARG_FD, ARG_PTR, ARG_UINT, ARG_FLAG, 0, 0 } },
1754 #endif
1755 #if DEFSYS(wait)
1756 { SYS(wait), 1, { ARG_PTR, 0, 0, 0, 0, 0 } },
1757 #endif
1758 #if DEFSYS(wait3)
1759 { SYS(wait3), 3, { ARG_PTR, ARG_INT, ARG_PTR, 0, 0, 0 } },
1760 { SYS(wait3), 3, { ARG_PTR_WR, ARG_INT, ARG_PTR, 0, 0, 0 } },
1761 { SYS(wait3), 3, { ARG_PTR, ARG_INT, ARG_PTR_WR, 0, 0, 0 } },
1762 #endif
1763 #if DEFSYS(wait4)
1764 { SYS(wait4), 4, { ARG_PID, ARG_PTR, ARG_INT, ARG_PTR, 0, 0 } },
1765 #endif
1766 #if DEFSYS(waitid)
1767 { SYS(waitid), 4, { ARG_INT, ARG_INT, ARG_PTR, ARG_INT, 0, 0 } },
1768 #endif
1769 #if DEFSYS(waitpid)
1770 { SYS(waitpid), 3, { ARG_PID, ARG_PTR, ARG_INT, 0, 0, 0 } },
1771 #endif
1772 #if DEFSYS(write)
1773 { SYS(write), 3, { ARG_FD, ARG_PTR, ARG_LEN, 0, 0, 0 } },
1774 #endif
1775 #if DEFSYS(writev)
1776 { SYS(writev), 3, { ARG_FD, ARG_PTR, ARG_LEN, 0, 0, 0 } },
1777 #endif
1778 #if DEFSYS(xtensa)
1779 /* xtensa only */
1780 #endif
1781 };
1782
1783 static bool *stress_syscall_exercised;
1784
1785 /*
1786 * running context shared between parent and child
1787 * this allows us to have enough data about a system call that
1788 * caused the child to crash. Also contains running stats
1789 * of the number of system calls made.
1790 */
1791 typedef struct {
1792 uint64_t hash;
1793 uint64_t syscall;
1794 uint64_t type;
1795 const char *name;
1796 size_t idx;
1797 uint64_t counter;
1798 uint64_t skip_crashed;
1799 uint64_t skip_errno_zero;
1800 uint64_t skip_timed_out;
1801 uint64_t crash_count[SIZEOF_ARRAY(stress_syscall_args)];
1802 unsigned long args[6];
1803 unsigned char filler[4096];
1804 } syscall_current_context_t;
1805
1806 static syscall_current_context_t *current_context;
1807
func_exit(void)1808 static void NORETURN func_exit(void)
1809 {
1810 _exit(EXIT_SUCCESS);
1811 }
1812
1813 /*
1814 * Various invalid argument values
1815 */
1816 static unsigned long none_values[] = { 0 };
1817 static unsigned long mode_values[] = {
1818 (unsigned long)-1, INT_MAX, (unsigned long)INT_MIN,
1819 ~(unsigned long)0, 1ULL << 20,
1820 };
1821 static unsigned long access_mode_values[] = {
1822 (unsigned long)~(F_OK | R_OK | W_OK | X_OK)
1823 };
1824 static long sockfds[] = {
1825 /* sockfd */ 0, 0, -1, INT_MAX, INT_MIN, ~(long)0
1826 };
1827 static long fds[] = {
1828 /* fd */ 0, -1, INT_MAX, INT_MIN, ~(long)0
1829 };
1830 static long dirfds[] = {
1831 -1, AT_FDCWD, INT_MIN, ~(long)0
1832 };
1833 static long clockids[] = {
1834 -1, INT_MAX, INT_MIN, ~(long)0, SHR_UL(0xfe23ULL, 18)
1835 };
1836 static long sockaddrs[] = {
1837 /*small_ptr*/ 0, /*page_ptr*/ 0, 0, -1, INT_MAX, INT_MIN
1838 };
1839 static unsigned long brk_addrs[] = {
1840 0, (unsigned long)-1, INT_MAX, (unsigned long)INT_MIN,
1841 ~(unsigned long)0, 4096
1842 };
1843 static unsigned long empty_filenames[] = {
1844 (unsigned long)"", (unsigned long)NULL
1845 };
1846 static unsigned long zero_filenames[] = {
1847 (unsigned long)"/dev/zero"
1848 };
1849 static unsigned long null_filenames[] = {
1850 (unsigned long)"/dev/null"
1851 };
1852 static long flags[] = {
1853 -1, -2, INT_MIN, SHR_UL(0xffffULL, 20)
1854 };
1855 static unsigned long lengths[] = {
1856 (unsigned long)-1, (unsigned long)-2,
1857 (unsigned long)INT_MIN, INT_MAX,
1858 ~(unsigned long)0, -SHR_UL(1, 31)
1859 };
1860 static long ints[] = {
1861 0, -1, -2, INT_MIN, INT_MAX, SHR_UL(0xff, 30), SHR_UL(1, 30),
1862 (long)-SHR_UL(0xff, 30), (long)-SHR_UL(1, 30)
1863 };
1864 static unsigned long uints[] = {
1865 INT_MAX, SHR_UL(0xff, 30), -SHR_UL(0xff, 30), ~(unsigned long)0
1866 };
1867 static unsigned long func_ptrs[] = {
1868 (unsigned long)func_exit
1869 };
1870 static unsigned long ptrs[] = {
1871 /*small_ptr*/ 0, /*page_ptr*/ 0, 0, (unsigned long)-1,
1872 INT_MAX, (unsigned long)INT_MIN, (unsigned long)~4096L
1873 };
1874 static unsigned long ptrs_wr[] = {
1875 /*small_ptr_wr*/ 0, /*page_ptr_wr*/ 0, 0,
1876 (unsigned long)-1, INT_MAX, (unsigned long)INT_MIN,
1877 (unsigned long)~4096L
1878 };
1879 static unsigned long futex_ptrs[] = {
1880 /*small_ptr*/ 0, /*page_ptr*/ 0
1881 };
1882 static unsigned long non_null_ptrs[] = {
1883 /*small_ptr*/ 0, /*page_ptr*/ 0, (unsigned long)-1,
1884 INT_MAX, (unsigned long)INT_MIN, (unsigned long)~4096L
1885 };
1886 static long socklens[] = {
1887 0, -1, INT_MAX, INT_MIN, 8192
1888 };
1889 static unsigned long timeouts[] = {
1890 0
1891 };
1892 static pid_t pids[] = {
1893 INT_MIN, -1, INT_MAX, ~0
1894 };
1895 static gid_t gids[] = {
1896 (gid_t)~0L, INT_MAX
1897 };
1898 static uid_t uids[] = {
1899 (uid_t)~0L, INT_MAX
1900 };
1901
1902 /*
1903 * Misc per system-call args
1904 */
1905 static char *add_key_types[] = { "key_ring" };
1906 static char *add_key_descrs[] = { "." };
1907 static unsigned long bpf_cmds[] = {
1908 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1909 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1910 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1911 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1912 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1913 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
1914 };
1915 static int bpf_lengths[] = { 0, 16, 256, 1024, 4096, 65536, 1024 * 1024 };
1916
1917 /*
1918 * mapping of invalid arg types to invalid arg values
1919 */
1920 static const stress_syscall_arg_values_t arg_values[] = {
1921 ARG_VALUE(ARG_MODE, mode_values),
1922 ARG_VALUE(ARG_SOCKFD, sockfds),
1923 ARG_VALUE(ARG_FD, fds),
1924 ARG_VALUE(ARG_DIRFD, dirfds),
1925 ARG_VALUE(ARG_CLOCKID_T, clockids),
1926 ARG_VALUE(ARG_PID, pids),
1927 ARG_VALUE(ARG_PTR | ARG_STRUCT_SOCKADDR, sockaddrs),
1928 ARG_VALUE(ARG_BRK_ADDR, brk_addrs),
1929 ARG_VALUE(ARG_EMPTY_FILENAME, empty_filenames),
1930 ARG_VALUE(ARG_DEVZERO_FILENAME, zero_filenames),
1931 ARG_VALUE(ARG_DEVNULL_FILENAME, null_filenames),
1932 ARG_VALUE(ARG_FLAG, flags),
1933 ARG_VALUE(ARG_SOCKLEN_T, socklens),
1934 ARG_VALUE(ARG_TIMEOUT, timeouts),
1935 ARG_VALUE(ARG_LEN, lengths),
1936 ARG_VALUE(ARG_GID, gids),
1937 ARG_VALUE(ARG_UID, uids),
1938 ARG_VALUE(ARG_INT, ints),
1939 ARG_VALUE(ARG_UINT, uints),
1940 ARG_VALUE(ARG_FUNC_PTR, func_ptrs),
1941 ARG_VALUE(ARG_NON_NULL_PTR, non_null_ptrs),
1942 ARG_VALUE(ARG_FUTEX_PTR, futex_ptrs),
1943 ARG_VALUE(ARG_PTR_WR, ptrs_wr),
1944 ARG_VALUE(ARG_PTR, ptrs),
1945 ARG_VALUE(ARG_ACCESS_MODE, access_mode_values),
1946
1947 /* Misc per-system call values */
1948 ARG_VALUE(ARG_ADD_KEY_TYPES, add_key_types),
1949 ARG_VALUE(ARG_ADD_KEY_DESCRS, add_key_descrs),
1950 ARG_VALUE(ARG_BPF_CMDS, bpf_cmds),
1951 ARG_VALUE(ARG_BPF_LEN, bpf_lengths),
1952
1953 };
1954
1955 /*
1956 * stress_syscall_hash()
1957 * generate a simple hash on system call and call arguments
1958 */
stress_syscall_hash(const unsigned long syscall_num,const unsigned long args[6])1959 static unsigned long stress_syscall_hash(
1960 const unsigned long syscall_num,
1961 const unsigned long args[6])
1962 {
1963 unsigned long hash = syscall_num;
1964
1965 ROR(hash);
1966 ROR(hash);
1967 hash ^= (args[0]);
1968 ROR(hash);
1969 ROR(hash);
1970 hash ^= (args[1]);
1971 ROR(hash);
1972 ROR(hash);
1973 hash ^= (args[2]);
1974 ROR(hash);
1975 ROR(hash);
1976 hash ^= (args[3]);
1977 ROR(hash);
1978 ROR(hash);
1979 hash ^= (args[4]);
1980 ROR(hash);
1981 ROR(hash);
1982 hash ^= (args[5]);
1983
1984 return hash % SYSCALL_HASH_TABLE_SIZE;
1985 }
1986
1987 /*
1988 * hash_table_add()
1989 * add system call info to the hash table
1990 * - will silently fail if out of memory
1991 */
hash_table_add(const unsigned long hash,const unsigned long syscall_num,const unsigned long * args,const uint8_t type)1992 static void hash_table_add(
1993 const unsigned long hash,
1994 const unsigned long syscall_num,
1995 const unsigned long *args,
1996 const uint8_t type)
1997 {
1998 stress_syscall_arg_hash_t *h;
1999
2000 h = calloc(1, sizeof(*h));
2001 if (!h)
2002 return;
2003 h->hash = hash;
2004 h->syscall = syscall_num;
2005 h->type = type;
2006 (void)memcpy(h->args, args, sizeof(h->args));
2007 h->next = hash_table[hash];
2008 hash_table[hash] = h;
2009 }
2010
2011 /*
2012 * hash_table_free()
2013 * free the hash table
2014 */
hash_table_free(void)2015 static void hash_table_free(void)
2016 {
2017 size_t i;
2018
2019 for (i = 0; i < SIZEOF_ARRAY(hash_table); i++) {
2020 stress_syscall_arg_hash_t *h = hash_table[i];
2021
2022 while (h) {
2023 stress_syscall_arg_hash_t *next = h->next;
2024
2025 free(h);
2026 h = next;
2027 }
2028 hash_table[i] = NULL;
2029 }
2030 }
2031
stress_syscall_itimer_handler(int sig)2032 static void MLOCKED_TEXT stress_syscall_itimer_handler(int sig)
2033 {
2034 (void)sig;
2035
2036 if (current_context) {
2037 current_context->type = SYSCALL_TIMED_OUT;
2038 }
2039 }
2040
2041 /*
2042 * syscall_permute()
2043 * recursively permute all possible system call invalid arguments
2044 * - if the system call crashes, the call info is cached in
2045 * the current_context for the parent to record the failure
2046 * so it's not called again.
2047 * - if the system call returns 0, the call info is saved
2048 * in the hash table so it won't get called again. This is
2049 * just in the child context and is lost when the child
2050 * crashes
2051 */
syscall_permute(const stress_args_t * args,const int arg_num,const stress_syscall_arg_t * stress_syscall_arg,bool * syscall_exercised)2052 static void syscall_permute(
2053 const stress_args_t *args,
2054 const int arg_num,
2055 const stress_syscall_arg_t *stress_syscall_arg,
2056 bool *syscall_exercised)
2057 {
2058 unsigned long arg_bitmask = stress_syscall_arg->arg_bitmasks[arg_num];
2059 size_t i;
2060 unsigned long *values = NULL;
2061 unsigned long rnd_values[4];
2062 size_t num_values = 0;
2063
2064 if (stress_time_now() > time_end)
2065 _exit(EXIT_SUCCESS);
2066
2067 if (arg_num >= stress_syscall_arg->num_args) {
2068 int ret;
2069 const unsigned long syscall_num = stress_syscall_arg->syscall;
2070 const unsigned long hash = stress_syscall_hash(syscall_num, current_context->args);
2071 stress_syscall_arg_hash_t *h = hash_table[hash];
2072 struct itimerval it;
2073
2074 while (h) {
2075 if (!memcmp(h->args, current_context->args, sizeof(h->args))) {
2076 switch (h->type) {
2077 case SYSCALL_CRASH:
2078 current_context->skip_crashed++;
2079 break;
2080 case SYSCALL_ERRNO_ZERO:
2081 current_context->skip_errno_zero++;
2082 break;
2083 case SYSCALL_TIMED_OUT:
2084 current_context->skip_timed_out++;
2085 break;
2086 default:
2087 break;
2088 }
2089 return;
2090 }
2091 h = h->next;
2092 }
2093
2094 errno = 0;
2095 current_context->counter++;
2096 current_context->hash = hash;
2097 current_context->type = SYSCALL_CRASH; /* Assume it will crash */
2098
2099 /*
2100 * Force abort if we take too long
2101 */
2102 it.it_interval.tv_sec = 0;
2103 it.it_interval.tv_usec = SYSCALL_TIMEOUT_USEC;
2104 it.it_value.tv_sec = 0;
2105 it.it_value.tv_usec = SYSCALL_TIMEOUT_USEC;
2106 ret = setitimer(ITIMER_REAL, &it, NULL);
2107 (void)ret;
2108
2109 *syscall_exercised = true;
2110
2111 ret = (int)syscall((long)syscall_num,
2112 current_context->args[0],
2113 current_context->args[1],
2114 current_context->args[2],
2115 current_context->args[3],
2116 current_context->args[4],
2117 current_context->args[5]);
2118
2119 /*
2120 printf("syscall: %s(%lx,%lx,%lx,%lx,%lx,%lx) -> %d\n",
2121 current_context->name,
2122 current_context->args[0],
2123 current_context->args[1],
2124 current_context->args[2],
2125 current_context->args[3],
2126 current_context->args[4],
2127 current_context->args[5], ret);
2128 */
2129
2130
2131 if (current_context->type == SYSCALL_TIMED_OUT) {
2132 /*
2133 * Remember syscalls that block for too long so we don't retry them
2134 */
2135 hash_table_add(hash, syscall_num, current_context->args, SYSCALL_TIMED_OUT);
2136 } else if (ret == 0) {
2137 /*
2138 * For this child we remember syscalls that don't fail
2139 * so we don't retry them
2140 */
2141 hash_table_add(hash, syscall_num, current_context->args, SYSCALL_ERRNO_ZERO);
2142 }
2143 current_context->type = SYSCALL_FAIL; /* it just failed */
2144 return;
2145 }
2146
2147 switch (arg_bitmask) {
2148 case ARG_NONE:
2149 values = none_values;
2150 num_values = 1;
2151 break;
2152 case ARG_RND:
2153 /*
2154 * Provide some 'random' values
2155 */
2156 rnd_values[0] = stress_mwc64();
2157 rnd_values[1] = SHR_UL(stress_mwc32(), 20);
2158 rnd_values[2] = (unsigned long)small_ptr;
2159 rnd_values[3] = (unsigned long)page_ptr;
2160 values = rnd_values;
2161 num_values = 4;
2162 break;
2163 default:
2164 /*
2165 * Find the arg type to determine the arguments to use
2166 */
2167 if (ARG_BITMASK(arg_bitmask, ARG_MISC)) {
2168 /*
2169 * Misc enumerated values
2170 */
2171 for (i = 0; i < SIZEOF_ARRAY(arg_values); i++) {
2172 if (ARG_MISC_ID(arg_bitmask) == ARG_MISC_ID(arg_values[i].bitmask)) {
2173 values = arg_values[i].values;
2174 num_values = arg_values[i].num_values;
2175 break;
2176 }
2177 }
2178 } else {
2179 /*
2180 * Mixed bitmask values
2181 */
2182 for (i = 0; i < SIZEOF_ARRAY(arg_values); i++) {
2183 if (ARG_BITMASK(arg_bitmask, arg_values[i].bitmask)) {
2184 values = arg_values[i].values;
2185 num_values = arg_values[i].num_values;
2186 break;
2187 }
2188 }
2189 }
2190 break;
2191 }
2192
2193 if (arg_bitmask & ARG_PTR_WR)
2194 (void)memset(page_ptr_wr, 0, args->page_size);
2195 /*
2196 * This should not fail!
2197 */
2198 if (!num_values) {
2199 pr_dbg("%s: argument %d has bad bitmask %lx\n", args->name, arg_num, arg_bitmask);
2200 current_context->args[arg_num] = 0;
2201 return;
2202 }
2203
2204 /*
2205 * And permute and call all the argument values for this
2206 * specific argument
2207 */
2208 for (i = 0; i < num_values; i++) {
2209 current_context->args[arg_num] = values[i];
2210 syscall_permute(args, arg_num + 1, stress_syscall_arg, syscall_exercised);
2211 current_context->args[arg_num] = 0;
2212 }
2213 }
2214
2215 /*
2216 * Call a system call in a child context so we don't clobber
2217 * the parent
2218 */
stress_do_syscall(const stress_args_t * args)2219 static inline int stress_do_syscall(const stress_args_t *args)
2220 {
2221 pid_t pid;
2222 int rc = 0;
2223
2224 (void)stress_mwc32();
2225
2226 if (!keep_stressing_flag())
2227 return 0;
2228
2229 if (stress_drop_capabilities(args->name) < 0)
2230 return EXIT_NO_RESOURCE;
2231
2232 pid = fork();
2233 if (pid < 0) {
2234 _exit(EXIT_NO_RESOURCE);
2235 } else if (pid == 0) {
2236 size_t i, n;
2237 size_t reorder[SIZEOF_ARRAY(stress_syscall_args)];
2238
2239 /* We don't want bad ops clobbering this region */
2240 stress_shared_unmap();
2241 stress_process_dumpable(false);
2242
2243 /* Drop all capabilities */
2244 if (stress_drop_capabilities(args->name) < 0) {
2245 _exit(EXIT_NO_RESOURCE);
2246 }
2247 for (i = 0; i < SIZEOF_ARRAY(sigs); i++) {
2248 if (stress_sighandler(args->name, sigs[i], stress_sig_handler_exit, NULL) < 0)
2249 _exit(EXIT_FAILURE);
2250 }
2251
2252 if (stress_sighandler(args->name, SIGALRM, stress_syscall_itimer_handler, NULL) < 0)
2253 _exit(EXIT_FAILURE);
2254
2255 (void)setpgid(0, g_pgrp);
2256 stress_parent_died_alarm();
2257 (void)sched_settings_apply(true);
2258 stress_mwc_reseed();
2259
2260 while (keep_stressing_flag()) {
2261 const size_t sz = SIZEOF_ARRAY(reorder);
2262
2263 for (i = 0; i < SIZEOF_ARRAY(reorder); i++) {
2264 reorder[i] = i;
2265 }
2266
2267 /*
2268 * 50% of the time we do syscalls in shuffled order
2269 */
2270 if (0 && stress_mwc1()) {
2271 /*
2272 * Shuffle syscall order
2273 */
2274 for (n = 0; n < 5; n++) {
2275 for (i = 0; i < SIZEOF_ARRAY(reorder); i++) {
2276 register size_t tmp;
2277 register size_t j = (sz == 0) ? 0 : stress_mwc32() % sz;
2278
2279 tmp = reorder[i];
2280 reorder[i] = reorder[j];
2281 reorder[j] = tmp;
2282 }
2283 }
2284 }
2285
2286 for (i = 0; keep_stressing(args) && (i < SIZEOF_ARRAY(stress_syscall_args)); i++) {
2287 size_t idx;
2288 const size_t j = reorder[i];
2289
2290 (void)memset(current_context->args, 0, sizeof(current_context->args));
2291 current_context->syscall = stress_syscall_args[j].syscall;
2292 idx = (uintptr_t)&stress_syscall_args[j] -
2293 (uintptr_t)stress_syscall_args;
2294 current_context->idx = idx;
2295 current_context->name = stress_syscall_args[j].name;
2296
2297 /* Ignore too many crashes from this system call */
2298 if (current_context->crash_count[idx] >= MAX_CRASHES)
2299 continue;
2300 syscall_permute(args, 0, &stress_syscall_args[j], &stress_syscall_exercised[j]);
2301 }
2302 hash_table_free();
2303 }
2304 _exit(EXIT_SUCCESS);
2305 } else {
2306 int ret, status;
2307
2308 /*
2309 * Don't use retry shim_waitpid here, we want to force
2310 * kill the child no matter what happens at this point
2311 */
2312 ret = waitpid(pid, &status, 0);
2313 if (ret < 0) {
2314 /*
2315 * SIGALRM or a waitpid failure, so force
2316 * kill and reap of child to make sure
2317 * it is really dead and buried
2318 */
2319 (void)kill(pid, SIGKILL);
2320 ret = waitpid(pid, &status, 0);
2321 (void)ret;
2322 }
2323 if (current_context->type == SYSCALL_CRASH) {
2324 const size_t idx = current_context->idx;
2325
2326 hash_table_add(current_context->hash,
2327 current_context->syscall,
2328 current_context->args,
2329 SYSCALL_CRASH);
2330
2331 if (idx < SIZEOF_ARRAY(stress_syscall_args))
2332 current_context->crash_count[idx]++;
2333 }
2334 rc = WEXITSTATUS(status);
2335 }
2336 return rc;
2337 }
2338
stress_sysinval_child(const stress_args_t * args,void * context)2339 static int stress_sysinval_child(const stress_args_t *args, void *context)
2340 {
2341 (void)context;
2342
2343 do {
2344 (void)stress_mwc32();
2345 stress_do_syscall(args);
2346 } while (keep_stressing(args));
2347
2348 return EXIT_SUCCESS;
2349 }
2350
2351 /*
2352 * stress_sysinval
2353 * stress system calls with bad addresses
2354 */
stress_sysinval(const stress_args_t * args)2355 static int stress_sysinval(const stress_args_t *args)
2356 {
2357 int ret, rc = EXIT_NO_RESOURCE;
2358 size_t i, syscalls_exercised, syscalls_unique;
2359 const size_t page_size = args->page_size;
2360 const size_t current_context_size =
2361 (sizeof(*current_context) + page_size) & ~(page_size - 1);
2362 size_t small_ptr_size = page_size << 1; /* cppcheck-suppress duplicateAssignExpression */
2363 size_t page_ptr_wr_size = page_size << 1; /* cppcheck-suppress duplicateAssignExpression */
2364 char filename[PATH_MAX];
2365 const size_t stress_syscall_args_sz = SIZEOF_ARRAY(stress_syscall_args);
2366 const size_t stress_syscall_exercised_sz = stress_syscall_args_sz * sizeof(*stress_syscall_exercised);
2367 bool syscall_exercised[stress_syscall_args_sz];
2368 bool syscall_unique[stress_syscall_args_sz];
2369
2370 time_end = stress_time_now() + (double)g_opt_timeout;
2371
2372 /*
2373 * Run-time sanity check of zero syscalls, maybe __NR or SYS_ is not
2374 * defined.
2375 */
2376 if (stress_syscall_args_sz == 0) {
2377 if (args->instance == 0)
2378 pr_inf_skip("%s: no system calls detected during build, skipping stressor\n",
2379 args->name);
2380 return EXIT_NO_RESOURCE;
2381 }
2382
2383 sockfds[0] = socket(AF_UNIX, SOCK_STREAM, 0);
2384
2385 ret = stress_temp_dir_mk_args(args);
2386 if (ret < 0)
2387 return exit_status(-ret);
2388
2389 (void)stress_temp_filename_args(args,
2390 filename, sizeof(filename), stress_mwc32());
2391 fds[0] = open(filename, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
2392 if (fds[0] < 0) {
2393 pr_fail("%s: open %s failed, errno=%d (%s)\n",
2394 args->name, filename, errno, strerror(errno));
2395 goto err_dir;
2396 }
2397 (void)unlink(filename);
2398
2399 stress_syscall_exercised =
2400 (bool *)mmap(NULL, stress_syscall_exercised_sz,
2401 PROT_READ | PROT_WRITE,
2402 MAP_SHARED | MAP_ANONYMOUS,
2403 -1, 0);
2404 if (stress_syscall_exercised == MAP_FAILED) {
2405 pr_fail("%s: mmap failed, errno=%d (%s)\n",
2406 args->name, errno, strerror(errno));
2407 goto tidy;
2408 }
2409
2410 current_context = (syscall_current_context_t*)
2411 mmap(NULL, current_context_size, PROT_READ | PROT_WRITE,
2412 MAP_SHARED | MAP_ANONYMOUS, -1, 0);
2413 if (current_context == MAP_FAILED) {
2414 pr_fail("%s: mmap failed, errno=%d (%s)\n",
2415 args->name, errno, strerror(errno));
2416 goto tidy;
2417 }
2418
2419 small_ptr = (uint8_t *)mmap(NULL, small_ptr_size, PROT_READ | PROT_WRITE,
2420 MAP_SHARED | MAP_ANONYMOUS, -1, 0);
2421 if (small_ptr == MAP_FAILED) {
2422 pr_fail("%s: mmap failed, errno=%d (%s)\n",
2423 args->name, errno, strerror(errno));
2424 goto tidy;
2425 }
2426 #if defined(HAVE_MPROTECT)
2427 (void)mprotect((void *)(small_ptr + page_size), page_size, PROT_NONE);
2428 #else
2429 (void)munmap((void *)(small_ptr + page_size), page_size);
2430 small_ptr_size -= page_size;
2431 #endif
2432
2433 page_ptr = (uint8_t *)mmap(NULL, page_size, PROT_NONE,
2434 MAP_SHARED | MAP_ANONYMOUS, -1, 0);
2435 if (page_ptr == MAP_FAILED) {
2436 pr_fail("%s: mmap failed, errno=%d (%s)\n",
2437 args->name, errno, strerror(errno));
2438 goto tidy;
2439 }
2440
2441 page_ptr_wr = (uint8_t *)mmap(NULL, page_ptr_wr_size, PROT_WRITE,
2442 MAP_SHARED | MAP_ANONYMOUS, -1, 0);
2443 if (page_ptr_wr == MAP_FAILED) {
2444 pr_fail("%s: mmap failed, errno=%d (%s)\n",
2445 args->name, errno, strerror(errno));
2446 goto tidy;
2447 }
2448 small_ptr_wr = page_ptr_wr + page_size - 1;
2449 #if defined(HAVE_MPROTECT)
2450 (void)mprotect((void *)(page_ptr_wr + page_size), page_size, PROT_NONE);
2451 #else
2452 (void)munmap((void *)(page_ptr_wr + page_size), page_size);
2453 page_ptr_wr_size -= page_size;
2454 #endif
2455
2456
2457 sockaddrs[0] = (long)(small_ptr + page_size - 1);
2458 sockaddrs[1] = (long)page_ptr;
2459 ptrs[0] = (unsigned long)(small_ptr + page_size -1);
2460 ptrs[1] = (unsigned long)page_ptr;
2461 non_null_ptrs[0] = (unsigned long)(small_ptr + page_size -1);
2462 non_null_ptrs[1] = (unsigned long)page_ptr;
2463 futex_ptrs[0] = (unsigned long)(small_ptr + page_size -1);
2464 futex_ptrs[1] = (unsigned long)page_ptr;
2465
2466 stress_set_proc_state(args->name, STRESS_STATE_RUN);
2467
2468 rc = stress_oomable_child(args, NULL, stress_sysinval_child, STRESS_OOMABLE_DROP_CAP);
2469
2470 (void)memset(syscall_exercised, 0, sizeof(syscall_exercised));
2471 (void)memset(syscall_unique, 0, sizeof(syscall_unique));
2472 syscalls_exercised = 0;
2473 syscalls_unique = 0;
2474
2475 /*
2476 * Determine the number of syscalls that we can test vs
2477 * the number of syscalls actually exercised
2478 */
2479 for (i = 0; i < stress_syscall_args_sz; i++) {
2480 unsigned long syscall_num = stress_syscall_args[i].syscall;
2481 size_t exercised = 0, unique = 0;
2482 size_t j;
2483
2484 for (j = 0; j < stress_syscall_args_sz; j++) {
2485 if (syscall_num == stress_syscall_args[j].syscall) {
2486 if (!syscall_unique[j]) {
2487 syscall_unique[j] = true;
2488 unique = true;
2489 }
2490 if (!syscall_exercised[j] &&
2491 stress_syscall_exercised[j]) {
2492 syscall_exercised[j] = true;
2493 exercised = true;
2494 }
2495 }
2496 }
2497 if (unique)
2498 syscalls_unique++;
2499 if (exercised)
2500 syscalls_exercised++;
2501 }
2502 pr_dbg("%s: %zd of %zd (%.2f%%) unique system calls exercised\n",
2503 args->name, syscalls_exercised, syscalls_unique,
2504 (double)(syscalls_exercised * 100) / (double)syscalls_unique);
2505 pr_dbg("%s: %" PRIu64 " unique syscalls argument combinations causing premature child termination\n",
2506 args->name, current_context->skip_crashed);
2507 pr_dbg("%s: ignored %" PRIu64 " unique syscall patterns that were not failing and %" PRIu64 " that timed out\n",
2508 args->name, current_context->skip_errno_zero, current_context->skip_timed_out);
2509
2510 set_counter(args, current_context->counter);
2511
2512 tidy:
2513 stress_set_proc_state(args->name, STRESS_STATE_DEINIT);
2514 if (stress_syscall_exercised && stress_syscall_exercised != MAP_FAILED)
2515 (void)munmap((void *)stress_syscall_exercised, stress_syscall_exercised_sz);
2516 if (page_ptr_wr && page_ptr_wr != MAP_FAILED)
2517 (void)munmap((void *)page_ptr_wr, page_ptr_wr_size);
2518 if (page_ptr && page_ptr != MAP_FAILED)
2519 (void)munmap((void *)page_ptr, page_size);
2520 if (small_ptr && small_ptr != MAP_FAILED)
2521 (void)munmap((void *)small_ptr, small_ptr_size);
2522 if (current_context && current_context != MAP_FAILED)
2523 (void)munmap((void *)current_context, current_context_size);
2524 if (sockfds[0] >= 0)
2525 (void)close((int)sockfds[0]);
2526 if (fds[0] >= 0)
2527 (void)close((int)fds[0]);
2528
2529 err_dir:
2530 stress_set_proc_state(args->name, STRESS_STATE_DEINIT);
2531 (void)stress_temp_dir_rm_args(args);
2532 hash_table_free();
2533
2534 return rc;
2535 }
2536
2537 stressor_info_t stress_sysinval_info = {
2538 .stressor = stress_sysinval,
2539 .class = CLASS_OS | CLASS_PATHOLOGICAL,
2540 .help = help
2541 };
2542 #else
2543 stressor_info_t stress_sysinval_info = {
2544 .stressor = stress_not_implemented,
2545 .class = CLASS_OS | CLASS_PATHOLOGICAL,
2546 .help = help
2547 };
2548 #endif
2549