1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
2 // Copyright (c) 2020 Anton Protopopov
3 #include <stdlib.h>
4 #include <string.h>
5 #include <limits.h>
6 #include <stdio.h>
7 #include <errno.h>
8
9 static const char **syscall_names;
10 static size_t syscall_names_size;
11
12 #define warn(...) fprintf(stderr, __VA_ARGS__)
13 #define MAX(x, y) (((x) > (y)) ? (x) : (y))
14
parse_syscall(const char * buf,int * number)15 static const char *parse_syscall(const char *buf, int *number)
16 {
17 char *end;
18 long x;
19
20 errno = 0;
21 x = strtol(buf, &end, 10);
22 if (errno) {
23 warn("strtol(%s): %s\n", buf, strerror(errno));
24 return NULL;
25 } else if (end == buf) {
26 warn("strtol(%s): no digits found\n", buf);
27 return NULL;
28 } else if (x < 0 || x > INT_MAX) {
29 warn("strtol(%s): bad syscall number: %ld\n", buf, x);
30 return NULL;
31 }
32 if (*end != '\t') {
33 warn("bad input: %s (expected <num>\t<name>)\n", buf);
34 return NULL;
35 }
36
37 *number = x;
38 return ++end;
39 }
40
init_syscall_names(void)41 void init_syscall_names(void)
42 {
43 size_t old_size, size = 1024;
44 const char *name;
45 char buf[64];
46 int number;
47 int err;
48 FILE *f;
49
50 f = popen("ausyscall --dump 2>/dev/null", "r");
51 if (!f) {
52 warn("popen: ausyscall --dump: %s\n", strerror(errno));
53 return;
54 }
55
56 syscall_names = calloc(size, sizeof(char *));
57 if (!syscall_names) {
58 warn("calloc: %s\n", strerror(errno));
59 goto close;
60 }
61
62 /* skip the header, ignore the result of fgets, outwit the comiler */
63 (void) !!fgets(buf, sizeof(buf), f);
64
65 while (fgets(buf, sizeof(buf), f)) {
66 if (buf[strlen(buf) - 1] == '\n')
67 buf[strlen(buf) - 1] = '\0';
68
69 name = parse_syscall(buf, &number);
70 if (!name || !name[0])
71 goto close;
72
73 /* In a rare case when syscall number is > than initial 1024 */
74 if (number >= size) {
75 old_size = size;
76 size = 1024 * (1 + number / 1024);
77 syscall_names = realloc(syscall_names,
78 size * sizeof(char *));
79 if (!syscall_names) {
80 warn("realloc: %s\n", strerror(errno));
81 goto close;
82 }
83 memset(syscall_names+old_size, 0,
84 (size - old_size) * sizeof(char *));
85 }
86
87 if (syscall_names[number]) {
88 warn("duplicate number: %d (stored: %s)",
89 number, syscall_names[number]);
90 goto close;
91 }
92
93 syscall_names[number] = strdup(name);
94 if (!syscall_names[number]) {
95 warn("strdup: %s\n", strerror(errno));
96 goto close;
97 }
98 syscall_names_size = MAX(number+1, syscall_names_size);
99 }
100
101 if (ferror(f))
102 warn("fgets: %s\n", strerror(errno));
103 close:
104 err = pclose(f);
105 if (err < 0)
106 warn("pclose: %s\n", strerror(errno));
107 #if !defined(__x86_64__) && !defined(__aarch64__) && !defined(__riscv)
108 /* Ignore the error for x86_64/arm64/riscv where we have a table compiled in */
109 else if (err && WEXITSTATUS(err) == 127) {
110 warn("ausyscall required for syscalls number/name mapping\n");
111 } else if (err) {
112 warn("ausyscall exit status (see wait(2)): 0x%x\n", err);
113 }
114 #endif
115 }
116
free_syscall_names(void)117 void free_syscall_names(void)
118 {
119 size_t i;
120
121 for (i = 0; i < syscall_names_size; i++)
122 free((void *) syscall_names[i]);
123 free(syscall_names);
124 }
125
126 /*
127 * Syscall table for Linux x86_64.
128 *
129 * Semi-automatically generated from strace/linux/x86_64/syscallent.h and
130 * linux/syscallent-common.h using the following commands:
131 *
132 * awk -F\" '/SEN/{printf("%d %s\n", substr($0,2,3), $(NF-1));}' syscallent.h
133 * awk '/SEN/ { printf("%d %s\n", $3, $9); }' syscallent-common.h
134 *
135 * (The idea is taken from src/python/bcc/syscall.py.)
136 */
137 #ifdef __x86_64__
138 static const char *syscall_names_x86_64[] = {
139 [0] = "read",
140 [1] = "write",
141 [2] = "open",
142 [3] = "close",
143 [4] = "stat",
144 [5] = "fstat",
145 [6] = "lstat",
146 [7] = "poll",
147 [8] = "lseek",
148 [9] = "mmap",
149 [10] = "mprotect",
150 [11] = "munmap",
151 [12] = "brk",
152 [13] = "rt_sigaction",
153 [14] = "rt_sigprocmask",
154 [15] = "rt_sigreturn",
155 [16] = "ioctl",
156 [17] = "pread64",
157 [18] = "pwrite64",
158 [19] = "readv",
159 [20] = "writev",
160 [21] = "access",
161 [22] = "pipe",
162 [23] = "select",
163 [24] = "sched_yield",
164 [25] = "mremap",
165 [26] = "msync",
166 [27] = "mincore",
167 [28] = "madvise",
168 [29] = "shmget",
169 [30] = "shmat",
170 [31] = "shmctl",
171 [32] = "dup",
172 [33] = "dup2",
173 [34] = "pause",
174 [35] = "nanosleep",
175 [36] = "getitimer",
176 [37] = "alarm",
177 [38] = "setitimer",
178 [39] = "getpid",
179 [40] = "sendfile",
180 [41] = "socket",
181 [42] = "connect",
182 [43] = "accept",
183 [44] = "sendto",
184 [45] = "recvfrom",
185 [46] = "sendmsg",
186 [47] = "recvmsg",
187 [48] = "shutdown",
188 [49] = "bind",
189 [50] = "listen",
190 [51] = "getsockname",
191 [52] = "getpeername",
192 [53] = "socketpair",
193 [54] = "setsockopt",
194 [55] = "getsockopt",
195 [56] = "clone",
196 [57] = "fork",
197 [58] = "vfork",
198 [59] = "execve",
199 [60] = "exit",
200 [61] = "wait4",
201 [62] = "kill",
202 [63] = "uname",
203 [64] = "semget",
204 [65] = "semop",
205 [66] = "semctl",
206 [67] = "shmdt",
207 [68] = "msgget",
208 [69] = "msgsnd",
209 [70] = "msgrcv",
210 [71] = "msgctl",
211 [72] = "fcntl",
212 [73] = "flock",
213 [74] = "fsync",
214 [75] = "fdatasync",
215 [76] = "truncate",
216 [77] = "ftruncate",
217 [78] = "getdents",
218 [79] = "getcwd",
219 [80] = "chdir",
220 [81] = "fchdir",
221 [82] = "rename",
222 [83] = "mkdir",
223 [84] = "rmdir",
224 [85] = "creat",
225 [86] = "link",
226 [87] = "unlink",
227 [88] = "symlink",
228 [89] = "readlink",
229 [90] = "chmod",
230 [91] = "fchmod",
231 [92] = "chown",
232 [93] = "fchown",
233 [94] = "lchown",
234 [95] = "umask",
235 [96] = "gettimeofday",
236 [97] = "getrlimit",
237 [98] = "getrusage",
238 [99] = "sysinfo",
239 [100] = "times",
240 [101] = "ptrace",
241 [102] = "getuid",
242 [103] = "syslog",
243 [104] = "getgid",
244 [105] = "setuid",
245 [106] = "setgid",
246 [107] = "geteuid",
247 [108] = "getegid",
248 [109] = "setpgid",
249 [110] = "getppid",
250 [111] = "getpgrp",
251 [112] = "setsid",
252 [113] = "setreuid",
253 [114] = "setregid",
254 [115] = "getgroups",
255 [116] = "setgroups",
256 [117] = "setresuid",
257 [118] = "getresuid",
258 [119] = "setresgid",
259 [120] = "getresgid",
260 [121] = "getpgid",
261 [122] = "setfsuid",
262 [123] = "setfsgid",
263 [124] = "getsid",
264 [125] = "capget",
265 [126] = "capset",
266 [127] = "rt_sigpending",
267 [128] = "rt_sigtimedwait",
268 [129] = "rt_sigqueueinfo",
269 [130] = "rt_sigsuspend",
270 [131] = "sigaltstack",
271 [132] = "utime",
272 [133] = "mknod",
273 [134] = "uselib",
274 [135] = "personality",
275 [136] = "ustat",
276 [137] = "statfs",
277 [138] = "fstatfs",
278 [139] = "sysfs",
279 [140] = "getpriority",
280 [141] = "setpriority",
281 [142] = "sched_setparam",
282 [143] = "sched_getparam",
283 [144] = "sched_setscheduler",
284 [145] = "sched_getscheduler",
285 [146] = "sched_get_priority_max",
286 [147] = "sched_get_priority_min",
287 [148] = "sched_rr_get_interval",
288 [149] = "mlock",
289 [150] = "munlock",
290 [151] = "mlockall",
291 [152] = "munlockall",
292 [153] = "vhangup",
293 [154] = "modify_ldt",
294 [155] = "pivot_root",
295 [156] = "_sysctl",
296 [157] = "prctl",
297 [158] = "arch_prctl",
298 [159] = "adjtimex",
299 [160] = "setrlimit",
300 [161] = "chroot",
301 [162] = "sync",
302 [163] = "acct",
303 [164] = "settimeofday",
304 [165] = "mount",
305 [166] = "umount2",
306 [167] = "swapon",
307 [168] = "swapoff",
308 [169] = "reboot",
309 [170] = "sethostname",
310 [171] = "setdomainname",
311 [172] = "iopl",
312 [173] = "ioperm",
313 [174] = "create_module",
314 [175] = "init_module",
315 [176] = "delete_module",
316 [177] = "get_kernel_syms",
317 [178] = "query_module",
318 [179] = "quotactl",
319 [180] = "nfsservctl",
320 [181] = "getpmsg",
321 [182] = "putpmsg",
322 [183] = "afs_syscall",
323 [184] = "tuxcall",
324 [185] = "security",
325 [186] = "gettid",
326 [187] = "readahead",
327 [188] = "setxattr",
328 [189] = "lsetxattr",
329 [190] = "fsetxattr",
330 [191] = "getxattr",
331 [192] = "lgetxattr",
332 [193] = "fgetxattr",
333 [194] = "listxattr",
334 [195] = "llistxattr",
335 [196] = "flistxattr",
336 [197] = "removexattr",
337 [198] = "lremovexattr",
338 [199] = "fremovexattr",
339 [200] = "tkill",
340 [201] = "time",
341 [202] = "futex",
342 [203] = "sched_setaffinity",
343 [204] = "sched_getaffinity",
344 [205] = "set_thread_area",
345 [206] = "io_setup",
346 [207] = "io_destroy",
347 [208] = "io_getevents",
348 [209] = "io_submit",
349 [210] = "io_cancel",
350 [211] = "get_thread_area",
351 [212] = "lookup_dcookie",
352 [213] = "epoll_create",
353 [214] = "epoll_ctl_old",
354 [215] = "epoll_wait_old",
355 [216] = "remap_file_pages",
356 [217] = "getdents64",
357 [218] = "set_tid_address",
358 [219] = "restart_syscall",
359 [220] = "semtimedop",
360 [221] = "fadvise64",
361 [222] = "timer_create",
362 [223] = "timer_settime",
363 [224] = "timer_gettime",
364 [225] = "timer_getoverrun",
365 [226] = "timer_delete",
366 [227] = "clock_settime",
367 [228] = "clock_gettime",
368 [229] = "clock_getres",
369 [230] = "clock_nanosleep",
370 [231] = "exit_group",
371 [232] = "epoll_wait",
372 [233] = "epoll_ctl",
373 [234] = "tgkill",
374 [235] = "utimes",
375 [236] = "vserver",
376 [237] = "mbind",
377 [238] = "set_mempolicy",
378 [239] = "get_mempolicy",
379 [240] = "mq_open",
380 [241] = "mq_unlink",
381 [242] = "mq_timedsend",
382 [243] = "mq_timedreceive",
383 [244] = "mq_notify",
384 [245] = "mq_getsetattr",
385 [246] = "kexec_load",
386 [247] = "waitid",
387 [248] = "add_key",
388 [249] = "request_key",
389 [250] = "keyctl",
390 [251] = "ioprio_set",
391 [252] = "ioprio_get",
392 [253] = "inotify_init",
393 [254] = "inotify_add_watch",
394 [255] = "inotify_rm_watch",
395 [256] = "migrate_pages",
396 [257] = "openat",
397 [258] = "mkdirat",
398 [259] = "mknodat",
399 [260] = "fchownat",
400 [261] = "futimesat",
401 [262] = "newfstatat",
402 [263] = "unlinkat",
403 [264] = "renameat",
404 [265] = "linkat",
405 [266] = "symlinkat",
406 [267] = "readlinkat",
407 [268] = "fchmodat",
408 [269] = "faccessat",
409 [270] = "pselect6",
410 [271] = "ppoll",
411 [272] = "unshare",
412 [273] = "set_robust_list",
413 [274] = "get_robust_list",
414 [275] = "splice",
415 [276] = "tee",
416 [277] = "sync_file_range",
417 [278] = "vmsplice",
418 [279] = "move_pages",
419 [280] = "utimensat",
420 [281] = "epoll_pwait",
421 [282] = "signalfd",
422 [283] = "timerfd_create",
423 [284] = "eventfd",
424 [285] = "fallocate",
425 [286] = "timerfd_settime",
426 [287] = "timerfd_gettime",
427 [288] = "accept4",
428 [289] = "signalfd4",
429 [290] = "eventfd2",
430 [291] = "epoll_create1",
431 [292] = "dup3",
432 [293] = "pipe2",
433 [294] = "inotify_init1",
434 [295] = "preadv",
435 [296] = "pwritev",
436 [297] = "rt_tgsigqueueinfo",
437 [298] = "perf_event_open",
438 [299] = "recvmmsg",
439 [300] = "fanotify_init",
440 [301] = "fanotify_mark",
441 [302] = "prlimit64",
442 [303] = "name_to_handle_at",
443 [304] = "open_by_handle_at",
444 [305] = "clock_adjtime",
445 [306] = "syncfs",
446 [307] = "sendmmsg",
447 [308] = "setns",
448 [309] = "getcpu",
449 [310] = "process_vm_readv",
450 [311] = "process_vm_writev",
451 [312] = "kcmp",
452 [313] = "finit_module",
453 [314] = "sched_setattr",
454 [315] = "sched_getattr",
455 [316] = "renameat2",
456 [317] = "seccomp",
457 [318] = "getrandom",
458 [319] = "memfd_create",
459 [320] = "kexec_file_load",
460 [321] = "bpf",
461 [322] = "execveat",
462 [323] = "userfaultfd",
463 [324] = "membarrier",
464 [325] = "mlock2",
465 [326] = "copy_file_range",
466 [327] = "preadv2",
467 [328] = "pwritev2",
468 [329] = "pkey_mprotect",
469 [330] = "pkey_alloc",
470 [331] = "pkey_free",
471 [332] = "statx",
472 [333] = "io_pgetevents",
473 [334] = "rseq",
474 [424] = "pidfd_send_signal",
475 [425] = "io_uring_setup",
476 [426] = "io_uring_enter",
477 [427] = "io_uring_register",
478 [428] = "open_tree",
479 [429] = "move_mount",
480 [430] = "fsopen",
481 [431] = "fsconfig",
482 [432] = "fsmount",
483 [433] = "fspick",
484 [434] = "pidfd_open",
485 [435] = "clone3",
486 [437] = "openat2",
487 [438] = "pidfd_getfd",
488 };
489 size_t syscall_names_x86_64_size = sizeof(syscall_names_x86_64)/sizeof(char*);
490 #elif defined(__aarch64__) || defined(__riscv)
491 static const char *syscall_names_generic[] = {
492 [0] = "io_setup",
493 [1] = "io_destroy",
494 [2] = "io_submit",
495 [3] = "io_cancel",
496 [4] = "io_getevents",
497 [5] = "setxattr",
498 [6] = "lsetxattr",
499 [7] = "fsetxattr",
500 [8] = "getxattr",
501 [9] = "lgetxattr",
502 [10] = "fgetxattr",
503 [11] = "listxattr",
504 [12] = "llistxattr",
505 [13] = "flistxattr",
506 [14] = "removexattr",
507 [15] = "lremovexattr",
508 [16] = "fremovexattr",
509 [17] = "getcwd",
510 [18] = "lookup_dcookie",
511 [19] = "eventfd2",
512 [20] = "epoll_create1",
513 [21] = "epoll_ctl",
514 [22] = "epoll_pwait",
515 [23] = "dup",
516 [24] = "dup3",
517 [25] = "fcntl",
518 [26] = "inotify_init1",
519 [27] = "inotify_add_watch",
520 [28] = "inotify_rm_watch",
521 [29] = "ioctl",
522 [30] = "ioprio_set",
523 [31] = "ioprio_get",
524 [32] = "flock",
525 [33] = "mknodat",
526 [34] = "mkdirat",
527 [35] = "unlinkat",
528 [36] = "symlinkat",
529 [37] = "linkat",
530 [38] = "renameat",
531 [39] = "umount2",
532 [40] = "mount",
533 [41] = "pivot_root",
534 [42] = "nfsservctl",
535 [43] = "statfs",
536 [44] = "fstatfs",
537 [45] = "truncate",
538 [46] = "ftruncate",
539 [47] = "fallocate",
540 [48] = "faccessat",
541 [49] = "chdir",
542 [50] = "fchdir",
543 [51] = "chroot",
544 [52] = "fchmod",
545 [53] = "fchmodat",
546 [54] = "fchownat",
547 [55] = "fchown",
548 [56] = "openat",
549 [57] = "close",
550 [58] = "vhangup",
551 [59] = "pipe2",
552 [60] = "quotactl",
553 [61] = "getdents64",
554 [62] = "lseek",
555 [63] = "read",
556 [64] = "write",
557 [65] = "readv",
558 [66] = "writev",
559 [67] = "pread64",
560 [68] = "pwrite64",
561 [69] = "preadv",
562 [70] = "pwritev",
563 [71] = "sendfile",
564 [72] = "pselect6",
565 [73] = "ppoll",
566 [74] = "signalfd4",
567 [75] = "vmsplice",
568 [76] = "splice",
569 [77] = "tee",
570 [78] = "readlinkat",
571 [79] = "newfstatat",
572 [80] = "fstat",
573 [81] = "sync",
574 [82] = "fsync",
575 [83] = "fdatasync",
576 [84] = "sync_file_range",
577 [85] = "timerfd_create",
578 [86] = "timerfd_settime",
579 [87] = "timerfd_gettime",
580 [88] = "utimensat",
581 [89] = "acct",
582 [90] = "capget",
583 [91] = "capset",
584 [92] = "personality",
585 [93] = "exit",
586 [94] = "exit_group",
587 [95] = "waitid",
588 [96] = "set_tid_address",
589 [97] = "unshare",
590 [98] = "futex",
591 [99] = "set_robust_list",
592 [100] = "get_robust_list",
593 [101] = "nanosleep",
594 [102] = "getitimer",
595 [103] = "setitimer",
596 [104] = "kexec_load",
597 [105] = "init_module",
598 [106] = "delete_module",
599 [107] = "timer_create",
600 [108] = "timer_gettime",
601 [109] = "timer_getoverrun",
602 [110] = "timer_settime",
603 [111] = "timer_delete",
604 [112] = "clock_settime",
605 [113] = "clock_gettime",
606 [114] = "clock_getres",
607 [115] = "clock_nanosleep",
608 [116] = "syslog",
609 [117] = "ptrace",
610 [118] = "sched_setparam",
611 [119] = "sched_setscheduler",
612 [120] = "sched_getscheduler",
613 [121] = "sched_getparam",
614 [122] = "sched_setaffinity",
615 [123] = "sched_getaffinity",
616 [124] = "sched_yield",
617 [125] = "sched_get_priority_max",
618 [126] = "sched_get_priority_min",
619 [127] = "sched_rr_get_interval",
620 [128] = "restart_syscall",
621 [129] = "kill",
622 [130] = "tkill",
623 [131] = "tgkill",
624 [132] = "sigaltstack",
625 [133] = "rt_sigsuspend",
626 [134] = "rt_sigaction",
627 [135] = "rt_sigprocmask",
628 [136] = "rt_sigpending",
629 [137] = "rt_sigtimedwait",
630 [138] = "rt_sigqueueinfo",
631 [139] = "rt_sigreturn",
632 [140] = "setpriority",
633 [141] = "getpriority",
634 [142] = "reboot",
635 [143] = "setregid",
636 [144] = "setgid",
637 [145] = "setreuid",
638 [146] = "setuid",
639 [147] = "setresuid",
640 [148] = "getresuid",
641 [149] = "setresgid",
642 [150] = "getresgid",
643 [151] = "setfsuid",
644 [152] = "setfsgid",
645 [153] = "times",
646 [154] = "setpgid",
647 [155] = "getpgid",
648 [156] = "getsid",
649 [157] = "setsid",
650 [158] = "getgroups",
651 [159] = "setgroups",
652 [160] = "uname",
653 [161] = "sethostname",
654 [162] = "setdomainname",
655 [163] = "getrlimit",
656 [164] = "setrlimit",
657 [165] = "getrusage",
658 [166] = "umask",
659 [167] = "prctl",
660 [168] = "getcpu",
661 [169] = "gettimeofday",
662 [170] = "settimeofday",
663 [171] = "adjtimex",
664 [172] = "getpid",
665 [173] = "getppid",
666 [174] = "getuid",
667 [175] = "geteuid",
668 [176] = "getgid",
669 [177] = "getegid",
670 [178] = "gettid",
671 [179] = "sysinfo",
672 [180] = "mq_open",
673 [181] = "mq_unlink",
674 [182] = "mq_timedsend",
675 [183] = "mq_timedreceive",
676 [184] = "mq_notify",
677 [185] = "mq_getsetattr",
678 [186] = "msgget",
679 [187] = "msgctl",
680 [188] = "msgrcv",
681 [189] = "msgsnd",
682 [190] = "semget",
683 [191] = "semctl",
684 [192] = "semtimedop",
685 [193] = "semop",
686 [194] = "shmget",
687 [195] = "shmctl",
688 [196] = "shmat",
689 [197] = "shmdt",
690 [198] = "socket",
691 [199] = "socketpair",
692 [200] = "bind",
693 [201] = "listen",
694 [202] = "accept",
695 [203] = "connect",
696 [204] = "getsockname",
697 [205] = "getpeername",
698 [206] = "sendto",
699 [207] = "recvfrom",
700 [208] = "setsockopt",
701 [209] = "getsockopt",
702 [210] = "shutdown",
703 [211] = "sendmsg",
704 [212] = "recvmsg",
705 [213] = "readahead",
706 [214] = "brk",
707 [215] = "munmap",
708 [216] = "mremap",
709 [217] = "add_key",
710 [218] = "request_key",
711 [219] = "keyctl",
712 [220] = "clone",
713 [221] = "execve",
714 [222] = "mmap",
715 [223] = "fadvise64",
716 [224] = "swapon",
717 [225] = "swapoff",
718 [226] = "mprotect",
719 [227] = "msync",
720 [228] = "mlock",
721 [229] = "munlock",
722 [230] = "mlockall",
723 [231] = "munlockall",
724 [232] = "mincore",
725 [233] = "madvise",
726 [234] = "remap_file_pages",
727 [235] = "mbind",
728 [236] = "get_mempolicy",
729 [237] = "set_mempolicy",
730 [238] = "migrate_pages",
731 [239] = "move_pages",
732 [240] = "rt_tgsigqueueinfo",
733 [241] = "perf_event_open",
734 [242] = "accept4",
735 [243] = "recvmmsg",
736 [244] = "arch_specific_syscall",
737 #if defined(__riscv)
738 [258] = "riscv_hwprobe",
739 [259] = "riscv_flush_icache",
740 #endif
741 [260] = "wait4",
742 [261] = "prlimit64",
743 [262] = "fanotify_init",
744 [263] = "fanotify_mark",
745 [264] = "name_to_handle_at",
746 [265] = "open_by_handle_at",
747 [266] = "clock_adjtime",
748 [267] = "syncfs",
749 [268] = "setns",
750 [269] = "sendmmsg",
751 [270] = "process_vm_readv",
752 [271] = "process_vm_writev",
753 [272] = "kcmp",
754 [273] = "finit_module",
755 [274] = "sched_setattr",
756 [275] = "sched_getattr",
757 [276] = "renameat2",
758 [277] = "seccomp",
759 [278] = "getrandom",
760 [279] = "memfd_create",
761 [280] = "bpf",
762 [281] = "execveat",
763 [282] = "userfaultfd",
764 [283] = "membarrier",
765 [284] = "mlock2",
766 [285] = "copy_file_range",
767 [286] = "preadv2",
768 [287] = "pwritev2",
769 [288] = "pkey_mprotect",
770 [289] = "pkey_alloc",
771 [290] = "pkey_free",
772 [291] = "statx",
773 [292] = "io_pgetevents",
774 [293] = "rseq",
775 [294] = "kexec_file_load",
776 [424] = "pidfd_send_signal",
777 [425] = "io_uring_setup",
778 [426] = "io_uring_enter",
779 [427] = "io_uring_register",
780 [428] = "open_tree",
781 [429] = "move_mount",
782 [430] = "fsopen",
783 [431] = "fsconfig",
784 [432] = "fsmount",
785 [433] = "fspick",
786 [434] = "pidfd_open",
787 [435] = "clone3",
788 [436] = "close_range",
789 [437] = "openat2",
790 [438] = "pidfd_getfd",
791 [439] = "faccessat2",
792 [440] = "process_madvise",
793 [441] = "syscalls",
794 [442] = "mount_setattr",
795 [443] = "quotactl_fd",
796 [444] = "landlock_create_ruleset",
797 [445] = "landlock_add_rule",
798 [446] = "landlock_restrict_self",
799 [447] = "memfd_secret",
800 [448] = "process_mrelease",
801 [449] = "futex_waitv",
802 [450] = "set_mempolicy_home_node",
803 };
804 size_t syscall_names_generic_size = sizeof(syscall_names_generic)/sizeof(char*);
805 #endif
806
syscall_name(unsigned n,char * buf,size_t size)807 void syscall_name(unsigned n, char *buf, size_t size)
808 {
809 const char *name = NULL;
810
811 if (n < syscall_names_size)
812 name = syscall_names[n];
813 #ifdef __x86_64__
814 else if (n < syscall_names_x86_64_size)
815 name = syscall_names_x86_64[n];
816 #elif defined(__aarch64__) || defined(__riscv)
817 else if (n < syscall_names_generic_size)
818 name = syscall_names_generic[n];
819 #endif
820
821 if (name)
822 strncpy(buf, name, size-1);
823 else
824 snprintf(buf, size, "[unknown: %u]", n);
825 }
826
list_syscalls(void)827 int list_syscalls(void)
828 {
829 const char **list = syscall_names;
830 size_t i, size = syscall_names_size;
831
832 #ifdef __x86_64__
833 if (!size) {
834 size = syscall_names_x86_64_size;
835 list = syscall_names_x86_64;
836 }
837 #elif defined(__aarch64__) || defined(__riscv)
838 if (!size) {
839 size = syscall_names_generic_size;
840 list = syscall_names_generic;
841 }
842 #endif
843
844 for (i = 0; i < size; i++) {
845 if (list[i])
846 printf("%3zd: %s\n", i, list[i]);
847 }
848
849 return (!list || !size);
850 }
851
852