get-syscalls.py
generates syscall informations.syscalls-table-riscv.rs
is an example of usingget-syscalls.py
to generate ones for RISC-V, with manual modifications noted.
Created
May 24, 2023 11:43
-
-
Save hack3ric/45685e367c323b2e57cf05dad36e35cc to your computer and use it in GitHub Desktop.
Generate syscall info for Lurk
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Extracts syscall parameter info from Linux source headers. | |
Note that there might be missing some syscalls in the final result, or there | |
may be false positives. Manual check is needed after generation. | |
""" | |
import sys | |
import requests | |
import re | |
syscalls = requests.get( | |
"https://github.com/torvalds/linux/raw/master/include/linux/syscalls.h") | |
syscalls_regex = re.compile( | |
r'asmlinkage long sys_([\w\d_]+?)\(([^"]+?)\);', re.MULTILINE) | |
syscalls_matches = re.findall(syscalls_regex, syscalls.text) | |
defines = requests.get( | |
"https://github.com/torvalds/linux/raw/master/include/uapi/asm-generic/unistd.h") | |
defines_regex = re.compile(r'#define __NR[^_]*_([\w\d_]+) (\d+)') | |
defines_matches = re.findall(defines_regex, defines.text) | |
integers = ("int", "long", "uint32_t", "unsigned", "u32", "u64", "size_t", "pid_t", "s32", | |
"mqd_t", "loff_t", "clockid_t", "timer_t", "umode_t", "uid_t", "gid_t", "key_t", | |
"aio_context_t", "rwf_t", "qid_t", "__s32", "key_serial_t", "__u32", "off_t") | |
structs = ("struct", "enum", "union", "cap_user_header_t", "cap_user_data_t") | |
table = [] | |
for a, b in defines_matches: | |
for c, d in syscalls_matches: | |
if c == a: | |
params = [] | |
for p in d.split(','): | |
p = p.strip().removeprefix("const").strip() | |
if '*' not in p and p.startswith(integers): | |
params.append("INT") | |
elif '*' in p and p.startswith("char"): | |
params.append("STR") | |
elif '*' in p or p.startswith(structs): | |
params.append("ADDR") | |
elif p.startswith("void"): | |
params.append("VOID") | |
else: | |
print("UNKNOWN:", p, file=sys.stderr) | |
params.append("UNKNOWN") | |
if len(params) == 1 and params[0] == "VOID": | |
params = [] | |
table.append((b, a, params)) | |
break | |
else: | |
table.append((b, a, None)) | |
prev = -999 | |
for num, name, params in table: | |
num = int(num) | |
if num - prev > 1: | |
print(f"// {num}") | |
if params: | |
print(f"syscall!({name}, {', '.join(params)}),") | |
elif params != None: | |
print(f"syscall!({name}),") | |
else: | |
print(f"// TODO: syscall!({name})") | |
prev = num |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 0 | |
syscall!(io_setup, INT, ADDR), | |
syscall!(io_destroy, INT), | |
syscall!(io_submit, INT, INT, ADDR), | |
syscall!(io_cancel, INT, ADDR, ADDR), | |
syscall!(io_getevents, INT, INT, INT, ADDR, ADDR), | |
syscall!(setxattr, STR, STR, ADDR, INT, INT), | |
syscall!(lsetxattr, STR, STR, ADDR, INT, INT), | |
syscall!(fsetxattr, INT, STR, ADDR, INT, INT), | |
syscall!(getxattr, STR, STR, ADDR, INT), | |
syscall!(lgetxattr, STR, STR, ADDR, INT), | |
syscall!(fgetxattr, INT, STR, ADDR, INT), | |
syscall!(listxattr, STR, STR, INT), | |
syscall!(llistxattr, STR, STR, INT), | |
syscall!(flistxattr, INT, STR, INT), | |
syscall!(removexattr, STR, STR), | |
syscall!(lremovexattr, STR, STR), | |
syscall!(fremovexattr, INT, STR), | |
syscall!(getcwd, STR, INT), | |
syscall!(lookup_dcookie, INT, STR, INT), | |
syscall!(eventfd2, INT, INT), | |
syscall!(epoll_create1, INT), | |
syscall!(epoll_ctl, INT, INT, INT, ADDR), | |
syscall!(epoll_pwait, INT, ADDR, INT, INT, ADDR, INT), | |
syscall!(dup, INT), | |
syscall!(dup3, INT, INT, INT), | |
syscall!(fcntl, INT, INT, INT), | |
syscall!(inotify_init1, INT), | |
syscall!(inotify_add_watch, INT, STR, INT), | |
syscall!(inotify_rm_watch, INT, INT), | |
syscall!(ioctl, INT, INT, INT), | |
syscall!(ioprio_set, INT, INT, INT), | |
syscall!(ioprio_get, INT, INT), | |
syscall!(flock, INT, INT), | |
syscall!(mknodat, INT, STR, INT, INT), | |
syscall!(mkdirat, INT, STR, INT), | |
syscall!(unlinkat, INT, STR, INT), | |
syscall!(symlinkat, STR, INT, STR), | |
syscall!(linkat, INT, STR, INT, STR, INT), | |
syscall!(renameat, INT, STR, INT, STR), | |
syscall!(umount2, STR, INT), // manually added | |
syscall!(mount, STR, STR, STR, INT, ADDR), | |
syscall!(pivot_root, STR, STR), | |
syscall!(nfsservctl, INT, ADDR, ADDR), // manually added | |
syscall!(statfs, STR, ADDR), | |
syscall!(fstatfs, INT, ADDR), | |
syscall!(truncate, STR, INT), | |
syscall!(ftruncate, INT, INT), | |
syscall!(fallocate, INT, INT, INT, INT), | |
syscall!(faccessat, INT, STR, INT), | |
syscall!(chdir, STR), | |
syscall!(fchdir, INT), | |
syscall!(chroot, STR), | |
syscall!(fchmod, INT, INT), | |
syscall!(fchmodat, INT, STR, INT), | |
syscall!(fchownat, INT, STR, INT, INT, INT), | |
syscall!(fchown, INT, INT, INT), | |
syscall!(openat, INT, STR, INT, INT), | |
syscall!(close, INT), | |
syscall!(vhangup), | |
syscall!(pipe2, ADDR, INT), | |
syscall!(quotactl, INT, STR, INT, ADDR), | |
syscall!(getdents64, INT, ADDR, INT), | |
syscall!(lseek, INT, INT, INT), | |
syscall!(read, INT, STR, INT), | |
syscall!(write, INT, STR, INT), | |
syscall!(readv, INT, ADDR, INT), | |
syscall!(writev, INT, ADDR, INT), | |
syscall!(pread64, INT, STR, INT, INT), | |
syscall!(pwrite64, INT, STR, INT, INT), | |
syscall!(preadv, INT, ADDR, INT, INT, INT), | |
syscall!(pwritev, INT, ADDR, INT, INT, INT), | |
syscall!(sendfile, INT, INT, ADDR, INT), | |
syscall!(pselect6, INT, ADDR, ADDR, ADDR, ADDR, ADDR), | |
syscall!(ppoll, ADDR, INT, ADDR, ADDR, INT), | |
syscall!(signalfd4, INT, ADDR, INT, INT), | |
syscall!(vmsplice, INT, ADDR, INT, INT), | |
syscall!(splice, INT, ADDR, INT, ADDR, INT, INT), | |
syscall!(tee, INT, INT, INT, INT), | |
syscall!(readlinkat, INT, STR, STR, INT), | |
syscall!(fstatat, INT, STR, ADDR, INT), // manually added | |
syscall!(fstat, INT, ADDR), | |
syscall!(sync), | |
syscall!(fsync, INT), | |
syscall!(fdatasync, INT), | |
syscall!(sync_file_range2, INT, INT, INT, INT), | |
syscall!(sync_file_range, INT, INT, INT, INT), | |
syscall!(timerfd_create, INT, INT), | |
syscall!(timerfd_settime, INT, INT, ADDR, ADDR), | |
syscall!(timerfd_gettime, INT, ADDR), | |
syscall!(utimensat, INT, STR, ADDR, INT), | |
syscall!(acct, STR), | |
syscall!(capget, ADDR, ADDR), | |
syscall!(capset, ADDR, ADDR), | |
syscall!(personality, INT), | |
syscall!(exit, INT), | |
syscall!(exit_group, INT), | |
syscall!(waitid, INT, INT, ADDR, INT, ADDR), | |
syscall!(set_tid_address, ADDR), | |
syscall!(unshare, INT), | |
syscall!(futex, ADDR, INT, INT, ADDR, ADDR, INT), | |
syscall!(set_robust_list, ADDR, INT), | |
syscall!(get_robust_list, INT, ADDR, ADDR), | |
syscall!(nanosleep, ADDR, ADDR), | |
syscall!(getitimer, INT, ADDR), | |
syscall!(setitimer, INT, ADDR, ADDR), | |
syscall!(kexec_load, INT, INT, ADDR, INT), | |
syscall!(init_module, ADDR, INT, STR), | |
syscall!(delete_module, STR, INT), | |
syscall!(timer_create, INT, ADDR, ADDR), | |
syscall!(timer_gettime, INT, ADDR), | |
syscall!(timer_getoverrun, INT), | |
syscall!(timer_settime, INT, INT, ADDR, ADDR), | |
syscall!(timer_delete, INT), | |
syscall!(clock_settime, INT, ADDR), | |
syscall!(clock_gettime, INT, ADDR), | |
syscall!(clock_getres, INT, ADDR), | |
syscall!(clock_nanosleep, INT, INT, ADDR, ADDR), | |
syscall!(syslog, INT, STR, INT), | |
syscall!(ptrace, INT, INT, INT, INT), | |
syscall!(sched_setparam, INT, ADDR), | |
syscall!(sched_setscheduler, INT, INT, ADDR), | |
syscall!(sched_getscheduler, INT), | |
syscall!(sched_getparam, INT, ADDR), | |
syscall!(sched_setaffinity, INT, INT, ADDR), | |
syscall!(sched_getaffinity, INT, INT, ADDR), | |
syscall!(sched_yield), | |
syscall!(sched_get_priority_max, INT), | |
syscall!(sched_get_priority_min, INT), | |
syscall!(sched_rr_get_interval, INT, ADDR), | |
syscall!(restart_syscall), | |
syscall!(kill, INT, INT), | |
syscall!(tkill, INT, INT), | |
syscall!(tgkill, INT, INT, INT), | |
syscall!(sigaltstack, ADDR, ADDR), | |
syscall!(rt_sigsuspend, ADDR, INT), | |
syscall!(rt_sigaction, INT, ADDR, ADDR, INT), | |
syscall!(rt_sigprocmask, INT, ADDR, ADDR, INT), | |
syscall!(rt_sigpending, ADDR, INT), | |
syscall!(rt_sigtimedwait, ADDR, ADDR, ADDR, INT), | |
syscall!(rt_sigqueueinfo, INT, INT, ADDR), | |
syscall!(rt_sigreturn), // manually added | |
syscall!(setpriority, INT, INT, INT), | |
syscall!(getpriority, INT, INT), | |
syscall!(reboot, INT, INT, INT, ADDR), | |
syscall!(setregid, INT, INT), | |
syscall!(setgid, INT), | |
syscall!(setreuid, INT, INT), | |
syscall!(setuid, INT), | |
syscall!(setresuid, INT, INT, INT), | |
syscall!(getresuid, ADDR, ADDR, ADDR), | |
syscall!(setresgid, INT, INT, INT), | |
syscall!(getresgid, ADDR, ADDR, ADDR), | |
syscall!(setfsuid, INT), | |
syscall!(setfsgid, INT), | |
syscall!(times, ADDR), | |
syscall!(setpgid, INT, INT), | |
syscall!(getpgid, INT), | |
syscall!(getsid, INT), | |
syscall!(setsid), | |
syscall!(getgroups, INT, ADDR), | |
syscall!(setgroups, INT, ADDR), | |
syscall!(uname, ADDR), | |
syscall!(sethostname, STR, INT), | |
syscall!(setdomainname, STR, INT), | |
syscall!(getrlimit, INT, ADDR), | |
syscall!(setrlimit, INT, ADDR), | |
syscall!(getrusage, INT, ADDR), | |
syscall!(umask, INT), | |
syscall!(prctl, INT, INT, INT, INT, INT), | |
syscall!(getcpu, ADDR, ADDR, ADDR), | |
syscall!(gettimeofday, ADDR, ADDR), | |
syscall!(settimeofday, ADDR, ADDR), | |
syscall!(adjtimex, ADDR), | |
syscall!(getpid), | |
syscall!(getppid), | |
syscall!(getuid), | |
syscall!(geteuid), | |
syscall!(getgid), | |
syscall!(getegid), | |
syscall!(gettid), | |
syscall!(sysinfo, ADDR), | |
syscall!(mq_open, STR, INT, INT, ADDR), | |
syscall!(mq_unlink, STR), | |
syscall!(mq_timedsend, INT, STR, INT, INT, ADDR), | |
syscall!(mq_timedreceive, INT, STR, INT, ADDR, ADDR), | |
syscall!(mq_notify, INT, ADDR), | |
syscall!(mq_getsetattr, INT, ADDR, ADDR), | |
syscall!(msgget, INT, INT), | |
syscall!(msgctl, INT, INT, ADDR), | |
syscall!(msgrcv, INT, ADDR, INT, INT, INT), | |
syscall!(msgsnd, INT, ADDR, INT, INT), | |
syscall!(semget, INT, INT, INT), | |
syscall!(semctl, INT, INT, INT, INT), | |
syscall!(semtimedop, INT, ADDR, INT, ADDR), | |
syscall!(semop, INT, ADDR, INT), | |
syscall!(shmget, INT, INT, INT), | |
syscall!(shmctl, INT, INT, ADDR), | |
syscall!(shmat, INT, STR, INT), | |
syscall!(shmdt, STR), | |
syscall!(socket, INT, INT, INT), | |
syscall!(socketpair, INT, INT, INT, ADDR), | |
syscall!(bind, INT, ADDR, INT), | |
syscall!(listen, INT, INT), | |
syscall!(accept, INT, ADDR, ADDR), | |
syscall!(connect, INT, ADDR, INT), | |
syscall!(getsockname, INT, ADDR, ADDR), | |
syscall!(getpeername, INT, ADDR, ADDR), | |
syscall!(sendto, INT, ADDR, INT, INT, ADDR, INT), | |
syscall!(recvfrom, INT, ADDR, INT, INT, ADDR, ADDR), | |
syscall!(setsockopt, INT, INT, INT, STR, INT), | |
syscall!(getsockopt, INT, INT, INT, STR, ADDR), | |
syscall!(shutdown, INT, INT), | |
syscall!(sendmsg, INT, ADDR, INT), | |
syscall!(recvmsg, INT, ADDR, INT), | |
syscall!(readahead, INT, INT, INT), | |
syscall!(brk, INT), | |
syscall!(munmap, INT, INT), | |
syscall!(mremap, INT, INT, INT, INT, INT), | |
syscall!(add_key, STR, STR, ADDR, INT, INT), | |
syscall!(request_key, STR, STR, STR, INT), | |
syscall!(keyctl, INT, INT, INT, INT, INT), | |
syscall!(clone, INT, INT, ADDR, INT, ADDR), | |
syscall!(execve, STR, STR, STR), | |
syscall!(mmap, ADDR, INT, INT, INT, INT, INT), // manually added | |
syscall!(fadvise64, INT, INT, INT, INT), | |
syscall!(swapon, STR, INT), | |
syscall!(swapoff, STR), | |
syscall!(mprotect, INT, INT, INT), | |
syscall!(msync, INT, INT, INT), | |
syscall!(mlock, INT, INT), | |
syscall!(munlock, INT, INT), | |
syscall!(mlockall, INT), | |
syscall!(munlockall), | |
syscall!(mincore, INT, INT, ADDR), | |
syscall!(madvise, INT, INT, INT), | |
syscall!(remap_file_pages, INT, INT, INT, INT, INT), | |
syscall!(mbind, INT, INT, INT, ADDR, INT, INT), | |
syscall!(get_mempolicy, ADDR, ADDR, INT, INT, INT), | |
syscall!(set_mempolicy, INT, ADDR, INT), | |
syscall!(migrate_pages, INT, INT, ADDR, ADDR), | |
syscall!(move_pages, INT, INT, ADDR, ADDR, ADDR, INT), | |
syscall!(rt_tgsigqueueinfo, INT, INT, INT, ADDR), | |
syscall!(perf_event_open, ADDR, INT, INT, INT, INT), | |
syscall!(accept4, INT, ADDR, ADDR, INT), | |
syscall!(recvmmsg, INT, ADDR, INT, INT, ADDR), | |
// 260 | |
syscall!(wait4, INT, ADDR, INT, ADDR), | |
syscall!(prlimit64, INT, INT, ADDR, ADDR), | |
syscall!(fanotify_init, INT, INT), | |
syscall!(fanotify_mark, INT, INT, INT, INT, STR), | |
syscall!(name_to_handle_at, INT, STR, ADDR, INT, INT), // manually added | |
syscall!(open_by_handle_at, INT, ADDR, INT), // manually added | |
syscall!(clock_adjtime, INT, ADDR), | |
syscall!(syncfs, INT), | |
syscall!(setns, INT, INT), | |
syscall!(sendmmsg, INT, ADDR, INT, INT), | |
syscall!(process_vm_readv, INT, ADDR, INT, ADDR, INT, INT), | |
syscall!(process_vm_writev, INT, ADDR, INT, ADDR, INT, INT), | |
syscall!(kcmp, INT, INT, INT, INT, INT), | |
syscall!(finit_module, INT, STR, INT), | |
syscall!(sched_setattr, INT, ADDR, INT), | |
syscall!(sched_getattr, INT, ADDR, INT, INT), | |
syscall!(renameat2, INT, STR, INT, STR, INT), | |
syscall!(seccomp, INT, INT, ADDR), | |
syscall!(getrandom, STR, INT, INT), | |
syscall!(memfd_create, STR, INT), | |
syscall!(bpf, INT, ADDR, INT), | |
syscall!(execveat, INT, STR, STR, STR, INT), | |
syscall!(userfaultfd, INT), | |
syscall!(membarrier, INT, INT, INT), | |
syscall!(mlock2, INT, INT, INT), | |
syscall!(copy_file_range, INT, ADDR, INT, ADDR, INT, INT), | |
syscall!(preadv2, INT, ADDR, INT, INT, INT, INT), | |
syscall!(pwritev2, INT, ADDR, INT, INT, INT, INT), | |
syscall!(pkey_mprotect, INT, INT, INT, INT), | |
syscall!(pkey_alloc, INT, INT), | |
syscall!(pkey_free, INT), | |
syscall!(statx, INT, STR, INT, INT, ADDR), | |
syscall!(io_pgetevents, INT, INT, INT, ADDR, ADDR, ADDR), | |
syscall!(rseq, ADDR, INT, INT, INT), | |
syscall!(kexec_file_load, INT, INT, INT, STR, INT), | |
// 403 | |
// These time64 syscalls are the same as the original variant on 64-bit systems. | |
syscall!(clock_gettime64, INT, ADDR), // manually added | |
syscall!(clock_settime64, INT, ADDR), // manually added | |
syscall!(clock_adjtime64, INT, ADDR), // manually added | |
syscall!(clock_getres_time64, INT, ADDR), // manually added | |
syscall!(clock_nanosleep_time64, INT, INT, ADDR, ADDR), // manually added | |
syscall!(timer_gettime64, INT, ADDR), // manually added | |
syscall!(timer_settime64, INT, INT, ADDR, ADDR), // manually added | |
syscall!(timerfd_gettime64, INT, ADDR), // manually added | |
syscall!(timerfd_settime64, INT, INT, ADDR, ADDR), // manually added | |
syscall!(utimensat_time64, INT, STR, ADDR, INT), // manually added | |
syscall!(pselect6_time64, INT, ADDR, ADDR, ADDR, ADDR, ADDR), // manually added | |
syscall!(ppoll_time64, ADDR, INT, ADDR, ADDR, INT), // manually added | |
// 416 | |
syscall!(io_pgetevents_time64, INT, INT, INT, ADDR, ADDR, ADDR), // manually added | |
syscall!(recvmmsg_time64, INT, ADDR, INT, INT, ADDR), // manually added | |
syscall!(mq_timedsend_time64, INT, STR, INT, INT, ADDR), // manually added | |
syscall!(mq_timedreceive_time64, INT, STR, INT, ADDR, ADDR), // manually added | |
syscall!(semtimedop_time64, INT, ADDR, INT, ADDR), // manually added | |
syscall!(rt_sigtimedwait_time64, ADDR, ADDR, ADDR, INT), // manually added | |
syscall!(futex_time64, ADDR, INT, INT, ADDR, ADDR, INT), // manually added | |
syscall!(sched_rr_get_interval_time64, INT, ADDR), // manually added | |
syscall!(pidfd_send_signal, INT, INT, ADDR, INT), | |
syscall!(io_uring_setup, INT, ADDR), | |
syscall!(io_uring_enter, INT, INT, INT, INT, ADDR, INT), | |
syscall!(io_uring_register, INT, INT, ADDR, INT), | |
syscall!(open_tree, INT, STR, INT), | |
syscall!(move_mount, INT, STR, INT, STR, INT), | |
syscall!(fsopen, STR, INT), | |
syscall!(fsconfig, INT, INT, STR, ADDR, INT), | |
syscall!(fsmount, INT, INT, INT), | |
syscall!(fspick, INT, STR, INT), | |
syscall!(pidfd_open, INT, INT), | |
syscall!(clone3, ADDR, INT), | |
syscall!(close_range, INT, INT, INT), | |
syscall!(openat2, INT, STR, ADDR, INT), | |
syscall!(pidfd_getfd, INT, INT, INT), | |
syscall!(faccessat2, INT, STR, INT, INT), | |
syscall!(process_madvise, INT, ADDR, INT, INT, INT), | |
syscall!(epoll_pwait2, INT, ADDR, INT, ADDR, ADDR, INT), | |
syscall!(mount_setattr, INT, STR, INT, ADDR, INT), | |
syscall!(quotactl_fd, INT, INT, INT, ADDR), | |
syscall!(landlock_create_ruleset, ADDR, INT, INT), | |
syscall!(landlock_add_rule, INT, ADDR, ADDR, INT), | |
syscall!(landlock_restrict_self, INT, INT), | |
syscall!(memfd_secret, INT), | |
syscall!(process_mrelease, INT, INT), | |
syscall!(futex_waitv, ADDR, INT, INT, ADDR, INT), | |
syscall!(set_mempolicy_home_node, INT, INT, INT, INT), |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment