Skip to main content

lurk_cli/arch/
aarch64.rs

1use crate::arch::SyscallArgType;
2use libc::{c_ulonglong, user_regs_struct};
3use std::ops::Index;
4use syscalls::aarch64::Sysno;
5use syscalls::SysnoSet;
6
7#[allow(clippy::enum_glob_use)]
8use syscalls::aarch64::Sysno::*;
9
10pub static TRACE_DESC: SysnoSet = SysnoSet::new(&[
11    // strace/src/linux/64/syscallent.h
12    fsetxattr,
13    fgetxattr,
14    flistxattr,
15    fremovexattr,
16    eventfd2,
17    epoll_create1,
18    epoll_ctl,
19    epoll_pwait,
20    dup,
21    dup3,
22    fcntl,
23    inotify_init1,
24    inotify_add_watch,
25    inotify_rm_watch,
26    ioctl,
27    flock,
28    mknodat,
29    mkdirat,
30    unlinkat,
31    symlinkat,
32    linkat,
33    renameat,
34    fstatfs,
35    ftruncate,
36    fallocate,
37    faccessat,
38    fchdir,
39    fchmod,
40    fchmodat,
41    fchownat,
42    fchown,
43    openat,
44    close,
45    pipe2,
46    getdents64,
47    lseek,
48    read,
49    write,
50    readv,
51    writev,
52    pread64,
53    pwrite64,
54    preadv,
55    pwritev,
56    sendfile,
57    pselect6,
58    ppoll,
59    signalfd4,
60    vmsplice,
61    splice,
62    tee,
63    readlinkat,
64    fstatat,
65    fstat,
66    fsync,
67    fdatasync,
68    sync_file_range,
69    timerfd_create,
70    timerfd_settime,
71    timerfd_gettime,
72    utimensat,
73    mq_open,
74    mq_timedsend,
75    mq_timedreceive,
76    mq_notify,
77    mq_getsetattr,
78    readahead,
79    mmap,
80    fadvise64,
81    perf_event_open,
82    fanotify_init,
83    fanotify_mark,
84    name_to_handle_at,
85    open_by_handle_at,
86    syncfs,
87    setns,
88    finit_module,
89    renameat2,
90    memfd_create,
91    bpf,
92    execveat,
93    userfaultfd,
94    copy_file_range,
95    preadv2,
96    pwritev2,
97    statx,
98    kexec_file_load,
99    // strace/src/linux/generic/syscallent-common.h
100    pidfd_send_signal,
101    io_uring_setup,
102    io_uring_enter,
103    io_uring_register,
104    open_tree,
105    move_mount,
106    fsopen,
107    fsconfig,
108    fsmount,
109    fspick,
110    pidfd_open,
111    openat2,
112    pidfd_getfd,
113    faccessat2,
114    process_madvise,
115    epoll_pwait2,
116    mount_setattr,
117    quotactl_fd,
118    landlock_create_ruleset,
119    landlock_add_rule,
120    landlock_restrict_self,
121    memfd_secret,
122    process_mrelease,
123    cachestat,
124    fchmodat2,
125]);
126
127pub static TRACE_FILE: SysnoSet = SysnoSet::new(&[
128    // strace/src/linux/64/syscallent.h
129    setxattr,
130    lsetxattr,
131    getxattr,
132    lgetxattr,
133    listxattr,
134    llistxattr,
135    removexattr,
136    lremovexattr,
137    getcwd,
138    inotify_add_watch,
139    mknodat,
140    mkdirat,
141    unlinkat,
142    symlinkat,
143    linkat,
144    renameat,
145    umount2,
146    mount,
147    pivot_root,
148    statfs,
149    fstatfs,
150    truncate,
151    faccessat,
152    chdir,
153    chroot,
154    fchmodat,
155    fchownat,
156    openat,
157    quotactl,
158    readlinkat,
159    fstatat,
160    fstat,
161    utimensat,
162    acct,
163    execve,
164    swapon,
165    swapoff,
166    fanotify_mark,
167    name_to_handle_at,
168    renameat2,
169    execveat,
170    statx,
171    // strace/src/linux/generic/syscallent-common.h
172    open_tree,
173    move_mount,
174    fsconfig,
175    fspick,
176    openat2,
177    faccessat2,
178    mount_setattr,
179    fchmodat2,
180]);
181
182pub static TRACE_IPC: SysnoSet = SysnoSet::new(&[
183    msgget, msgctl, msgrcv, msgsnd, semget, semctl, semtimedop, semop, shmget, shmctl, shmat, shmdt,
184]);
185
186pub static TRACE_NETWORK: SysnoSet = SysnoSet::new(&[
187    sendfile,
188    socket,
189    socketpair,
190    bind,
191    listen,
192    accept,
193    connect,
194    getsockname,
195    getpeername,
196    sendto,
197    recvfrom,
198    setsockopt,
199    getsockopt,
200    shutdown,
201    sendmsg,
202    recvmsg,
203    accept4,
204    recvmmsg,
205    sendmmsg,
206]);
207
208pub static TRACE_PROCESS: SysnoSet = SysnoSet::new(&[
209    // strace/src/linux/64/syscallent.h
210    exit,
211    exit_group,
212    waitid,
213    kill,
214    tkill,
215    tgkill,
216    rt_sigqueueinfo,
217    clone,
218    execve,
219    rt_tgsigqueueinfo,
220    wait4,
221    execveat,
222    // strace/src/linux/generic/syscallent-common.h
223    pidfd_send_signal,
224    clone3,
225]);
226
227pub static TRACE_SIGNAL: SysnoSet = SysnoSet::new(&[
228    // strace/src/linux/64/syscallent.h
229    statfs,
230    fstatfs,
231    signalfd4,
232    fstatat,
233    fstat,
234    kill,
235    tkill,
236    tgkill,
237    sigaltstack,
238    rt_sigsuspend,
239    rt_sigaction,
240    rt_sigprocmask,
241    rt_sigpending,
242    rt_sigtimedwait,
243    rt_sigqueueinfo,
244    rt_sigreturn,
245    execve,
246    rt_tgsigqueueinfo,
247    execveat,
248    statx,
249    // strace/src/linux/generic/syscallent-common.h
250    pidfd_send_signal,
251    io_uring_enter,
252]);
253
254pub static TRACE_MEMORY: SysnoSet = SysnoSet::new(&[
255    // strace/src/linux/64/syscallent.h
256    io_setup,
257    io_destroy,
258    shmat,
259    shmdt,
260    brk,
261    munmap,
262    mremap,
263    mmap,
264    mprotect,
265    msync,
266    mlock,
267    munlock,
268    mlockall,
269    munlockall,
270    mincore,
271    madvise,
272    remap_file_pages,
273    mbind,
274    get_mempolicy,
275    set_mempolicy,
276    migrate_pages,
277    move_pages,
278    mlock2,
279    pkey_mprotect,
280    // strace/src/linux/generic/syscallent-common.h
281    io_uring_register,
282    set_mempolicy_home_node,
283    map_shadow_stack,
284]);
285
286pub static TRACE_STAT: SysnoSet = SysnoSet::new(&[fstatat, fstat, statx]);
287pub static TRACE_LSTAT: SysnoSet = SysnoSet::new(&[]);
288pub static TRACE_FSTAT: SysnoSet = SysnoSet::new(&[fstatat, fstat, statx]);
289pub static TRACE_STAT_LIKE: SysnoSet = SysnoSet::new(&[fstatat, fstat, statx]);
290pub static TRACE_STATFS: SysnoSet = SysnoSet::new(&[statfs, fstatfs]);
291pub static TRACE_FSTATFS: SysnoSet = SysnoSet::new(&[fstatfs]);
292pub static TRACE_STATFS_LIKE: SysnoSet = SysnoSet::new(&[statfs, fstatfs]);
293
294pub static TRACE_PURE: SysnoSet =
295    SysnoSet::new(&[getpid, getppid, getuid, geteuid, getgid, getegid, gettid]);
296
297pub static TRACE_CREDS: SysnoSet = SysnoSet::new(&[
298    capget,
299    capset,
300    clock_settime,
301    clock_gettime,
302    clock_getres,
303    setregid,
304    setgid,
305    setreuid,
306    setuid,
307    setresuid,
308    getresuid,
309    setresgid,
310    getresgid,
311    setfsuid,
312    setfsgid,
313    getgroups,
314    setgroups,
315    prctl,
316    gettimeofday,
317    settimeofday,
318    adjtimex,
319    getuid,
320    geteuid,
321    getgid,
322    getegid,
323    clock_adjtime,
324]);
325
326pub static TRACE_CLOCK: SysnoSet = SysnoSet::new(&[
327    clock_settime,
328    clock_gettime,
329    clock_getres,
330    gettimeofday,
331    settimeofday,
332    adjtimex,
333    clock_adjtime,
334]);
335
336macro_rules! syscall {
337    ($name:ident $(,)?) => {
338        Some((Sysno::$name, [None, None, None, None, None, None]))
339    };
340    ($name:ident, $arg0:ident $(,)?) => {
341        Some((Sysno::$name, [$arg0, None, None, None, None, None]))
342    };
343    ($name:ident, $arg0:ident, $arg1:ident $(,)?) => {
344        Some((Sysno::$name, [$arg0, $arg1, None, None, None, None]))
345    };
346    ($name:ident, $arg0:ident, $arg1:ident, $arg2:ident $(,)?) => {
347        Some((Sysno::$name, [$arg0, $arg1, $arg2, None, None, None]))
348    };
349    ($name:ident, $arg0:ident, $arg1:ident, $arg2:ident, $arg3:ident $(,)?) => {
350        Some((Sysno::$name, [$arg0, $arg1, $arg2, $arg3, None, None]))
351    };
352    ($name:ident, $arg0:ident, $arg1:ident, $arg2:ident, $arg3:ident, $arg4:ident $(,)?) => {
353        Some((Sysno::$name, [$arg0, $arg1, $arg2, $arg3, $arg4, None]))
354    };
355    ($name:ident, $arg0:ident, $arg1:ident, $arg2:ident, $arg3:ident, $arg4:ident, $arg5:ident $(,)?) => {
356        Some((Sysno::$name, [$arg0, $arg1, $arg2, $arg3, $arg4, $arg5]))
357    };
358}
359
360const ADDR: Option<SyscallArgType> = Some(SyscallArgType::Addr);
361const INT: Option<SyscallArgType> = Some(SyscallArgType::Int);
362const STR: Option<SyscallArgType> = Some(SyscallArgType::Str);
363
364pub struct Aarch64Syscalls {
365    _0: [Option<(Sysno, [Option<SyscallArgType>; 6])>; 244],
366    _260: [Option<(Sysno, [Option<SyscallArgType>; 6])>; 35],
367    _424: [Option<(Sysno, [Option<SyscallArgType>; 6])>; 29],
368}
369
370impl Aarch64Syscalls {
371    pub fn get(&self, index: usize) -> Option<&Option<(Sysno, [Option<SyscallArgType>; 6])>> {
372        let result = match index {
373            0..=243 => &self._0[index],
374            260..=294 => &self._260[index - 260],
375            424..=452 => &self._424[index - 424],
376            _ => return None,
377        };
378        Some(result)
379    }
380}
381
382impl Index<usize> for Aarch64Syscalls {
383    type Output = Option<(Sysno, [Option<SyscallArgType>; 6])>;
384
385    fn index(&self, index: usize) -> &Self::Output {
386        self.get(index).expect("unimplemented syscall")
387    }
388}
389
390pub static SYSCALLS: Aarch64Syscalls = Aarch64Syscalls {
391    _0: [
392        syscall!(io_setup, INT, ADDR),
393        syscall!(io_destroy, INT),
394        syscall!(io_submit, INT, INT, ADDR),
395        syscall!(io_cancel, INT, ADDR, ADDR),
396        syscall!(io_getevents, INT, INT, INT, ADDR, ADDR),
397        syscall!(setxattr, STR, STR, ADDR, INT, INT),
398        syscall!(lsetxattr, STR, STR, ADDR, INT, INT),
399        syscall!(fsetxattr, INT, STR, ADDR, INT, INT),
400        syscall!(getxattr, STR, STR, ADDR, INT),
401        syscall!(lgetxattr, STR, STR, ADDR, INT),
402        syscall!(fgetxattr, INT, STR, ADDR, INT),
403        syscall!(listxattr, STR, STR, INT),
404        syscall!(llistxattr, STR, STR, INT),
405        syscall!(flistxattr, INT, STR, INT),
406        syscall!(removexattr, STR, STR),
407        syscall!(lremovexattr, STR, STR),
408        syscall!(fremovexattr, INT, STR),
409        syscall!(getcwd, STR, INT),
410        syscall!(lookup_dcookie, INT, STR, INT),
411        syscall!(eventfd2, INT, INT),
412        syscall!(epoll_create1, INT),
413        syscall!(epoll_ctl, INT, INT, INT, ADDR),
414        syscall!(epoll_pwait, INT, ADDR, INT, INT, ADDR, INT),
415        syscall!(dup, INT),
416        syscall!(dup3, INT, INT, INT),
417        syscall!(fcntl, INT, INT, INT),
418        syscall!(inotify_init1, INT),
419        syscall!(inotify_add_watch, INT, STR, INT),
420        syscall!(inotify_rm_watch, INT, INT),
421        syscall!(ioctl, INT, INT, INT),
422        syscall!(ioprio_set, INT, INT, INT),
423        syscall!(ioprio_get, INT, INT),
424        syscall!(flock, INT, INT),
425        syscall!(mknodat, INT, STR, INT, INT),
426        syscall!(mkdirat, INT, STR, INT),
427        syscall!(unlinkat, INT, STR, INT),
428        syscall!(symlinkat, STR, INT, STR),
429        syscall!(linkat, INT, STR, INT, STR, INT),
430        syscall!(renameat, INT, STR, INT, STR),
431        syscall!(umount2, STR, INT),
432        syscall!(mount, STR, STR, STR, INT, ADDR),
433        syscall!(pivot_root, STR, STR),
434        syscall!(nfsservctl, INT, ADDR, ADDR),
435        syscall!(statfs, STR, ADDR),
436        syscall!(fstatfs, INT, ADDR),
437        syscall!(truncate, STR, INT),
438        syscall!(ftruncate, INT, INT),
439        syscall!(fallocate, INT, INT, INT, INT),
440        syscall!(faccessat, INT, STR, INT),
441        syscall!(chdir, STR),
442        syscall!(fchdir, INT),
443        syscall!(chroot, STR),
444        syscall!(fchmod, INT, INT),
445        syscall!(fchmodat, INT, STR, INT),
446        syscall!(fchownat, INT, STR, INT, INT, INT),
447        syscall!(fchown, INT, INT, INT),
448        syscall!(openat, INT, STR, INT, INT),
449        syscall!(close, INT),
450        syscall!(vhangup),
451        syscall!(pipe2, ADDR, INT),
452        syscall!(quotactl, INT, STR, INT, ADDR),
453        syscall!(getdents64, INT, ADDR, INT),
454        syscall!(lseek, INT, INT, INT),
455        syscall!(read, INT, STR, INT),
456        syscall!(write, INT, STR, INT),
457        syscall!(readv, INT, ADDR, INT),
458        syscall!(writev, INT, ADDR, INT),
459        syscall!(pread64, INT, STR, INT, INT),
460        syscall!(pwrite64, INT, STR, INT, INT),
461        syscall!(preadv, INT, ADDR, INT, INT, INT),
462        syscall!(pwritev, INT, ADDR, INT, INT, INT),
463        syscall!(sendfile, INT, INT, ADDR, INT),
464        syscall!(pselect6, INT, ADDR, ADDR, ADDR, ADDR, ADDR),
465        syscall!(ppoll, ADDR, INT, ADDR, ADDR, INT),
466        syscall!(signalfd4, INT, ADDR, INT, INT),
467        syscall!(vmsplice, INT, ADDR, INT, INT),
468        syscall!(splice, INT, ADDR, INT, ADDR, INT, INT),
469        syscall!(tee, INT, INT, INT, INT),
470        syscall!(readlinkat, INT, STR, STR, INT),
471        syscall!(fstatat, INT, STR, ADDR, INT),
472        syscall!(fstat, INT, ADDR),
473        syscall!(sync),
474        syscall!(fsync, INT),
475        syscall!(fdatasync, INT),
476        syscall!(sync_file_range, INT, INT, INT, INT),
477        syscall!(timerfd_create, INT, INT),
478        syscall!(timerfd_settime, INT, INT, ADDR, ADDR),
479        syscall!(timerfd_gettime, INT, ADDR),
480        syscall!(utimensat, INT, STR, ADDR, INT),
481        syscall!(acct, STR),
482        syscall!(capget, ADDR, ADDR),
483        syscall!(capset, ADDR, ADDR),
484        syscall!(personality, INT),
485        syscall!(exit, INT),
486        syscall!(exit_group, INT),
487        syscall!(waitid, INT, INT, ADDR, INT, ADDR),
488        syscall!(set_tid_address, ADDR),
489        syscall!(unshare, INT),
490        syscall!(futex, ADDR, INT, INT, ADDR, ADDR, INT),
491        syscall!(set_robust_list, ADDR, INT),
492        syscall!(get_robust_list, INT, ADDR, ADDR),
493        syscall!(nanosleep, ADDR, ADDR),
494        syscall!(getitimer, INT, ADDR),
495        syscall!(setitimer, INT, ADDR, ADDR),
496        syscall!(kexec_load, INT, INT, ADDR, INT),
497        syscall!(init_module, ADDR, INT, STR),
498        syscall!(delete_module, STR, INT),
499        syscall!(timer_create, INT, ADDR, ADDR),
500        syscall!(timer_gettime, INT, ADDR),
501        syscall!(timer_getoverrun, INT),
502        syscall!(timer_settime, INT, INT, ADDR, ADDR),
503        syscall!(timer_delete, INT),
504        syscall!(clock_settime, INT, ADDR),
505        syscall!(clock_gettime, INT, ADDR),
506        syscall!(clock_getres, INT, ADDR),
507        syscall!(clock_nanosleep, INT, INT, ADDR, ADDR),
508        syscall!(syslog, INT, STR, INT),
509        syscall!(ptrace, INT, INT, INT, INT),
510        syscall!(sched_setparam, INT, ADDR),
511        syscall!(sched_setscheduler, INT, INT, ADDR),
512        syscall!(sched_getscheduler, INT),
513        syscall!(sched_getparam, INT, ADDR),
514        syscall!(sched_setaffinity, INT, INT, ADDR),
515        syscall!(sched_getaffinity, INT, INT, ADDR),
516        syscall!(sched_yield),
517        syscall!(sched_get_priority_max, INT),
518        syscall!(sched_get_priority_min, INT),
519        syscall!(sched_rr_get_interval, INT, ADDR),
520        syscall!(restart_syscall),
521        syscall!(kill, INT, INT),
522        syscall!(tkill, INT, INT),
523        syscall!(tgkill, INT, INT, INT),
524        syscall!(sigaltstack, ADDR, ADDR),
525        syscall!(rt_sigsuspend, ADDR, INT),
526        syscall!(rt_sigaction, INT, ADDR, ADDR, INT),
527        syscall!(rt_sigprocmask, INT, ADDR, ADDR, INT),
528        syscall!(rt_sigpending, ADDR, INT),
529        syscall!(rt_sigtimedwait, ADDR, ADDR, ADDR, INT),
530        syscall!(rt_sigqueueinfo, INT, INT, ADDR),
531        syscall!(rt_sigreturn),
532        syscall!(setpriority, INT, INT, INT),
533        syscall!(getpriority, INT, INT),
534        syscall!(reboot, INT, INT, INT, ADDR),
535        syscall!(setregid, INT, INT),
536        syscall!(setgid, INT),
537        syscall!(setreuid, INT, INT),
538        syscall!(setuid, INT),
539        syscall!(setresuid, INT, INT, INT),
540        syscall!(getresuid, ADDR, ADDR, ADDR),
541        syscall!(setresgid, INT, INT, INT),
542        syscall!(getresgid, ADDR, ADDR, ADDR),
543        syscall!(setfsuid, INT),
544        syscall!(setfsgid, INT),
545        syscall!(times, ADDR),
546        syscall!(setpgid, INT, INT),
547        syscall!(getpgid, INT),
548        syscall!(getsid, INT),
549        syscall!(setsid),
550        syscall!(getgroups, INT, ADDR),
551        syscall!(setgroups, INT, ADDR),
552        syscall!(uname, ADDR),
553        syscall!(sethostname, STR, INT),
554        syscall!(setdomainname, STR, INT),
555        syscall!(getrlimit, INT, ADDR),
556        syscall!(setrlimit, INT, ADDR),
557        syscall!(getrusage, INT, ADDR),
558        syscall!(umask, INT),
559        syscall!(prctl, INT, INT, INT, INT, INT),
560        syscall!(getcpu, ADDR, ADDR, ADDR),
561        syscall!(gettimeofday, ADDR, ADDR),
562        syscall!(settimeofday, ADDR, ADDR),
563        syscall!(adjtimex, ADDR),
564        syscall!(getpid),
565        syscall!(getppid),
566        syscall!(getuid),
567        syscall!(geteuid),
568        syscall!(getgid),
569        syscall!(getegid),
570        syscall!(gettid),
571        syscall!(sysinfo, ADDR),
572        syscall!(mq_open, STR, INT, INT, ADDR),
573        syscall!(mq_unlink, STR),
574        syscall!(mq_timedsend, INT, STR, INT, INT, ADDR),
575        syscall!(mq_timedreceive, INT, STR, INT, ADDR, ADDR),
576        syscall!(mq_notify, INT, ADDR),
577        syscall!(mq_getsetattr, INT, ADDR, ADDR),
578        syscall!(msgget, INT, INT),
579        syscall!(msgctl, INT, INT, ADDR),
580        syscall!(msgrcv, INT, ADDR, INT, INT, INT),
581        syscall!(msgsnd, INT, ADDR, INT, INT),
582        syscall!(semget, INT, INT, INT),
583        syscall!(semctl, INT, INT, INT, INT),
584        syscall!(semtimedop, INT, ADDR, INT, ADDR),
585        syscall!(semop, INT, ADDR, INT),
586        syscall!(shmget, INT, INT, INT),
587        syscall!(shmctl, INT, INT, ADDR),
588        syscall!(shmat, INT, STR, INT),
589        syscall!(shmdt, STR),
590        syscall!(socket, INT, INT, INT),
591        syscall!(socketpair, INT, INT, INT, ADDR),
592        syscall!(bind, INT, ADDR, INT),
593        syscall!(listen, INT, INT),
594        syscall!(accept, INT, ADDR, ADDR),
595        syscall!(connect, INT, ADDR, INT),
596        syscall!(getsockname, INT, ADDR, ADDR),
597        syscall!(getpeername, INT, ADDR, ADDR),
598        syscall!(sendto, INT, ADDR, INT, INT, ADDR, INT),
599        syscall!(recvfrom, INT, ADDR, INT, INT, ADDR, ADDR),
600        syscall!(setsockopt, INT, INT, INT, STR, INT),
601        syscall!(getsockopt, INT, INT, INT, STR, ADDR),
602        syscall!(shutdown, INT, INT),
603        syscall!(sendmsg, INT, ADDR, INT),
604        syscall!(recvmsg, INT, ADDR, INT),
605        syscall!(readahead, INT, INT, INT),
606        syscall!(brk, INT),
607        syscall!(munmap, INT, INT),
608        syscall!(mremap, INT, INT, INT, INT, INT),
609        syscall!(add_key, STR, STR, ADDR, INT, INT),
610        syscall!(request_key, STR, STR, STR, INT),
611        syscall!(keyctl, INT, INT, INT, INT, INT),
612        syscall!(clone, INT, INT, ADDR, INT, ADDR),
613        syscall!(execve, STR, STR, STR),
614        syscall!(mmap, ADDR, INT, INT, INT, INT, INT),
615        syscall!(fadvise64, INT, INT, INT, INT),
616        syscall!(swapon, STR, INT),
617        syscall!(swapoff, STR),
618        syscall!(mprotect, INT, INT, INT),
619        syscall!(msync, INT, INT, INT),
620        syscall!(mlock, INT, INT),
621        syscall!(munlock, INT, INT),
622        syscall!(mlockall, INT),
623        syscall!(munlockall),
624        syscall!(mincore, INT, INT, ADDR),
625        syscall!(madvise, INT, INT, INT),
626        syscall!(remap_file_pages, INT, INT, INT, INT, INT),
627        syscall!(mbind, INT, INT, INT, ADDR, INT, INT),
628        syscall!(get_mempolicy, ADDR, ADDR, INT, INT, INT),
629        syscall!(set_mempolicy, INT, ADDR, INT),
630        syscall!(migrate_pages, INT, INT, ADDR, ADDR),
631        syscall!(move_pages, INT, INT, ADDR, ADDR, ADDR, INT),
632        syscall!(rt_tgsigqueueinfo, INT, INT, INT, ADDR),
633        syscall!(perf_event_open, ADDR, INT, INT, INT, INT),
634        syscall!(accept4, INT, ADDR, ADDR, INT),
635        syscall!(recvmmsg, INT, ADDR, INT, INT, ADDR),
636    ],
637    _260: [
638        syscall!(wait4, INT, ADDR, INT, ADDR),
639        syscall!(prlimit64, INT, INT, ADDR, ADDR),
640        syscall!(fanotify_init, INT, INT),
641        syscall!(fanotify_mark, INT, INT, INT, INT, STR),
642        syscall!(name_to_handle_at, INT, STR, ADDR, INT, INT),
643        syscall!(open_by_handle_at, INT, ADDR, INT),
644        syscall!(clock_adjtime, INT, ADDR),
645        syscall!(syncfs, INT),
646        syscall!(setns, INT, INT),
647        syscall!(sendmmsg, INT, ADDR, INT, INT),
648        syscall!(process_vm_readv, INT, ADDR, INT, ADDR, INT, INT),
649        syscall!(process_vm_writev, INT, ADDR, INT, ADDR, INT, INT),
650        syscall!(kcmp, INT, INT, INT, INT, INT),
651        syscall!(finit_module, INT, STR, INT),
652        syscall!(sched_setattr, INT, ADDR, INT),
653        syscall!(sched_getattr, INT, ADDR, INT, INT),
654        syscall!(renameat2, INT, STR, INT, STR, INT),
655        syscall!(seccomp, INT, INT, ADDR),
656        syscall!(getrandom, STR, INT, INT),
657        syscall!(memfd_create, STR, INT),
658        syscall!(bpf, INT, ADDR, INT),
659        syscall!(execveat, INT, STR, STR, STR, INT),
660        syscall!(userfaultfd, INT),
661        syscall!(membarrier, INT, INT, INT),
662        syscall!(mlock2, INT, INT, INT),
663        syscall!(copy_file_range, INT, ADDR, INT, ADDR, INT, INT),
664        syscall!(preadv2, INT, ADDR, INT, INT, INT, INT),
665        syscall!(pwritev2, INT, ADDR, INT, INT, INT, INT),
666        syscall!(pkey_mprotect, INT, INT, INT, INT),
667        syscall!(pkey_alloc, INT, INT),
668        syscall!(pkey_free, INT),
669        syscall!(statx, INT, STR, INT, INT, ADDR),
670        syscall!(io_pgetevents, INT, INT, INT, ADDR, ADDR, ADDR),
671        syscall!(rseq, ADDR, INT, INT, INT),
672        syscall!(kexec_file_load, INT, INT, INT, STR, INT),
673    ],
674    _424: [
675        syscall!(pidfd_send_signal, INT, INT, ADDR, INT),
676        syscall!(io_uring_setup, INT, ADDR),
677        syscall!(io_uring_enter, INT, INT, INT, INT, ADDR, INT),
678        syscall!(io_uring_register, INT, INT, ADDR, INT),
679        syscall!(open_tree, INT, STR, INT),
680        syscall!(move_mount, INT, STR, INT, STR, INT),
681        syscall!(fsopen, STR, INT),
682        syscall!(fsconfig, INT, INT, STR, ADDR, INT),
683        syscall!(fsmount, INT, INT, INT),
684        syscall!(fspick, INT, STR, INT),
685        syscall!(pidfd_open, INT, INT),
686        syscall!(clone3, ADDR, INT),
687        syscall!(close_range, INT, INT, INT),
688        syscall!(openat2, INT, STR, ADDR, INT),
689        syscall!(pidfd_getfd, INT, INT, INT),
690        syscall!(faccessat2, INT, STR, INT, INT),
691        syscall!(process_madvise, INT, ADDR, INT, INT, INT),
692        syscall!(epoll_pwait2, INT, ADDR, INT, ADDR, ADDR, INT),
693        syscall!(mount_setattr, INT, STR, INT, ADDR, INT),
694        syscall!(quotactl_fd, INT, INT, INT, ADDR),
695        syscall!(landlock_create_ruleset, ADDR, INT, INT),
696        syscall!(landlock_add_rule, INT, ADDR, ADDR, INT),
697        syscall!(landlock_restrict_self, INT, INT),
698        syscall!(memfd_secret, INT),
699        syscall!(process_mrelease, INT, INT),
700        syscall!(futex_waitv, ADDR, INT, INT, ADDR, INT),
701        syscall!(set_mempolicy_home_node, INT, INT, INT, INT),
702        syscall!(cachestat, INT, INT, INT, INT),
703        syscall!(fchmodat2, INT, STR, INT, INT),
704    ],
705};
706
707pub fn get_arg_value(registers: user_regs_struct, i: usize) -> c_ulonglong {
708    match i {
709        0 => registers.regs[0],
710        1 => registers.regs[1],
711        2 => registers.regs[2],
712        3 => registers.regs[3],
713        4 => registers.regs[4],
714        5 => registers.regs[5],
715        v => panic!("Invalid system call index {v}!"),
716    }
717}
718
719// test that all syscalls match their syscall number
720#[cfg(test)]
721mod tests {
722    use super::*;
723
724    #[test]
725    fn test_syscall_numbers() {
726        for (i, sysno, ..) in SYSCALLS._0.iter().enumerate() {
727            if let Some((sysno, _)) = sysno {
728                assert_eq!(i, sysno.id() as usize);
729            }
730        }
731        for (i, sysno, ..) in SYSCALLS._260.iter().enumerate() {
732            if let Some((sysno, _)) = sysno {
733                assert_eq!(i + 260, sysno.id() as usize);
734            }
735        }
736        for (i, sysno, ..) in SYSCALLS._424.iter().enumerate() {
737            if let Some((sysno, _)) = sysno {
738                assert_eq!(i + 424, sysno.id() as usize);
739            }
740        }
741    }
742}