get-syscalls.pygenerates syscall informations.syscalls-table-riscv.rsis an example of usingget-syscalls.pyto 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 hidden or 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 hidden or 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