xref: /aosp_15_r20/external/bcc/libbpf-tools/syscall_helpers.c (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
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