diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-07-01 15:52:54 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-07-01 15:52:54 -0700 |
| commit | c89dd15e1be4959800dc7092d7dd4375253db7bc (patch) | |
| tree | ca184ae53592efa21e67128a5f891d642d7f1118 /lib/std/os/linux | |
| parent | 5466e87fce581f2ef90ac23bb80b1dbc05836fc6 (diff) | |
| parent | 2360f8c490f3ec684ed64ff28e8c1fade249070b (diff) | |
| download | zig-c89dd15e1be4959800dc7092d7dd4375253db7bc.tar.gz zig-c89dd15e1be4959800dc7092d7dd4375253db7bc.zip | |
Merge remote-tracking branch 'origin/master' into llvm14
Diffstat (limited to 'lib/std/os/linux')
| -rw-r--r-- | lib/std/os/linux/arm-eabi.zig | 457 | ||||
| -rw-r--r-- | lib/std/os/linux/arm64.zig | 357 | ||||
| -rw-r--r-- | lib/std/os/linux/i386.zig | 459 | ||||
| -rw-r--r-- | lib/std/os/linux/io_uring.zig | 1059 | ||||
| -rw-r--r-- | lib/std/os/linux/ioctl.zig | 2 | ||||
| -rw-r--r-- | lib/std/os/linux/mips.zig | 470 | ||||
| -rw-r--r-- | lib/std/os/linux/powerpc.zig | 482 | ||||
| -rw-r--r-- | lib/std/os/linux/powerpc64.zig | 456 | ||||
| -rw-r--r-- | lib/std/os/linux/riscv64.zig | 357 | ||||
| -rw-r--r-- | lib/std/os/linux/seccomp.zig | 212 | ||||
| -rw-r--r-- | lib/std/os/linux/sparc64.zig | 436 | ||||
| -rw-r--r-- | lib/std/os/linux/syscalls.zig | 3493 | ||||
| -rw-r--r-- | lib/std/os/linux/tls.zig | 4 | ||||
| -rw-r--r-- | lib/std/os/linux/x86_64.zig | 377 |
14 files changed, 4760 insertions, 3861 deletions
diff --git a/lib/std/os/linux/arm-eabi.zig b/lib/std/os/linux/arm-eabi.zig index 852f6e9283..cd7509d265 100644 --- a/lib/std/os/linux/arm-eabi.zig +++ b/lib/std/os/linux/arm-eabi.zig @@ -1,6 +1,7 @@ const std = @import("../../std.zig"); const maxInt = std.math.maxInt; const linux = std.os.linux; +const SYS = linux.SYS; const iovec = std.os.iovec; const iovec_const = std.os.iovec_const; const socklen_t = linux.socklen_t; @@ -99,7 +100,10 @@ pub fn syscall6( /// This matches the libc clone function. pub extern fn clone( - func: fn (arg: usize) callconv(.C) u8, + func: switch (@import("builtin").zig_backend) { + .stage1 => fn (arg: usize) callconv(.C) u8, + else => *const fn (arg: usize) callconv(.C) u8, + }, stack: usize, flags: u32, arg: usize, @@ -124,417 +128,6 @@ pub fn restore_rt() callconv(.Naked) void { ); } -pub const SYS = enum(usize) { - restart_syscall = 0, - exit = 1, - fork = 2, - read = 3, - write = 4, - open = 5, - close = 6, - creat = 8, - link = 9, - unlink = 10, - execve = 11, - chdir = 12, - mknod = 14, - chmod = 15, - lchown = 16, - lseek = 19, - getpid = 20, - mount = 21, - setuid = 23, - getuid = 24, - ptrace = 26, - pause = 29, - access = 33, - nice = 34, - sync = 36, - kill = 37, - rename = 38, - mkdir = 39, - rmdir = 40, - dup = 41, - pipe = 42, - times = 43, - brk = 45, - setgid = 46, - getgid = 47, - geteuid = 49, - getegid = 50, - acct = 51, - umount2 = 52, - ioctl = 54, - fcntl = 55, - setpgid = 57, - umask = 60, - chroot = 61, - ustat = 62, - dup2 = 63, - getppid = 64, - getpgrp = 65, - setsid = 66, - sigaction = 67, - setreuid = 70, - setregid = 71, - sigsuspend = 72, - sigpending = 73, - sethostname = 74, - setrlimit = 75, - getrusage = 77, - gettimeofday = 78, - settimeofday = 79, - getgroups = 80, - setgroups = 81, - symlink = 83, - readlink = 85, - uselib = 86, - swapon = 87, - reboot = 88, - munmap = 91, - truncate = 92, - ftruncate = 93, - fchmod = 94, - fchown = 95, - getpriority = 96, - setpriority = 97, - statfs = 99, - fstatfs = 100, - syslog = 103, - setitimer = 104, - getitimer = 105, - stat = 106, - lstat = 107, - fstat = 108, - vhangup = 111, - wait4 = 114, - swapoff = 115, - sysinfo = 116, - fsync = 118, - sigreturn = 119, - clone = 120, - setdomainname = 121, - uname = 122, - adjtimex = 124, - mprotect = 125, - sigprocmask = 126, - init_module = 128, - delete_module = 129, - quotactl = 131, - getpgid = 132, - fchdir = 133, - bdflush = 134, - sysfs = 135, - personality = 136, - setfsuid = 138, - setfsgid = 139, - _llseek = 140, - getdents = 141, - _newselect = 142, - flock = 143, - msync = 144, - readv = 145, - writev = 146, - getsid = 147, - fdatasync = 148, - _sysctl = 149, - mlock = 150, - munlock = 151, - mlockall = 152, - munlockall = 153, - sched_setparam = 154, - sched_getparam = 155, - sched_setscheduler = 156, - sched_getscheduler = 157, - sched_yield = 158, - sched_get_priority_max = 159, - sched_get_priority_min = 160, - sched_rr_get_interval = 161, - nanosleep = 162, - mremap = 163, - setresuid = 164, - getresuid = 165, - poll = 168, - nfsservctl = 169, - setresgid = 170, - getresgid = 171, - prctl = 172, - rt_sigreturn = 173, - rt_sigaction = 174, - rt_sigprocmask = 175, - rt_sigpending = 176, - rt_sigtimedwait = 177, - rt_sigqueueinfo = 178, - rt_sigsuspend = 179, - pread64 = 180, - pwrite64 = 181, - chown = 182, - getcwd = 183, - capget = 184, - capset = 185, - sigaltstack = 186, - sendfile = 187, - vfork = 190, - ugetrlimit = 191, - mmap2 = 192, - truncate64 = 193, - ftruncate64 = 194, - stat64 = 195, - lstat64 = 196, - fstat64 = 197, - lchown32 = 198, - getuid32 = 199, - getgid32 = 200, - geteuid32 = 201, - getegid32 = 202, - setreuid32 = 203, - setregid32 = 204, - getgroups32 = 205, - setgroups32 = 206, - fchown32 = 207, - setresuid32 = 208, - getresuid32 = 209, - setresgid32 = 210, - getresgid32 = 211, - chown32 = 212, - setuid32 = 213, - setgid32 = 214, - setfsuid32 = 215, - setfsgid32 = 216, - getdents64 = 217, - pivot_root = 218, - mincore = 219, - madvise = 220, - fcntl64 = 221, - gettid = 224, - readahead = 225, - setxattr = 226, - lsetxattr = 227, - fsetxattr = 228, - getxattr = 229, - lgetxattr = 230, - fgetxattr = 231, - listxattr = 232, - llistxattr = 233, - flistxattr = 234, - removexattr = 235, - lremovexattr = 236, - fremovexattr = 237, - tkill = 238, - sendfile64 = 239, - futex = 240, - sched_setaffinity = 241, - sched_getaffinity = 242, - io_setup = 243, - io_destroy = 244, - io_getevents = 245, - io_submit = 246, - io_cancel = 247, - exit_group = 248, - lookup_dcookie = 249, - epoll_create = 250, - epoll_ctl = 251, - epoll_wait = 252, - remap_file_pages = 253, - set_tid_address = 256, - timer_create = 257, - timer_settime = 258, - timer_gettime = 259, - timer_getoverrun = 260, - timer_delete = 261, - clock_settime = 262, - clock_gettime = 263, - clock_getres = 264, - clock_nanosleep = 265, - statfs64 = 266, - fstatfs64 = 267, - tgkill = 268, - utimes = 269, - fadvise64_64 = 270, - pciconfig_iobase = 271, - pciconfig_read = 272, - pciconfig_write = 273, - mq_open = 274, - mq_unlink = 275, - mq_timedsend = 276, - mq_timedreceive = 277, - mq_notify = 278, - mq_getsetattr = 279, - waitid = 280, - socket = 281, - bind = 282, - connect = 283, - listen = 284, - accept = 285, - getsockname = 286, - getpeername = 287, - socketpair = 288, - send = 289, - sendto = 290, - recv = 291, - recvfrom = 292, - shutdown = 293, - setsockopt = 294, - getsockopt = 295, - sendmsg = 296, - recvmsg = 297, - semop = 298, - semget = 299, - semctl = 300, - msgsnd = 301, - msgrcv = 302, - msgget = 303, - msgctl = 304, - shmat = 305, - shmdt = 306, - shmget = 307, - shmctl = 308, - add_key = 309, - request_key = 310, - keyctl = 311, - semtimedop = 312, - vserver = 313, - ioprio_set = 314, - ioprio_get = 315, - inotify_init = 316, - inotify_add_watch = 317, - inotify_rm_watch = 318, - mbind = 319, - get_mempolicy = 320, - set_mempolicy = 321, - openat = 322, - mkdirat = 323, - mknodat = 324, - fchownat = 325, - futimesat = 326, - fstatat64 = 327, - unlinkat = 328, - renameat = 329, - linkat = 330, - symlinkat = 331, - readlinkat = 332, - fchmodat = 333, - faccessat = 334, - pselect6 = 335, - ppoll = 336, - unshare = 337, - set_robust_list = 338, - get_robust_list = 339, - splice = 340, - sync_file_range = 341, - tee = 342, - vmsplice = 343, - move_pages = 344, - getcpu = 345, - epoll_pwait = 346, - kexec_load = 347, - utimensat = 348, - signalfd = 349, - timerfd_create = 350, - eventfd = 351, - fallocate = 352, - timerfd_settime = 353, - timerfd_gettime = 354, - signalfd4 = 355, - eventfd2 = 356, - epoll_create1 = 357, - dup3 = 358, - pipe2 = 359, - inotify_init1 = 360, - preadv = 361, - pwritev = 362, - rt_tgsigqueueinfo = 363, - perf_event_open = 364, - recvmmsg = 365, - accept4 = 366, - fanotify_init = 367, - fanotify_mark = 368, - prlimit64 = 369, - name_to_handle_at = 370, - open_by_handle_at = 371, - clock_adjtime = 372, - syncfs = 373, - sendmmsg = 374, - setns = 375, - process_vm_readv = 376, - process_vm_writev = 377, - kcmp = 378, - finit_module = 379, - sched_setattr = 380, - sched_getattr = 381, - renameat2 = 382, - seccomp = 383, - getrandom = 384, - memfd_create = 385, - bpf = 386, - execveat = 387, - userfaultfd = 388, - membarrier = 389, - mlock2 = 390, - copy_file_range = 391, - preadv2 = 392, - pwritev2 = 393, - pkey_mprotect = 394, - pkey_alloc = 395, - pkey_free = 396, - statx = 397, - rseq = 398, - io_pgetevents = 399, - migrate_pages = 400, - kexec_file_load = 401, - clock_gettime64 = 403, - clock_settime64 = 404, - clock_adjtime64 = 405, - clock_getres_time64 = 406, - clock_nanosleep_time64 = 407, - timer_gettime64 = 408, - timer_settime64 = 409, - timerfd_gettime64 = 410, - timerfd_settime64 = 411, - utimensat_time64 = 412, - pselect6_time64 = 413, - ppoll_time64 = 414, - io_pgetevents_time64 = 416, - recvmmsg_time64 = 417, - mq_timedsend_time64 = 418, - mq_timedreceive_time64 = 419, - semtimedop_time64 = 420, - rt_sigtimedwait_time64 = 421, - futex_time64 = 422, - sched_rr_get_interval_time64 = 423, - pidfd_send_signal = 424, - io_uring_setup = 425, - io_uring_enter = 426, - io_uring_register = 427, - open_tree = 428, - move_mount = 429, - fsopen = 430, - fsconfig = 431, - fsmount = 432, - fspick = 433, - pidfd_open = 434, - clone3 = 435, - close_range = 436, - openat2 = 437, - pidfd_getfd = 438, - faccessat2 = 439, - process_madvise = 440, - epoll_pwait2 = 441, - mount_setattr = 442, - landlock_create_ruleset = 444, - landlock_add_rule = 445, - landlock_restrict_self = 446, - - breakpoint = 0x0f0001, - cacheflush = 0x0f0002, - usr26 = 0x0f0003, - usr32 = 0x0f0004, - set_tls = 0x0f0005, - get_tls = 0x0f0006, - - _, -}; - pub const MMAP2_UNIT = 4096; pub const O = struct { @@ -638,33 +231,33 @@ pub const HWCAP = struct { }; pub const Flock = extern struct { - l_type: i16, - l_whence: i16, + type: i16, + whence: i16, __pad0: [4]u8, - l_start: off_t, - l_len: off_t, - l_pid: pid_t, + start: off_t, + len: off_t, + pid: pid_t, __unused: [4]u8, }; pub const msghdr = extern struct { - msg_name: ?*sockaddr, - msg_namelen: socklen_t, - msg_iov: [*]iovec, - msg_iovlen: i32, - msg_control: ?*anyopaque, - msg_controllen: socklen_t, - msg_flags: i32, + name: ?*sockaddr, + namelen: socklen_t, + iov: [*]iovec, + iovlen: i32, + control: ?*anyopaque, + controllen: socklen_t, + flags: i32, }; pub const msghdr_const = extern struct { - msg_name: ?*const sockaddr, - msg_namelen: socklen_t, - msg_iov: [*]iovec_const, - msg_iovlen: i32, - msg_control: ?*anyopaque, - msg_controllen: socklen_t, - msg_flags: i32, + name: ?*const sockaddr, + namelen: socklen_t, + iov: [*]const iovec_const, + iovlen: i32, + control: ?*const anyopaque, + controllen: socklen_t, + flags: i32, }; pub const blksize_t = i32; @@ -744,7 +337,7 @@ pub const mcontext_t = extern struct { pub const ucontext_t = extern struct { flags: usize, - link: *ucontext_t, + link: ?*ucontext_t, stack: stack_t, mcontext: mcontext_t, sigmask: sigset_t, diff --git a/lib/std/os/linux/arm64.zig b/lib/std/os/linux/arm64.zig index 16e3b897de..8f928cab36 100644 --- a/lib/std/os/linux/arm64.zig +++ b/lib/std/os/linux/arm64.zig @@ -1,10 +1,11 @@ const std = @import("../../std.zig"); const maxInt = std.math.maxInt; const linux = std.os.linux; +const SYS = linux.SYS; const socklen_t = linux.socklen_t; const sockaddr = linux.sockaddr; -const iovec = linux.iovec; -const iovec_const = linux.iovec_const; +const iovec = std.os.iovec; +const iovec_const = std.os.iovec_const; const uid_t = linux.uid_t; const gid_t = linux.gid_t; const pid_t = linux.pid_t; @@ -97,8 +98,13 @@ pub fn syscall6( ); } +const CloneFn = switch (@import("builtin").zig_backend) { + .stage1 => fn (arg: usize) callconv(.C) u8, + else => *const fn (arg: usize) callconv(.C) u8, +}; + /// This matches the libc clone function. -pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags: u32, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; +pub extern fn clone(func: CloneFn, stack: usize, flags: u32, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; pub const restore = restore_rt; @@ -110,311 +116,6 @@ pub fn restore_rt() callconv(.Naked) void { ); } -pub const SYS = enum(usize) { - io_setup = 0, - io_destroy = 1, - io_submit = 2, - io_cancel = 3, - io_getevents = 4, - setxattr = 5, - lsetxattr = 6, - fsetxattr = 7, - getxattr = 8, - lgetxattr = 9, - fgetxattr = 10, - listxattr = 11, - llistxattr = 12, - flistxattr = 13, - removexattr = 14, - lremovexattr = 15, - fremovexattr = 16, - getcwd = 17, - lookup_dcookie = 18, - eventfd2 = 19, - epoll_create1 = 20, - epoll_ctl = 21, - epoll_pwait = 22, - dup = 23, - dup3 = 24, - fcntl = 25, - inotify_init1 = 26, - inotify_add_watch = 27, - inotify_rm_watch = 28, - ioctl = 29, - ioprio_set = 30, - ioprio_get = 31, - flock = 32, - mknodat = 33, - mkdirat = 34, - unlinkat = 35, - symlinkat = 36, - linkat = 37, - renameat = 38, - umount2 = 39, - mount = 40, - pivot_root = 41, - nfsservctl = 42, - statfs = 43, - fstatfs = 44, - truncate = 45, - ftruncate = 46, - fallocate = 47, - faccessat = 48, - chdir = 49, - fchdir = 50, - chroot = 51, - fchmod = 52, - fchmodat = 53, - fchownat = 54, - fchown = 55, - openat = 56, - close = 57, - vhangup = 58, - pipe2 = 59, - quotactl = 60, - getdents64 = 61, - lseek = 62, - read = 63, - write = 64, - readv = 65, - writev = 66, - pread64 = 67, - pwrite64 = 68, - preadv = 69, - pwritev = 70, - sendfile = 71, - pselect6 = 72, - ppoll = 73, - signalfd4 = 74, - vmsplice = 75, - splice = 76, - tee = 77, - readlinkat = 78, - fstatat = 79, - fstat = 80, - sync = 81, - fsync = 82, - fdatasync = 83, - sync_file_range = 84, - timerfd_create = 85, - timerfd_settime = 86, - timerfd_gettime = 87, - utimensat = 88, - acct = 89, - capget = 90, - capset = 91, - personality = 92, - exit = 93, - exit_group = 94, - waitid = 95, - set_tid_address = 96, - unshare = 97, - futex = 98, - set_robust_list = 99, - get_robust_list = 100, - nanosleep = 101, - getitimer = 102, - setitimer = 103, - kexec_load = 104, - init_module = 105, - delete_module = 106, - timer_create = 107, - timer_gettime = 108, - timer_getoverrun = 109, - timer_settime = 110, - timer_delete = 111, - clock_settime = 112, - clock_gettime = 113, - clock_getres = 114, - clock_nanosleep = 115, - syslog = 116, - ptrace = 117, - sched_setparam = 118, - sched_setscheduler = 119, - sched_getscheduler = 120, - sched_getparam = 121, - sched_setaffinity = 122, - sched_getaffinity = 123, - sched_yield = 124, - sched_get_priority_max = 125, - sched_get_priority_min = 126, - sched_rr_get_interval = 127, - restart_syscall = 128, - kill = 129, - tkill = 130, - tgkill = 131, - sigaltstack = 132, - rt_sigsuspend = 133, - rt_sigaction = 134, - rt_sigprocmask = 135, - rt_sigpending = 136, - rt_sigtimedwait = 137, - rt_sigqueueinfo = 138, - rt_sigreturn = 139, - setpriority = 140, - getpriority = 141, - reboot = 142, - setregid = 143, - setgid = 144, - setreuid = 145, - setuid = 146, - setresuid = 147, - getresuid = 148, - setresgid = 149, - getresgid = 150, - setfsuid = 151, - setfsgid = 152, - times = 153, - setpgid = 154, - getpgid = 155, - getsid = 156, - setsid = 157, - getgroups = 158, - setgroups = 159, - uname = 160, - sethostname = 161, - setdomainname = 162, - getrlimit = 163, - setrlimit = 164, - getrusage = 165, - umask = 166, - prctl = 167, - getcpu = 168, - gettimeofday = 169, - settimeofday = 170, - adjtimex = 171, - getpid = 172, - getppid = 173, - getuid = 174, - geteuid = 175, - getgid = 176, - getegid = 177, - gettid = 178, - sysinfo = 179, - mq_open = 180, - mq_unlink = 181, - mq_timedsend = 182, - mq_timedreceive = 183, - mq_notify = 184, - mq_getsetattr = 185, - msgget = 186, - msgctl = 187, - msgrcv = 188, - msgsnd = 189, - semget = 190, - semctl = 191, - semtimedop = 192, - semop = 193, - shmget = 194, - shmctl = 195, - shmat = 196, - shmdt = 197, - socket = 198, - socketpair = 199, - bind = 200, - listen = 201, - accept = 202, - connect = 203, - getsockname = 204, - getpeername = 205, - sendto = 206, - recvfrom = 207, - setsockopt = 208, - getsockopt = 209, - shutdown = 210, - sendmsg = 211, - recvmsg = 212, - readahead = 213, - brk = 214, - munmap = 215, - mremap = 216, - add_key = 217, - request_key = 218, - keyctl = 219, - clone = 220, - execve = 221, - mmap = 222, - fadvise64 = 223, - swapon = 224, - swapoff = 225, - mprotect = 226, - msync = 227, - mlock = 228, - munlock = 229, - mlockall = 230, - munlockall = 231, - mincore = 232, - madvise = 233, - remap_file_pages = 234, - mbind = 235, - get_mempolicy = 236, - set_mempolicy = 237, - migrate_pages = 238, - move_pages = 239, - rt_tgsigqueueinfo = 240, - perf_event_open = 241, - accept4 = 242, - recvmmsg = 243, - arch_specific_syscall = 244, - wait4 = 260, - prlimit64 = 261, - fanotify_init = 262, - fanotify_mark = 263, - clock_adjtime = 266, - syncfs = 267, - setns = 268, - sendmmsg = 269, - process_vm_readv = 270, - process_vm_writev = 271, - kcmp = 272, - finit_module = 273, - sched_setattr = 274, - sched_getattr = 275, - renameat2 = 276, - seccomp = 277, - getrandom = 278, - memfd_create = 279, - bpf = 280, - execveat = 281, - userfaultfd = 282, - membarrier = 283, - mlock2 = 284, - copy_file_range = 285, - preadv2 = 286, - pwritev2 = 287, - pkey_mprotect = 288, - pkey_alloc = 289, - pkey_free = 290, - statx = 291, - io_pgetevents = 292, - rseq = 293, - kexec_file_load = 294, - pidfd_send_signal = 424, - io_uring_setup = 425, - io_uring_enter = 426, - io_uring_register = 427, - open_tree = 428, - move_mount = 429, - fsopen = 430, - fsconfig = 431, - fsmount = 432, - fspick = 433, - pidfd_open = 434, - clone3 = 435, - close_range = 436, - openat2 = 437, - pidfd_getfd = 438, - faccessat2 = 439, - process_madvise = 440, - epoll_pwait2 = 441, - mount_setattr = 442, - landlock_create_ruleset = 444, - landlock_add_rule = 445, - landlock_restrict_self = 446, - - _, -}; - pub const O = struct { pub const CREAT = 0o100; pub const EXCL = 0o200; @@ -490,36 +191,36 @@ pub const VDSO = struct { }; pub const Flock = extern struct { - l_type: i16, - l_whence: i16, - l_start: off_t, - l_len: off_t, - l_pid: pid_t, + type: i16, + whence: i16, + start: off_t, + len: off_t, + pid: pid_t, __unused: [4]u8, }; pub const msghdr = extern struct { - msg_name: ?*sockaddr, - msg_namelen: socklen_t, - msg_iov: [*]iovec, - msg_iovlen: i32, + name: ?*sockaddr, + namelen: socklen_t, + iov: [*]iovec, + iovlen: i32, __pad1: i32 = 0, - msg_control: ?*anyopaque, - msg_controllen: socklen_t, + control: ?*anyopaque, + controllen: socklen_t, __pad2: socklen_t = 0, - msg_flags: i32, + flags: i32, }; pub const msghdr_const = extern struct { - msg_name: ?*const sockaddr, - msg_namelen: socklen_t, - msg_iov: [*]iovec_const, - msg_iovlen: i32, + name: ?*const sockaddr, + namelen: socklen_t, + iov: [*]const iovec_const, + iovlen: i32, __pad1: i32 = 0, - msg_control: ?*anyopaque, - msg_controllen: socklen_t, + control: ?*const anyopaque, + controllen: socklen_t, __pad2: socklen_t = 0, - msg_flags: i32, + flags: i32, }; pub const blksize_t = i32; @@ -586,7 +287,7 @@ pub const mcontext_t = extern struct { pub const ucontext_t = extern struct { flags: usize, - link: *ucontext_t, + link: ?*ucontext_t, stack: stack_t, sigmask: sigset_t, mcontext: mcontext_t, diff --git a/lib/std/os/linux/i386.zig b/lib/std/os/linux/i386.zig index 0b9a05c7c7..9ca127eb0c 100644 --- a/lib/std/os/linux/i386.zig +++ b/lib/std/os/linux/i386.zig @@ -1,9 +1,10 @@ const std = @import("../../std.zig"); const maxInt = std.math.maxInt; const linux = std.os.linux; +const SYS = linux.SYS; const socklen_t = linux.socklen_t; -const iovec = linux.iovec; -const iovec_const = linux.iovec_const; +const iovec = std.os.iovec; +const iovec_const = std.os.iovec_const; const uid_t = linux.uid_t; const gid_t = linux.gid_t; const pid_t = linux.pid_t; @@ -117,8 +118,13 @@ pub fn socketcall(call: usize, args: [*]usize) usize { ); } +const CloneFn = switch (@import("builtin").zig_backend) { + .stage1 => fn (arg: usize) callconv(.C) u8, + else => *const fn (arg: usize) callconv(.C) u8, +}; + /// This matches the libc clone function. -pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags: u32, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; +pub extern fn clone(func: CloneFn, stack: usize, flags: u32, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; pub fn restore() callconv(.Naked) void { return asm volatile ("int $0x80" @@ -136,447 +142,6 @@ pub fn restore_rt() callconv(.Naked) void { ); } -pub const SYS = enum(usize) { - restart_syscall = 0, - exit = 1, - fork = 2, - read = 3, - write = 4, - open = 5, - close = 6, - waitpid = 7, - creat = 8, - link = 9, - unlink = 10, - execve = 11, - chdir = 12, - time = 13, - mknod = 14, - chmod = 15, - lchown = 16, - @"break" = 17, - oldstat = 18, - lseek = 19, - getpid = 20, - mount = 21, - umount = 22, - setuid = 23, - getuid = 24, - stime = 25, - ptrace = 26, - alarm = 27, - oldfstat = 28, - pause = 29, - utime = 30, - stty = 31, - gtty = 32, - access = 33, - nice = 34, - ftime = 35, - sync = 36, - kill = 37, - rename = 38, - mkdir = 39, - rmdir = 40, - dup = 41, - pipe = 42, - times = 43, - prof = 44, - brk = 45, - setgid = 46, - getgid = 47, - signal = 48, - geteuid = 49, - getegid = 50, - acct = 51, - umount2 = 52, - lock = 53, - ioctl = 54, - fcntl = 55, - mpx = 56, - setpgid = 57, - ulimit = 58, - oldolduname = 59, - umask = 60, - chroot = 61, - ustat = 62, - dup2 = 63, - getppid = 64, - getpgrp = 65, - setsid = 66, - sigaction = 67, - sgetmask = 68, - ssetmask = 69, - setreuid = 70, - setregid = 71, - sigsuspend = 72, - sigpending = 73, - sethostname = 74, - setrlimit = 75, - getrlimit = 76, - getrusage = 77, - gettimeofday = 78, - settimeofday = 79, - getgroups = 80, - setgroups = 81, - select = 82, - symlink = 83, - oldlstat = 84, - readlink = 85, - uselib = 86, - swapon = 87, - reboot = 88, - readdir = 89, - mmap = 90, - munmap = 91, - truncate = 92, - ftruncate = 93, - fchmod = 94, - fchown = 95, - getpriority = 96, - setpriority = 97, - profil = 98, - statfs = 99, - fstatfs = 100, - ioperm = 101, - socketcall = 102, - syslog = 103, - setitimer = 104, - getitimer = 105, - stat = 106, - lstat = 107, - fstat = 108, - olduname = 109, - iopl = 110, - vhangup = 111, - idle = 112, - vm86old = 113, - wait4 = 114, - swapoff = 115, - sysinfo = 116, - ipc = 117, - fsync = 118, - sigreturn = 119, - clone = 120, - setdomainname = 121, - uname = 122, - modify_ldt = 123, - adjtimex = 124, - mprotect = 125, - sigprocmask = 126, - create_module = 127, - init_module = 128, - delete_module = 129, - get_kernel_syms = 130, - quotactl = 131, - getpgid = 132, - fchdir = 133, - bdflush = 134, - sysfs = 135, - personality = 136, - afs_syscall = 137, - setfsuid = 138, - setfsgid = 139, - _llseek = 140, - getdents = 141, - _newselect = 142, - flock = 143, - msync = 144, - readv = 145, - writev = 146, - getsid = 147, - fdatasync = 148, - _sysctl = 149, - mlock = 150, - munlock = 151, - mlockall = 152, - munlockall = 153, - sched_setparam = 154, - sched_getparam = 155, - sched_setscheduler = 156, - sched_getscheduler = 157, - sched_yield = 158, - sched_get_priority_max = 159, - sched_get_priority_min = 160, - sched_rr_get_interval = 161, - nanosleep = 162, - mremap = 163, - setresuid = 164, - getresuid = 165, - vm86 = 166, - query_module = 167, - poll = 168, - nfsservctl = 169, - setresgid = 170, - getresgid = 171, - prctl = 172, - rt_sigreturn = 173, - rt_sigaction = 174, - rt_sigprocmask = 175, - rt_sigpending = 176, - rt_sigtimedwait = 177, - rt_sigqueueinfo = 178, - rt_sigsuspend = 179, - pread64 = 180, - pwrite64 = 181, - chown = 182, - getcwd = 183, - capget = 184, - capset = 185, - sigaltstack = 186, - sendfile = 187, - getpmsg = 188, - putpmsg = 189, - vfork = 190, - ugetrlimit = 191, - mmap2 = 192, - truncate64 = 193, - ftruncate64 = 194, - stat64 = 195, - lstat64 = 196, - fstat64 = 197, - lchown32 = 198, - getuid32 = 199, - getgid32 = 200, - geteuid32 = 201, - getegid32 = 202, - setreuid32 = 203, - setregid32 = 204, - getgroups32 = 205, - setgroups32 = 206, - fchown32 = 207, - setresuid32 = 208, - getresuid32 = 209, - setresgid32 = 210, - getresgid32 = 211, - chown32 = 212, - setuid32 = 213, - setgid32 = 214, - setfsuid32 = 215, - setfsgid32 = 216, - pivot_root = 217, - mincore = 218, - madvise = 219, - getdents64 = 220, - fcntl64 = 221, - gettid = 224, - readahead = 225, - setxattr = 226, - lsetxattr = 227, - fsetxattr = 228, - getxattr = 229, - lgetxattr = 230, - fgetxattr = 231, - listxattr = 232, - llistxattr = 233, - flistxattr = 234, - removexattr = 235, - lremovexattr = 236, - fremovexattr = 237, - tkill = 238, - sendfile64 = 239, - futex = 240, - sched_setaffinity = 241, - sched_getaffinity = 242, - set_thread_area = 243, - get_thread_area = 244, - io_setup = 245, - io_destroy = 246, - io_getevents = 247, - io_submit = 248, - io_cancel = 249, - fadvise64 = 250, - exit_group = 252, - lookup_dcookie = 253, - epoll_create = 254, - epoll_ctl = 255, - epoll_wait = 256, - remap_file_pages = 257, - set_tid_address = 258, - timer_create = 259, - timer_settime, // SYS_timer_create + 1 - timer_gettime, // SYS_timer_create + 2 - timer_getoverrun, // SYS_timer_create + 3 - timer_delete, // SYS_timer_create + 4 - clock_settime, // SYS_timer_create + 5 - clock_gettime, // SYS_timer_create + 6 - clock_getres, // SYS_timer_create + 7 - clock_nanosleep, // SYS_timer_create + 8 - statfs64 = 268, - fstatfs64 = 269, - tgkill = 270, - utimes = 271, - fadvise64_64 = 272, - vserver = 273, - mbind = 274, - get_mempolicy = 275, - set_mempolicy = 276, - mq_open = 277, - mq_unlink, // SYS_mq_open + 1 - mq_timedsend, // SYS_mq_open + 2 - mq_timedreceive, // SYS_mq_open + 3 - mq_notify, // SYS_mq_open + 4 - mq_getsetattr, // SYS_mq_open + 5 - kexec_load = 283, - waitid = 284, - add_key = 286, - request_key = 287, - keyctl = 288, - ioprio_set = 289, - ioprio_get = 290, - inotify_init = 291, - inotify_add_watch = 292, - inotify_rm_watch = 293, - migrate_pages = 294, - openat = 295, - mkdirat = 296, - mknodat = 297, - fchownat = 298, - futimesat = 299, - fstatat64 = 300, - unlinkat = 301, - renameat = 302, - linkat = 303, - symlinkat = 304, - readlinkat = 305, - fchmodat = 306, - faccessat = 307, - pselect6 = 308, - ppoll = 309, - unshare = 310, - set_robust_list = 311, - get_robust_list = 312, - splice = 313, - sync_file_range = 314, - tee = 315, - vmsplice = 316, - move_pages = 317, - getcpu = 318, - epoll_pwait = 319, - utimensat = 320, - signalfd = 321, - timerfd_create = 322, - eventfd = 323, - fallocate = 324, - timerfd_settime = 325, - timerfd_gettime = 326, - signalfd4 = 327, - eventfd2 = 328, - epoll_create1 = 329, - dup3 = 330, - pipe2 = 331, - inotify_init1 = 332, - preadv = 333, - pwritev = 334, - rt_tgsigqueueinfo = 335, - perf_event_open = 336, - recvmmsg = 337, - fanotify_init = 338, - fanotify_mark = 339, - prlimit64 = 340, - name_to_handle_at = 341, - open_by_handle_at = 342, - clock_adjtime = 343, - syncfs = 344, - sendmmsg = 345, - setns = 346, - process_vm_readv = 347, - process_vm_writev = 348, - kcmp = 349, - finit_module = 350, - sched_setattr = 351, - sched_getattr = 352, - renameat2 = 353, - seccomp = 354, - getrandom = 355, - memfd_create = 356, - bpf = 357, - execveat = 358, - socket = 359, - socketpair = 360, - bind = 361, - connect = 362, - listen = 363, - accept4 = 364, - getsockopt = 365, - setsockopt = 366, - getsockname = 367, - getpeername = 368, - sendto = 369, - sendmsg = 370, - recvfrom = 371, - recvmsg = 372, - shutdown = 373, - userfaultfd = 374, - membarrier = 375, - mlock2 = 376, - copy_file_range = 377, - preadv2 = 378, - pwritev2 = 379, - pkey_mprotect = 380, - pkey_alloc = 381, - pkey_free = 382, - statx = 383, - arch_prctl = 384, - io_pgetevents = 385, - rseq = 386, - semget = 393, - semctl = 394, - shmget = 395, - shmctl = 396, - shmat = 397, - shmdt = 398, - msgget = 399, - msgsnd = 400, - msgrcv = 401, - msgctl = 402, - clock_gettime64 = 403, - clock_settime64 = 404, - clock_adjtime64 = 405, - clock_getres_time64 = 406, - clock_nanosleep_time64 = 407, - timer_gettime64 = 408, - timer_settime64 = 409, - timerfd_gettime64 = 410, - timerfd_settime64 = 411, - utimensat_time64 = 412, - pselect6_time64 = 413, - ppoll_time64 = 414, - io_pgetevents_time64 = 416, - recvmmsg_time64 = 417, - mq_timedsend_time64 = 418, - mq_timedreceive_time64 = 419, - semtimedop_time64 = 420, - rt_sigtimedwait_time64 = 421, - futex_time64 = 422, - sched_rr_get_interval_time64 = 423, - pidfd_send_signal = 424, - io_uring_setup = 425, - io_uring_enter = 426, - io_uring_register = 427, - open_tree = 428, - move_mount = 429, - fsopen = 430, - fsconfig = 431, - fsmount = 432, - fspick = 433, - pidfd_open = 434, - clone3 = 435, - close_range = 436, - openat2 = 437, - pidfd_getfd = 438, - faccessat2 = 439, - process_madvise = 440, - epoll_pwait2 = 441, - mount_setattr = 442, - landlock_create_ruleset = 444, - landlock_add_rule = 445, - landlock_restrict_self = 446, - memfd_secret = 447, - - _, -}; - pub const O = struct { pub const CREAT = 0o100; pub const EXCL = 0o200; @@ -668,9 +233,9 @@ pub const msghdr = extern struct { pub const msghdr_const = extern struct { name: ?*const sockaddr, namelen: socklen_t, - iov: [*]iovec_const, + iov: [*]const iovec_const, iovlen: i32, - control: ?*anyopaque, + control: ?*const anyopaque, controllen: socklen_t, flags: i32, }; @@ -757,7 +322,7 @@ pub const REG = struct { pub const ucontext_t = extern struct { flags: usize, - link: *ucontext_t, + link: ?*ucontext_t, stack: stack_t, mcontext: mcontext_t, sigmask: sigset_t, diff --git a/lib/std/os/linux/io_uring.zig b/lib/std/os/linux/io_uring.zig index fc32508cf5..144927771f 100644 --- a/lib/std/os/linux/io_uring.zig +++ b/lib/std/os/linux/io_uring.zig @@ -7,10 +7,6 @@ const os = std.os; const linux = os.linux; const testing = std.testing; -const io_uring_params = linux.io_uring_params; -const io_uring_sqe = linux.io_uring_sqe; -const io_uring_cqe = linux.io_uring_cqe; - pub const IO_Uring = struct { fd: os.fd_t = -1, sq: SubmissionQueue, @@ -18,24 +14,24 @@ pub const IO_Uring = struct { flags: u32, features: u32, - /// A friendly way to setup an io_uring, with default io_uring_params. + /// A friendly way to setup an io_uring, with default linux.io_uring_params. /// `entries` must be a power of two between 1 and 4096, although the kernel will make the final /// call on how many entries the submission and completion queues will ultimately have, /// see https://github.com/torvalds/linux/blob/v5.8/fs/io_uring.c#L8027-L8050. /// Matches the interface of io_uring_queue_init() in liburing. pub fn init(entries: u13, flags: u32) !IO_Uring { - var params = mem.zeroInit(io_uring_params, .{ + var params = mem.zeroInit(linux.io_uring_params, .{ .flags = flags, .sq_thread_idle = 1000, }); return try IO_Uring.init_params(entries, ¶ms); } - /// A powerful way to setup an io_uring, if you want to tweak io_uring_params such as submission + /// A powerful way to setup an io_uring, if you want to tweak linux.io_uring_params such as submission /// queue thread cpu affinity or thread idle timeout (the kernel and our default is 1 second). /// `params` is passed by reference because the kernel needs to modify the parameters. /// Matches the interface of io_uring_queue_init_params() in liburing. - pub fn init_params(entries: u13, p: *io_uring_params) !IO_Uring { + pub fn init_params(entries: u13, p: *linux.io_uring_params) !IO_Uring { if (entries == 0) return error.EntriesZero; if (!std.math.isPowerOfTwo(entries)) return error.EntriesNotPowerOfTwo; @@ -53,7 +49,7 @@ pub const IO_Uring = struct { .FAULT => return error.ParamsOutsideAccessibleAddressSpace, // The resv array contains non-zero data, p.flags contains an unsupported flag, // entries out of bounds, IORING_SETUP_SQ_AFF was specified without IORING_SETUP_SQPOLL, - // or IORING_SETUP_CQSIZE was specified but io_uring_params.cq_entries was invalid: + // or IORING_SETUP_CQSIZE was specified but linux.io_uring_params.cq_entries was invalid: .INVAL => return error.ArgumentsInvalid, .MFILE => return error.ProcessFdQuotaExceeded, .NFILE => return error.SystemFdQuotaExceeded, @@ -135,7 +131,7 @@ pub const IO_Uring = struct { /// and the null return in liburing is more a C idiom than anything else, for lack of a better /// alternative. In Zig, we have first-class error handling... so let's use it. /// Matches the implementation of io_uring_get_sqe() in liburing. - pub fn get_sqe(self: *IO_Uring) !*io_uring_sqe { + pub fn get_sqe(self: *IO_Uring) !*linux.io_uring_sqe { const head = @atomicLoad(u32, self.sq.head, .Acquire); // Remember that these head and tail offsets wrap around every four billion operations. // We must therefore use wrapping addition and subtraction to avoid a runtime crash. @@ -268,7 +264,7 @@ pub const IO_Uring = struct { /// Faster, because we can now amortize the atomic store release to `cq.head` across the batch. /// See https://github.com/axboe/liburing/issues/103#issuecomment-686665007. /// Matches the implementation of io_uring_peek_batch_cqe() in liburing, but supports waiting. - pub fn copy_cqes(self: *IO_Uring, cqes: []io_uring_cqe, wait_nr: u32) !u32 { + pub fn copy_cqes(self: *IO_Uring, cqes: []linux.io_uring_cqe, wait_nr: u32) !u32 { const count = self.copy_cqes_ready(cqes, wait_nr); if (count > 0) return count; if (self.cq_ring_needs_flush() or wait_nr > 0) { @@ -278,7 +274,7 @@ pub const IO_Uring = struct { return 0; } - fn copy_cqes_ready(self: *IO_Uring, cqes: []io_uring_cqe, wait_nr: u32) u32 { + fn copy_cqes_ready(self: *IO_Uring, cqes: []linux.io_uring_cqe, wait_nr: u32) u32 { _ = wait_nr; const ready = self.cq_ready(); const count = std.math.min(cqes.len, ready); @@ -298,8 +294,8 @@ pub const IO_Uring = struct { /// Returns a copy of an I/O completion, waiting for it if necessary, and advancing the CQ ring. /// A convenience method for `copy_cqes()` for when you don't need to batch or peek. - pub fn copy_cqe(ring: *IO_Uring) !io_uring_cqe { - var cqes: [1]io_uring_cqe = undefined; + pub fn copy_cqe(ring: *IO_Uring) !linux.io_uring_cqe { + var cqes: [1]linux.io_uring_cqe = undefined; while (true) { const count = try ring.copy_cqes(&cqes, 1); if (count > 0) return cqes[0]; @@ -316,7 +312,7 @@ pub const IO_Uring = struct { /// Must be called exactly once after a zero-copy CQE has been processed by your application. /// Not idempotent, calling more than once will result in other CQEs being lost. /// Matches the implementation of cqe_seen() in liburing. - pub fn cqe_seen(self: *IO_Uring, cqe: *io_uring_cqe) void { + pub fn cqe_seen(self: *IO_Uring, cqe: *linux.io_uring_cqe) void { _ = cqe; self.cq_advance(1); } @@ -339,7 +335,7 @@ pub const IO_Uring = struct { /// apply to the write, since the fsync may complete before the write is issued to the disk. /// You should preferably use `link_with_next_sqe()` on a write's SQE to link it with an fsync, /// or else insert a full write barrier using `drain_previous_sqes()` when queueing an fsync. - pub fn fsync(self: *IO_Uring, user_data: u64, fd: os.fd_t, flags: u32) !*io_uring_sqe { + pub fn fsync(self: *IO_Uring, user_data: u64, fd: os.fd_t, flags: u32) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_fsync(sqe, fd, flags); sqe.user_data = user_data; @@ -351,24 +347,53 @@ pub const IO_Uring = struct { /// A no-op is more useful than may appear at first glance. /// For example, you could call `drain_previous_sqes()` on the returned SQE, to use the no-op to /// know when the ring is idle before acting on a kill signal. - pub fn nop(self: *IO_Uring, user_data: u64) !*io_uring_sqe { + pub fn nop(self: *IO_Uring, user_data: u64) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_nop(sqe); sqe.user_data = user_data; return sqe; } - /// Queues (but does not submit) an SQE to perform a `read(2)`. + /// Used to select how the read should be handled. + pub const ReadBuffer = union(enum) { + /// io_uring will read directly into this buffer + buffer: []u8, + + /// io_uring will read directly into these buffers using readv. + iovecs: []const os.iovec, + + /// io_uring will select a buffer that has previously been provided with `provide_buffers`. + /// The buffer group reference by `group_id` must contain at least one buffer for the read to work. + /// `len` controls the number of bytes to read into the selected buffer. + buffer_selection: struct { + group_id: u16, + len: usize, + }, + }; + + /// Queues (but does not submit) an SQE to perform a `read(2)` or `preadv` depending on the buffer type. + /// * Reading into a `ReadBuffer.buffer` uses `read(2)` + /// * Reading into a `ReadBuffer.iovecs` uses `preadv(2)` + /// If you want to do a `preadv2()` then set `rw_flags` on the returned SQE. See https://linux.die.net/man/2/preadv. + /// /// Returns a pointer to the SQE. pub fn read( self: *IO_Uring, user_data: u64, fd: os.fd_t, - buffer: []u8, + buffer: ReadBuffer, offset: u64, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); - io_uring_prep_read(sqe, fd, buffer, offset); + switch (buffer) { + .buffer => |slice| io_uring_prep_read(sqe, fd, slice, offset), + .iovecs => |vecs| io_uring_prep_readv(sqe, fd, vecs, offset), + .buffer_selection => |selection| { + io_uring_prep_rw(.READ, sqe, fd, 0, selection.len, offset); + sqe.flags |= linux.IOSQE_BUFFER_SELECT; + sqe.buf_index = selection.group_id; + }, + } sqe.user_data = user_data; return sqe; } @@ -381,30 +406,13 @@ pub const IO_Uring = struct { fd: os.fd_t, buffer: []const u8, offset: u64, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_write(sqe, fd, buffer, offset); sqe.user_data = user_data; return sqe; } - /// Queues (but does not submit) an SQE to perform a `preadv()`. - /// Returns a pointer to the SQE so that you can further modify the SQE for advanced use cases. - /// For example, if you want to do a `preadv2()` then set `rw_flags` on the returned SQE. - /// See https://linux.die.net/man/2/preadv. - pub fn readv( - self: *IO_Uring, - user_data: u64, - fd: os.fd_t, - iovecs: []const os.iovec, - offset: u64, - ) !*io_uring_sqe { - const sqe = try self.get_sqe(); - io_uring_prep_readv(sqe, fd, iovecs, offset); - sqe.user_data = user_data; - return sqe; - } - /// Queues (but does not submit) an SQE to perform a IORING_OP_READ_FIXED. /// The `buffer` provided must be registered with the kernel by calling `register_buffers` first. /// The `buffer_index` must be the same as its index in the array provided to `register_buffers`. @@ -417,7 +425,7 @@ pub const IO_Uring = struct { buffer: *os.iovec, offset: u64, buffer_index: u16, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_read_fixed(sqe, fd, buffer, offset, buffer_index); sqe.user_data = user_data; @@ -434,7 +442,7 @@ pub const IO_Uring = struct { fd: os.fd_t, iovecs: []const os.iovec_const, offset: u64, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_writev(sqe, fd, iovecs, offset); sqe.user_data = user_data; @@ -453,7 +461,7 @@ pub const IO_Uring = struct { buffer: *os.iovec, offset: u64, buffer_index: u16, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_write_fixed(sqe, fd, buffer, offset, buffer_index); sqe.user_data = user_data; @@ -469,7 +477,7 @@ pub const IO_Uring = struct { addr: *os.sockaddr, addrlen: *os.socklen_t, flags: u32, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_accept(sqe, fd, addr, addrlen, flags); sqe.user_data = user_data; @@ -484,7 +492,7 @@ pub const IO_Uring = struct { fd: os.fd_t, addr: *const os.sockaddr, addrlen: os.socklen_t, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_connect(sqe, fd, addr, addrlen); sqe.user_data = user_data; @@ -500,24 +508,46 @@ pub const IO_Uring = struct { fd: os.fd_t, op: u32, ev: ?*linux.epoll_event, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_epoll_ctl(sqe, epfd, fd, op, ev); sqe.user_data = user_data; return sqe; } + /// Used to select how the recv call should be handled. + pub const RecvBuffer = union(enum) { + /// io_uring will recv directly into this buffer + buffer: []u8, + + /// io_uring will select a buffer that has previously been provided with `provide_buffers`. + /// The buffer group referenced by `group_id` must contain at least one buffer for the recv call to work. + /// `len` controls the number of bytes to read into the selected buffer. + buffer_selection: struct { + group_id: u16, + len: usize, + }, + }; + /// Queues (but does not submit) an SQE to perform a `recv(2)`. /// Returns a pointer to the SQE. pub fn recv( self: *IO_Uring, user_data: u64, fd: os.fd_t, - buffer: []u8, + buffer: RecvBuffer, flags: u32, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); - io_uring_prep_recv(sqe, fd, buffer, flags); + switch (buffer) { + .buffer => |slice| io_uring_prep_recv(sqe, fd, slice, flags), + .buffer_selection => |selection| { + io_uring_prep_rw(.RECV, sqe, fd, 0, selection.len, 0); + sqe.rw_flags = flags; + sqe.flags |= linux.IOSQE_BUFFER_SELECT; + sqe.buf_index = selection.group_id; + }, + } sqe.user_data = user_data; return sqe; } @@ -530,13 +560,43 @@ pub const IO_Uring = struct { fd: os.fd_t, buffer: []const u8, flags: u32, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_send(sqe, fd, buffer, flags); sqe.user_data = user_data; return sqe; } + /// Queues (but does not submit) an SQE to perform a `recvmsg(2)`. + /// Returns a pointer to the SQE. + pub fn recvmsg( + self: *IO_Uring, + user_data: u64, + fd: os.fd_t, + msg: *os.msghdr, + flags: u32, + ) !*linux.io_uring_sqe { + const sqe = try self.get_sqe(); + io_uring_prep_recvmsg(sqe, fd, msg, flags); + sqe.user_data = user_data; + return sqe; + } + + /// Queues (but does not submit) an SQE to perform a `sendmsg(2)`. + /// Returns a pointer to the SQE. + pub fn sendmsg( + self: *IO_Uring, + user_data: u64, + fd: os.fd_t, + msg: *const os.msghdr_const, + flags: u32, + ) !*linux.io_uring_sqe { + const sqe = try self.get_sqe(); + io_uring_prep_sendmsg(sqe, fd, msg, flags); + sqe.user_data = user_data; + return sqe; + } + /// Queues (but does not submit) an SQE to perform an `openat(2)`. /// Returns a pointer to the SQE. pub fn openat( @@ -546,7 +606,7 @@ pub const IO_Uring = struct { path: [*:0]const u8, flags: u32, mode: os.mode_t, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_openat(sqe, fd, path, flags, mode); sqe.user_data = user_data; @@ -555,7 +615,7 @@ pub const IO_Uring = struct { /// Queues (but does not submit) an SQE to perform a `close(2)`. /// Returns a pointer to the SQE. - pub fn close(self: *IO_Uring, user_data: u64, fd: os.fd_t) !*io_uring_sqe { + pub fn close(self: *IO_Uring, user_data: u64, fd: os.fd_t) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_close(sqe, fd); sqe.user_data = user_data; @@ -581,7 +641,7 @@ pub const IO_Uring = struct { ts: *const os.linux.kernel_timespec, count: u32, flags: u32, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_timeout(sqe, ts, count, flags); sqe.user_data = user_data; @@ -601,7 +661,7 @@ pub const IO_Uring = struct { user_data: u64, timeout_user_data: u64, flags: u32, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_timeout_remove(sqe, timeout_user_data, flags); sqe.user_data = user_data; @@ -629,7 +689,7 @@ pub const IO_Uring = struct { user_data: u64, ts: *const os.linux.kernel_timespec, flags: u32, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_link_timeout(sqe, ts, flags); sqe.user_data = user_data; @@ -643,7 +703,7 @@ pub const IO_Uring = struct { user_data: u64, fd: os.fd_t, poll_mask: u32, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_poll_add(sqe, fd, poll_mask); sqe.user_data = user_data; @@ -656,7 +716,7 @@ pub const IO_Uring = struct { self: *IO_Uring, user_data: u64, target_user_data: u64, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_poll_remove(sqe, target_user_data); sqe.user_data = user_data; @@ -672,7 +732,7 @@ pub const IO_Uring = struct { new_user_data: u64, poll_mask: u32, flags: u32, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_poll_update(sqe, old_user_data, new_user_data, poll_mask, flags); sqe.user_data = user_data; @@ -688,7 +748,7 @@ pub const IO_Uring = struct { mode: i32, offset: u64, len: u64, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_fallocate(sqe, fd, mode, offset, len); sqe.user_data = user_data; @@ -705,7 +765,7 @@ pub const IO_Uring = struct { flags: u32, mask: u32, buf: *linux.Statx, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_statx(sqe, fd, path, flags, mask, buf); sqe.user_data = user_data; @@ -725,7 +785,7 @@ pub const IO_Uring = struct { user_data: u64, cancel_user_data: u64, flags: u32, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_cancel(sqe, cancel_user_data, flags); sqe.user_data = user_data; @@ -741,7 +801,7 @@ pub const IO_Uring = struct { user_data: u64, sockfd: os.socket_t, how: u32, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_shutdown(sqe, sockfd, how); sqe.user_data = user_data; @@ -758,7 +818,7 @@ pub const IO_Uring = struct { new_dir_fd: os.fd_t, new_path: [*:0]const u8, flags: u32, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_renameat(sqe, old_dir_fd, old_path, new_dir_fd, new_path, flags); sqe.user_data = user_data; @@ -773,7 +833,7 @@ pub const IO_Uring = struct { dir_fd: os.fd_t, path: [*:0]const u8, flags: u32, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_unlinkat(sqe, dir_fd, path, flags); sqe.user_data = user_data; @@ -788,7 +848,7 @@ pub const IO_Uring = struct { dir_fd: os.fd_t, path: [*:0]const u8, mode: os.mode_t, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_mkdirat(sqe, dir_fd, path, mode); sqe.user_data = user_data; @@ -803,7 +863,7 @@ pub const IO_Uring = struct { target: [*:0]const u8, new_dir_fd: os.fd_t, link_path: [*:0]const u8, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_symlinkat(sqe, target, new_dir_fd, link_path); sqe.user_data = user_data; @@ -820,13 +880,48 @@ pub const IO_Uring = struct { new_dir_fd: os.fd_t, new_path: [*:0]const u8, flags: u32, - ) !*io_uring_sqe { + ) !*linux.io_uring_sqe { const sqe = try self.get_sqe(); io_uring_prep_linkat(sqe, old_dir_fd, old_path, new_dir_fd, new_path, flags); sqe.user_data = user_data; return sqe; } + /// Queues (but does not submit) an SQE to provide a group of buffers used for commands that read/receive data. + /// Returns a pointer to the SQE. + /// + /// Provided buffers can be used in `read`, `recv` or `recvmsg` commands via .buffer_selection. + /// + /// The kernel expects a contiguous block of memory of size (buffers_count * buffer_size). + pub fn provide_buffers( + self: *IO_Uring, + user_data: u64, + buffers: [*]u8, + buffers_count: usize, + buffer_size: usize, + group_id: usize, + buffer_id: usize, + ) !*linux.io_uring_sqe { + const sqe = try self.get_sqe(); + io_uring_prep_provide_buffers(sqe, buffers, buffers_count, buffer_size, group_id, buffer_id); + sqe.user_data = user_data; + return sqe; + } + + /// Queues (but does not submit) an SQE to remove a group of provided buffers. + /// Returns a pointer to the SQE. + pub fn remove_buffers( + self: *IO_Uring, + user_data: u64, + buffers_count: usize, + group_id: usize, + ) !*linux.io_uring_sqe { + const sqe = try self.get_sqe(); + io_uring_prep_remove_buffers(sqe, buffers_count, group_id); + sqe.user_data = user_data; + return sqe; + } + /// Registers an array of file descriptors. /// Every time a file descriptor is put in an SQE and submitted to the kernel, the kernel must /// retrieve a reference to the file, and once I/O has completed the file reference must be @@ -984,7 +1079,7 @@ pub const SubmissionQueue = struct { flags: *u32, dropped: *u32, array: []u32, - sqes: []io_uring_sqe, + sqes: []linux.io_uring_sqe, mmap: []align(mem.page_size) u8, mmap_sqes: []align(mem.page_size) u8, @@ -995,12 +1090,12 @@ pub const SubmissionQueue = struct { sqe_head: u32 = 0, sqe_tail: u32 = 0, - pub fn init(fd: os.fd_t, p: io_uring_params) !SubmissionQueue { + pub fn init(fd: os.fd_t, p: linux.io_uring_params) !SubmissionQueue { assert(fd >= 0); assert((p.features & linux.IORING_FEAT_SINGLE_MMAP) != 0); const size = std.math.max( p.sq_off.array + p.sq_entries * @sizeOf(u32), - p.cq_off.cqes + p.cq_entries * @sizeOf(io_uring_cqe), + p.cq_off.cqes + p.cq_entries * @sizeOf(linux.io_uring_cqe), ); const mmap = try os.mmap( null, @@ -1014,8 +1109,8 @@ pub const SubmissionQueue = struct { assert(mmap.len == size); // The motivation for the `sqes` and `array` indirection is to make it possible for the - // application to preallocate static io_uring_sqe entries and then replay them when needed. - const size_sqes = p.sq_entries * @sizeOf(io_uring_sqe); + // application to preallocate static linux.io_uring_sqe entries and then replay them when needed. + const size_sqes = p.sq_entries * @sizeOf(linux.io_uring_sqe); const mmap_sqes = try os.mmap( null, size_sqes, @@ -1028,7 +1123,7 @@ pub const SubmissionQueue = struct { assert(mmap_sqes.len == size_sqes); const array = @ptrCast([*]u32, @alignCast(@alignOf(u32), &mmap[p.sq_off.array])); - const sqes = @ptrCast([*]io_uring_sqe, @alignCast(@alignOf(io_uring_sqe), &mmap_sqes[0])); + const sqes = @ptrCast([*]linux.io_uring_sqe, @alignCast(@alignOf(linux.io_uring_sqe), &mmap_sqes[0])); // We expect the kernel copies p.sq_entries to the u32 pointed to by p.sq_off.ring_entries, // see https://github.com/torvalds/linux/blob/v5.8/fs/io_uring.c#L7843-L7844. assert( @@ -1059,15 +1154,15 @@ pub const CompletionQueue = struct { tail: *u32, mask: u32, overflow: *u32, - cqes: []io_uring_cqe, + cqes: []linux.io_uring_cqe, - pub fn init(fd: os.fd_t, p: io_uring_params, sq: SubmissionQueue) !CompletionQueue { + pub fn init(fd: os.fd_t, p: linux.io_uring_params, sq: SubmissionQueue) !CompletionQueue { assert(fd >= 0); assert((p.features & linux.IORING_FEAT_SINGLE_MMAP) != 0); const mmap = sq.mmap; const cqes = @ptrCast( - [*]io_uring_cqe, - @alignCast(@alignOf(io_uring_cqe), &mmap[p.cq_off.cqes]), + [*]linux.io_uring_cqe, + @alignCast(@alignOf(linux.io_uring_cqe), &mmap[p.cq_off.cqes]), ); assert(p.cq_entries == @ptrCast(*u32, @alignCast(@alignOf(u32), &mmap[p.cq_off.ring_entries])).*); @@ -1087,7 +1182,7 @@ pub const CompletionQueue = struct { } }; -pub fn io_uring_prep_nop(sqe: *io_uring_sqe) void { +pub fn io_uring_prep_nop(sqe: *linux.io_uring_sqe) void { sqe.* = .{ .opcode = .NOP, .flags = 0, @@ -1105,7 +1200,7 @@ pub fn io_uring_prep_nop(sqe: *io_uring_sqe) void { }; } -pub fn io_uring_prep_fsync(sqe: *io_uring_sqe, fd: os.fd_t, flags: u32) void { +pub fn io_uring_prep_fsync(sqe: *linux.io_uring_sqe, fd: os.fd_t, flags: u32) void { sqe.* = .{ .opcode = .FSYNC, .flags = 0, @@ -1125,7 +1220,7 @@ pub fn io_uring_prep_fsync(sqe: *io_uring_sqe, fd: os.fd_t, flags: u32) void { pub fn io_uring_prep_rw( op: linux.IORING_OP, - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, fd: os.fd_t, addr: u64, len: usize, @@ -1148,16 +1243,16 @@ pub fn io_uring_prep_rw( }; } -pub fn io_uring_prep_read(sqe: *io_uring_sqe, fd: os.fd_t, buffer: []u8, offset: u64) void { +pub fn io_uring_prep_read(sqe: *linux.io_uring_sqe, fd: os.fd_t, buffer: []u8, offset: u64) void { io_uring_prep_rw(.READ, sqe, fd, @ptrToInt(buffer.ptr), buffer.len, offset); } -pub fn io_uring_prep_write(sqe: *io_uring_sqe, fd: os.fd_t, buffer: []const u8, offset: u64) void { +pub fn io_uring_prep_write(sqe: *linux.io_uring_sqe, fd: os.fd_t, buffer: []const u8, offset: u64) void { io_uring_prep_rw(.WRITE, sqe, fd, @ptrToInt(buffer.ptr), buffer.len, offset); } pub fn io_uring_prep_readv( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, fd: os.fd_t, iovecs: []const os.iovec, offset: u64, @@ -1166,7 +1261,7 @@ pub fn io_uring_prep_readv( } pub fn io_uring_prep_writev( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, fd: os.fd_t, iovecs: []const os.iovec_const, offset: u64, @@ -1174,12 +1269,12 @@ pub fn io_uring_prep_writev( io_uring_prep_rw(.WRITEV, sqe, fd, @ptrToInt(iovecs.ptr), iovecs.len, offset); } -pub fn io_uring_prep_read_fixed(sqe: *io_uring_sqe, fd: os.fd_t, buffer: *os.iovec, offset: u64, buffer_index: u16) void { +pub fn io_uring_prep_read_fixed(sqe: *linux.io_uring_sqe, fd: os.fd_t, buffer: *os.iovec, offset: u64, buffer_index: u16) void { io_uring_prep_rw(.READ_FIXED, sqe, fd, @ptrToInt(buffer.iov_base), buffer.iov_len, offset); sqe.buf_index = buffer_index; } -pub fn io_uring_prep_write_fixed(sqe: *io_uring_sqe, fd: os.fd_t, buffer: *os.iovec, offset: u64, buffer_index: u16) void { +pub fn io_uring_prep_write_fixed(sqe: *linux.io_uring_sqe, fd: os.fd_t, buffer: *os.iovec, offset: u64, buffer_index: u16) void { io_uring_prep_rw(.WRITE_FIXED, sqe, fd, @ptrToInt(buffer.iov_base), buffer.iov_len, offset); sqe.buf_index = buffer_index; } @@ -1195,7 +1290,7 @@ pub inline fn __io_uring_prep_poll_mask(poll_mask: u32) u32 { } pub fn io_uring_prep_accept( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, fd: os.fd_t, addr: *os.sockaddr, addrlen: *os.socklen_t, @@ -1208,7 +1303,7 @@ pub fn io_uring_prep_accept( } pub fn io_uring_prep_connect( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, fd: os.fd_t, addr: *const os.sockaddr, addrlen: os.socklen_t, @@ -1218,7 +1313,7 @@ pub fn io_uring_prep_connect( } pub fn io_uring_prep_epoll_ctl( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, epfd: os.fd_t, fd: os.fd_t, op: u32, @@ -1227,18 +1322,38 @@ pub fn io_uring_prep_epoll_ctl( io_uring_prep_rw(.EPOLL_CTL, sqe, epfd, @ptrToInt(ev), op, @intCast(u64, fd)); } -pub fn io_uring_prep_recv(sqe: *io_uring_sqe, fd: os.fd_t, buffer: []u8, flags: u32) void { +pub fn io_uring_prep_recv(sqe: *linux.io_uring_sqe, fd: os.fd_t, buffer: []u8, flags: u32) void { io_uring_prep_rw(.RECV, sqe, fd, @ptrToInt(buffer.ptr), buffer.len, 0); sqe.rw_flags = flags; } -pub fn io_uring_prep_send(sqe: *io_uring_sqe, fd: os.fd_t, buffer: []const u8, flags: u32) void { +pub fn io_uring_prep_send(sqe: *linux.io_uring_sqe, fd: os.fd_t, buffer: []const u8, flags: u32) void { io_uring_prep_rw(.SEND, sqe, fd, @ptrToInt(buffer.ptr), buffer.len, 0); sqe.rw_flags = flags; } +pub fn io_uring_prep_recvmsg( + sqe: *linux.io_uring_sqe, + fd: os.fd_t, + msg: *os.msghdr, + flags: u32, +) void { + linux.io_uring_prep_rw(.RECVMSG, sqe, fd, @ptrToInt(msg), 1, 0); + sqe.rw_flags = flags; +} + +pub fn io_uring_prep_sendmsg( + sqe: *linux.io_uring_sqe, + fd: os.fd_t, + msg: *const os.msghdr_const, + flags: u32, +) void { + linux.io_uring_prep_rw(.SENDMSG, sqe, fd, @ptrToInt(msg), 1, 0); + sqe.rw_flags = flags; +} + pub fn io_uring_prep_openat( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, fd: os.fd_t, path: [*:0]const u8, flags: u32, @@ -1248,7 +1363,7 @@ pub fn io_uring_prep_openat( sqe.rw_flags = flags; } -pub fn io_uring_prep_close(sqe: *io_uring_sqe, fd: os.fd_t) void { +pub fn io_uring_prep_close(sqe: *linux.io_uring_sqe, fd: os.fd_t) void { sqe.* = .{ .opcode = .CLOSE, .flags = 0, @@ -1267,7 +1382,7 @@ pub fn io_uring_prep_close(sqe: *io_uring_sqe, fd: os.fd_t) void { } pub fn io_uring_prep_timeout( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, ts: *const os.linux.kernel_timespec, count: u32, flags: u32, @@ -1276,7 +1391,7 @@ pub fn io_uring_prep_timeout( sqe.rw_flags = flags; } -pub fn io_uring_prep_timeout_remove(sqe: *io_uring_sqe, timeout_user_data: u64, flags: u32) void { +pub fn io_uring_prep_timeout_remove(sqe: *linux.io_uring_sqe, timeout_user_data: u64, flags: u32) void { sqe.* = .{ .opcode = .TIMEOUT_REMOVE, .flags = 0, @@ -1295,7 +1410,7 @@ pub fn io_uring_prep_timeout_remove(sqe: *io_uring_sqe, timeout_user_data: u64, } pub fn io_uring_prep_link_timeout( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, ts: *const os.linux.kernel_timespec, flags: u32, ) void { @@ -1304,7 +1419,7 @@ pub fn io_uring_prep_link_timeout( } pub fn io_uring_prep_poll_add( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, fd: os.fd_t, poll_mask: u32, ) void { @@ -1313,14 +1428,14 @@ pub fn io_uring_prep_poll_add( } pub fn io_uring_prep_poll_remove( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, target_user_data: u64, ) void { io_uring_prep_rw(.POLL_REMOVE, sqe, -1, target_user_data, 0, 0); } pub fn io_uring_prep_poll_update( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, old_user_data: u64, new_user_data: u64, poll_mask: u32, @@ -1331,7 +1446,7 @@ pub fn io_uring_prep_poll_update( } pub fn io_uring_prep_fallocate( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, fd: os.fd_t, mode: i32, offset: u64, @@ -1355,7 +1470,7 @@ pub fn io_uring_prep_fallocate( } pub fn io_uring_prep_statx( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, fd: os.fd_t, path: [*:0]const u8, flags: u32, @@ -1367,7 +1482,7 @@ pub fn io_uring_prep_statx( } pub fn io_uring_prep_cancel( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, cancel_user_data: u64, flags: u32, ) void { @@ -1376,7 +1491,7 @@ pub fn io_uring_prep_cancel( } pub fn io_uring_prep_shutdown( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, sockfd: os.socket_t, how: u32, ) void { @@ -1384,7 +1499,7 @@ pub fn io_uring_prep_shutdown( } pub fn io_uring_prep_renameat( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, old_dir_fd: os.fd_t, old_path: [*:0]const u8, new_dir_fd: os.fd_t, @@ -1404,7 +1519,7 @@ pub fn io_uring_prep_renameat( } pub fn io_uring_prep_unlinkat( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, dir_fd: os.fd_t, path: [*:0]const u8, flags: u32, @@ -1414,7 +1529,7 @@ pub fn io_uring_prep_unlinkat( } pub fn io_uring_prep_mkdirat( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, dir_fd: os.fd_t, path: [*:0]const u8, mode: os.mode_t, @@ -1423,7 +1538,7 @@ pub fn io_uring_prep_mkdirat( } pub fn io_uring_prep_symlinkat( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, target: [*:0]const u8, new_dir_fd: os.fd_t, link_path: [*:0]const u8, @@ -1439,7 +1554,7 @@ pub fn io_uring_prep_symlinkat( } pub fn io_uring_prep_linkat( - sqe: *io_uring_sqe, + sqe: *linux.io_uring_sqe, old_dir_fd: os.fd_t, old_path: [*:0]const u8, new_dir_fd: os.fd_t, @@ -1458,12 +1573,34 @@ pub fn io_uring_prep_linkat( sqe.rw_flags = flags; } +pub fn io_uring_prep_provide_buffers( + sqe: *linux.io_uring_sqe, + buffers: [*]u8, + num: usize, + buffer_len: usize, + group_id: usize, + buffer_id: usize, +) void { + const ptr = @ptrToInt(buffers); + io_uring_prep_rw(.PROVIDE_BUFFERS, sqe, @intCast(i32, num), ptr, buffer_len, buffer_id); + sqe.buf_index = @intCast(u16, group_id); +} + +pub fn io_uring_prep_remove_buffers( + sqe: *linux.io_uring_sqe, + num: usize, + group_id: usize, +) void { + io_uring_prep_rw(.REMOVE_BUFFERS, sqe, @intCast(i32, num), 0, 0, 0); + sqe.buf_index = @intCast(u16, group_id); +} + test "structs/offsets/entries" { if (builtin.os.tag != .linux) return error.SkipZigTest; - try testing.expectEqual(@as(usize, 120), @sizeOf(io_uring_params)); - try testing.expectEqual(@as(usize, 64), @sizeOf(io_uring_sqe)); - try testing.expectEqual(@as(usize, 16), @sizeOf(io_uring_cqe)); + try testing.expectEqual(@as(usize, 120), @sizeOf(linux.io_uring_params)); + try testing.expectEqual(@as(usize, 64), @sizeOf(linux.io_uring_sqe)); + try testing.expectEqual(@as(usize, 16), @sizeOf(linux.io_uring_cqe)); try testing.expectEqual(0, linux.IORING_OFF_SQ_RING); try testing.expectEqual(0x8000000, linux.IORING_OFF_CQ_RING); @@ -1487,7 +1624,7 @@ test "nop" { } const sqe = try ring.nop(0xaaaaaaaa); - try testing.expectEqual(io_uring_sqe{ + try testing.expectEqual(linux.io_uring_sqe{ .opcode = .NOP, .flags = 0, .ioprio = 0, @@ -1517,7 +1654,7 @@ test "nop" { try testing.expectEqual(@as(u32, 0), ring.cq.head.*); try testing.expectEqual(@as(u32, 0), ring.sq_ready()); - try testing.expectEqual(io_uring_cqe{ + try testing.expectEqual(linux.io_uring_cqe{ .user_data = 0xaaaaaaaa, .res = 0, .flags = 0, @@ -1528,7 +1665,7 @@ test "nop" { const sqe_barrier = try ring.nop(0xbbbbbbbb); sqe_barrier.flags |= linux.IOSQE_IO_DRAIN; try testing.expectEqual(@as(u32, 1), try ring.submit()); - try testing.expectEqual(io_uring_cqe{ + try testing.expectEqual(linux.io_uring_cqe{ .user_data = 0xbbbbbbbb, .res = 0, .flags = 0, @@ -1565,7 +1702,7 @@ test "readv" { var buffer = [_]u8{42} ** 128; var iovecs = [_]os.iovec{os.iovec{ .iov_base = &buffer, .iov_len = buffer.len }}; - const sqe = try ring.readv(0xcccccccc, fd_index, iovecs[0..], 0); + const sqe = try ring.read(0xcccccccc, fd_index, .{ .iovecs = iovecs[0..] }, 0); try testing.expectEqual(linux.IORING_OP.READV, sqe.opcode); sqe.flags |= linux.IOSQE_FIXED_FILE; @@ -1616,7 +1753,7 @@ test "writev/fsync/readv" { try testing.expectEqual(fd, sqe_fsync.fd); sqe_fsync.flags |= linux.IOSQE_IO_LINK; - const sqe_readv = try ring.readv(0xffffffff, fd, iovecs_read[0..], 17); + const sqe_readv = try ring.read(0xffffffff, fd, .{ .iovecs = iovecs_read[0..] }, 17); try testing.expectEqual(linux.IORING_OP.READV, sqe_readv.opcode); try testing.expectEqual(@as(u64, 17), sqe_readv.off); @@ -1671,7 +1808,7 @@ test "write/read" { try testing.expectEqual(linux.IORING_OP.WRITE, sqe_write.opcode); try testing.expectEqual(@as(u64, 10), sqe_write.off); sqe_write.flags |= linux.IOSQE_IO_LINK; - const sqe_read = try ring.read(0x22222222, fd, buffer_read[0..], 10); + const sqe_read = try ring.read(0x22222222, fd, .{ .buffer = buffer_read[0..] }, 10); try testing.expectEqual(linux.IORING_OP.READ, sqe_read.opcode); try testing.expectEqual(@as(u64, 10), sqe_read.off); try testing.expectEqual(@as(u32, 2), try ring.submit()); @@ -1768,7 +1905,7 @@ test "openat" { const flags: u32 = os.O.CLOEXEC | os.O.RDWR | os.O.CREAT; const mode: os.mode_t = 0o666; const sqe_openat = try ring.openat(0x33333333, linux.AT.FDCWD, path, flags, mode); - try testing.expectEqual(io_uring_sqe{ + try testing.expectEqual(linux.io_uring_sqe{ .opcode = .OPENAT, .flags = 0, .ioprio = 0, @@ -1840,53 +1977,15 @@ test "accept/connect/send/recv" { }; defer ring.deinit(); - const address = try net.Address.parseIp4("127.0.0.1", 3131); - const kernel_backlog = 1; - const server = try os.socket(address.any.family, os.SOCK.STREAM | os.SOCK.CLOEXEC, 0); - defer os.close(server); - try os.setsockopt(server, os.SOL.SOCKET, os.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1))); - try os.bind(server, &address.any, address.getOsSockLen()); - try os.listen(server, kernel_backlog); + const socket_test_harness = try createSocketTestHarness(&ring); + defer socket_test_harness.close(); const buffer_send = [_]u8{ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }; var buffer_recv = [_]u8{ 0, 1, 0, 1, 0 }; - var accept_addr: os.sockaddr = undefined; - var accept_addr_len: os.socklen_t = @sizeOf(@TypeOf(accept_addr)); - _ = try ring.accept(0xaaaaaaaa, server, &accept_addr, &accept_addr_len, 0); - try testing.expectEqual(@as(u32, 1), try ring.submit()); - - const client = try os.socket(address.any.family, os.SOCK.STREAM | os.SOCK.CLOEXEC, 0); - defer os.close(client); - _ = try ring.connect(0xcccccccc, client, &address.any, address.getOsSockLen()); - try testing.expectEqual(@as(u32, 1), try ring.submit()); - - var cqe_accept = try ring.copy_cqe(); - if (cqe_accept.err() == .INVAL) return error.SkipZigTest; - var cqe_connect = try ring.copy_cqe(); - if (cqe_connect.err() == .INVAL) return error.SkipZigTest; - - // The accept/connect CQEs may arrive in any order, the connect CQE will sometimes come first: - if (cqe_accept.user_data == 0xcccccccc and cqe_connect.user_data == 0xaaaaaaaa) { - const a = cqe_accept; - const b = cqe_connect; - cqe_accept = b; - cqe_connect = a; - } - - try testing.expectEqual(@as(u64, 0xaaaaaaaa), cqe_accept.user_data); - if (cqe_accept.res <= 0) std.debug.print("\ncqe_accept.res={}\n", .{cqe_accept.res}); - try testing.expect(cqe_accept.res > 0); - try testing.expectEqual(@as(u32, 0), cqe_accept.flags); - try testing.expectEqual(linux.io_uring_cqe{ - .user_data = 0xcccccccc, - .res = 0, - .flags = 0, - }, cqe_connect); - - const send = try ring.send(0xeeeeeeee, client, buffer_send[0..], 0); + const send = try ring.send(0xeeeeeeee, socket_test_harness.client, buffer_send[0..], 0); send.flags |= linux.IOSQE_IO_LINK; - _ = try ring.recv(0xffffffff, cqe_accept.res, buffer_recv[0..], 0); + _ = try ring.recv(0xffffffff, socket_test_harness.server, .{ .buffer = buffer_recv[0..] }, 0); try testing.expectEqual(@as(u32, 2), try ring.submit()); const cqe_send = try ring.copy_cqe(); @@ -1908,6 +2007,88 @@ test "accept/connect/send/recv" { try testing.expectEqualSlices(u8, buffer_send[0..buffer_recv.len], buffer_recv[0..]); } +test "sendmsg/recvmsg" { + if (builtin.os.tag != .linux) return error.SkipZigTest; + + var ring = IO_Uring.init(2, 0) catch |err| switch (err) { + error.SystemOutdated => return error.SkipZigTest, + error.PermissionDenied => return error.SkipZigTest, + else => return err, + }; + defer ring.deinit(); + + const address_server = try net.Address.parseIp4("127.0.0.1", 3131); + + const server = try os.socket(address_server.any.family, os.SOCK.DGRAM, 0); + defer os.close(server); + try os.setsockopt(server, os.SOL.SOCKET, os.SO.REUSEPORT, &mem.toBytes(@as(c_int, 1))); + try os.setsockopt(server, os.SOL.SOCKET, os.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1))); + try os.bind(server, &address_server.any, address_server.getOsSockLen()); + + const client = try os.socket(address_server.any.family, os.SOCK.DGRAM, 0); + defer os.close(client); + + const buffer_send = [_]u8{42} ** 128; + const iovecs_send = [_]os.iovec_const{ + os.iovec_const{ .iov_base = &buffer_send, .iov_len = buffer_send.len }, + }; + const msg_send = os.msghdr_const{ + .name = &address_server.any, + .namelen = address_server.getOsSockLen(), + .iov = &iovecs_send, + .iovlen = 1, + .control = null, + .controllen = 0, + .flags = 0, + }; + const sqe_sendmsg = try ring.sendmsg(0x11111111, client, &msg_send, 0); + sqe_sendmsg.flags |= linux.IOSQE_IO_LINK; + try testing.expectEqual(linux.IORING_OP.SENDMSG, sqe_sendmsg.opcode); + try testing.expectEqual(client, sqe_sendmsg.fd); + + var buffer_recv = [_]u8{0} ** 128; + var iovecs_recv = [_]os.iovec{ + os.iovec{ .iov_base = &buffer_recv, .iov_len = buffer_recv.len }, + }; + var addr = [_]u8{0} ** 4; + var address_recv = net.Address.initIp4(addr, 0); + var msg_recv: os.msghdr = os.msghdr{ + .name = &address_recv.any, + .namelen = address_recv.getOsSockLen(), + .iov = &iovecs_recv, + .iovlen = 1, + .control = null, + .controllen = 0, + .flags = 0, + }; + const sqe_recvmsg = try ring.recvmsg(0x22222222, server, &msg_recv, 0); + try testing.expectEqual(linux.IORING_OP.RECVMSG, sqe_recvmsg.opcode); + try testing.expectEqual(server, sqe_recvmsg.fd); + + try testing.expectEqual(@as(u32, 2), ring.sq_ready()); + try testing.expectEqual(@as(u32, 2), try ring.submit_and_wait(2)); + try testing.expectEqual(@as(u32, 0), ring.sq_ready()); + try testing.expectEqual(@as(u32, 2), ring.cq_ready()); + + const cqe_sendmsg = try ring.copy_cqe(); + if (cqe_sendmsg.res == -@as(i32, @enumToInt(linux.E.INVAL))) return error.SkipZigTest; + try testing.expectEqual(linux.io_uring_cqe{ + .user_data = 0x11111111, + .res = buffer_send.len, + .flags = 0, + }, cqe_sendmsg); + + const cqe_recvmsg = try ring.copy_cqe(); + if (cqe_recvmsg.res == -@as(i32, @enumToInt(linux.E.INVAL))) return error.SkipZigTest; + try testing.expectEqual(linux.io_uring_cqe{ + .user_data = 0x22222222, + .res = buffer_recv.len, + .flags = 0, + }, cqe_recvmsg); + + try testing.expectEqualSlices(u8, buffer_send[0..buffer_recv.len], buffer_recv[0..]); +} + test "timeout (after a relative time)" { if (builtin.os.tag != .linux) return error.SkipZigTest; @@ -2029,50 +2210,12 @@ test "accept/connect/recv/link_timeout" { }; defer ring.deinit(); - const address = try net.Address.parseIp4("127.0.0.1", 3131); - const kernel_backlog = 1; - const server = try os.socket(address.any.family, os.SOCK.STREAM | os.SOCK.CLOEXEC, 0); - defer os.close(server); - try os.setsockopt(server, os.SOL.SOCKET, os.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1))); - try os.bind(server, &address.any, address.getOsSockLen()); - try os.listen(server, kernel_backlog); + const socket_test_harness = try createSocketTestHarness(&ring); + defer socket_test_harness.close(); var buffer_recv = [_]u8{ 0, 1, 0, 1, 0 }; - var accept_addr: os.sockaddr = undefined; - var accept_addr_len: os.socklen_t = @sizeOf(@TypeOf(accept_addr)); - _ = try ring.accept(0xaaaaaaaa, server, &accept_addr, &accept_addr_len, 0); - try testing.expectEqual(@as(u32, 1), try ring.submit()); - - const client = try os.socket(address.any.family, os.SOCK.STREAM | os.SOCK.CLOEXEC, 0); - defer os.close(client); - _ = try ring.connect(0xcccccccc, client, &address.any, address.getOsSockLen()); - try testing.expectEqual(@as(u32, 1), try ring.submit()); - - var cqe_accept = try ring.copy_cqe(); - if (cqe_accept.err() == .INVAL) return error.SkipZigTest; - var cqe_connect = try ring.copy_cqe(); - if (cqe_connect.err() == .INVAL) return error.SkipZigTest; - - // The accept/connect CQEs may arrive in any order, the connect CQE will sometimes come first: - if (cqe_accept.user_data == 0xcccccccc and cqe_connect.user_data == 0xaaaaaaaa) { - const a = cqe_accept; - const b = cqe_connect; - cqe_accept = b; - cqe_connect = a; - } - - try testing.expectEqual(@as(u64, 0xaaaaaaaa), cqe_accept.user_data); - if (cqe_accept.res <= 0) std.debug.print("\ncqe_accept.res={}\n", .{cqe_accept.res}); - try testing.expect(cqe_accept.res > 0); - try testing.expectEqual(@as(u32, 0), cqe_accept.flags); - try testing.expectEqual(linux.io_uring_cqe{ - .user_data = 0xcccccccc, - .res = 0, - .flags = 0, - }, cqe_connect); - - const sqe_recv = try ring.recv(0xffffffff, cqe_accept.res, buffer_recv[0..], 0); + const sqe_recv = try ring.recv(0xffffffff, socket_test_harness.server, .{ .buffer = buffer_recv[0..] }, 0); sqe_recv.flags |= linux.IOSQE_IO_LINK; const ts = os.linux.kernel_timespec{ .tv_sec = 0, .tv_nsec = 1000000 }; @@ -2216,50 +2359,12 @@ test "accept/connect/recv/cancel" { }; defer ring.deinit(); - const address = try net.Address.parseIp4("127.0.0.1", 3131); - const kernel_backlog = 1; - const server = try os.socket(address.any.family, os.SOCK.STREAM | os.SOCK.CLOEXEC, 0); - defer os.close(server); - try os.setsockopt(server, os.SOL.SOCKET, os.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1))); - try os.bind(server, &address.any, address.getOsSockLen()); - try os.listen(server, kernel_backlog); + const socket_test_harness = try createSocketTestHarness(&ring); + defer socket_test_harness.close(); var buffer_recv = [_]u8{ 0, 1, 0, 1, 0 }; - var accept_addr: os.sockaddr = undefined; - var accept_addr_len: os.socklen_t = @sizeOf(@TypeOf(accept_addr)); - _ = try ring.accept(0xaaaaaaaa, server, &accept_addr, &accept_addr_len, 0); - try testing.expectEqual(@as(u32, 1), try ring.submit()); - - const client = try os.socket(address.any.family, os.SOCK.STREAM | os.SOCK.CLOEXEC, 0); - defer os.close(client); - _ = try ring.connect(0xcccccccc, client, &address.any, address.getOsSockLen()); - try testing.expectEqual(@as(u32, 1), try ring.submit()); - - var cqe_accept = try ring.copy_cqe(); - if (cqe_accept.err() == .INVAL) return error.SkipZigTest; - var cqe_connect = try ring.copy_cqe(); - if (cqe_connect.err() == .INVAL) return error.SkipZigTest; - - // The accept/connect CQEs may arrive in any order, the connect CQE will sometimes come first: - if (cqe_accept.user_data == 0xcccccccc and cqe_connect.user_data == 0xaaaaaaaa) { - const a = cqe_accept; - const b = cqe_connect; - cqe_accept = b; - cqe_connect = a; - } - - try testing.expectEqual(@as(u64, 0xaaaaaaaa), cqe_accept.user_data); - if (cqe_accept.res <= 0) std.debug.print("\ncqe_accept.res={}\n", .{cqe_accept.res}); - try testing.expect(cqe_accept.res > 0); - try testing.expectEqual(@as(u32, 0), cqe_accept.flags); - try testing.expectEqual(linux.io_uring_cqe{ - .user_data = 0xcccccccc, - .res = 0, - .flags = 0, - }, cqe_connect); - - _ = try ring.recv(0xffffffff, cqe_accept.res, buffer_recv[0..], 0); + _ = try ring.recv(0xffffffff, socket_test_harness.server, .{ .buffer = buffer_recv[0..] }, 0); try testing.expectEqual(@as(u32, 1), try ring.submit()); const sqe_cancel = try ring.cancel(0x99999999, 0xffffffff, 0); @@ -2268,15 +2373,25 @@ test "accept/connect/recv/cancel" { try testing.expectEqual(@as(u64, 0x99999999), sqe_cancel.user_data); try testing.expectEqual(@as(u32, 1), try ring.submit()); - const cqe_recv = try ring.copy_cqe(); + var cqe_recv = try ring.copy_cqe(); if (cqe_recv.err() == .INVAL) return error.SkipZigTest; + var cqe_cancel = try ring.copy_cqe(); + if (cqe_cancel.err() == .INVAL) return error.SkipZigTest; + + // The recv/cancel CQEs may arrive in any order, the recv CQE will sometimes come first: + if (cqe_recv.user_data == 0x99999999 and cqe_cancel.user_data == 0xffffffff) { + const a = cqe_recv; + const b = cqe_cancel; + cqe_recv = b; + cqe_cancel = a; + } + try testing.expectEqual(linux.io_uring_cqe{ .user_data = 0xffffffff, .res = -@as(i32, @enumToInt(linux.E.CANCELED)), .flags = 0, }, cqe_recv); - const cqe_cancel = try ring.copy_cqe(); try testing.expectEqual(linux.io_uring_cqe{ .user_data = 0x99999999, .res = 0, @@ -2321,7 +2436,7 @@ test "register_files_update" { var buffer = [_]u8{42} ** 128; { - const sqe = try ring.read(0xcccccccc, fd_index, &buffer, 0); + const sqe = try ring.read(0xcccccccc, fd_index, .{ .buffer = &buffer }, 0); try testing.expectEqual(linux.IORING_OP.READ, sqe.opcode); sqe.flags |= linux.IOSQE_FIXED_FILE; @@ -2342,7 +2457,7 @@ test "register_files_update" { { // Next read should still work since fd_index in the registered file descriptors hasn't been updated yet. - const sqe = try ring.read(0xcccccccc, fd_index, &buffer, 0); + const sqe = try ring.read(0xcccccccc, fd_index, .{ .buffer = &buffer }, 0); try testing.expectEqual(linux.IORING_OP.READ, sqe.opcode); sqe.flags |= linux.IOSQE_FIXED_FILE; @@ -2359,7 +2474,7 @@ test "register_files_update" { { // Now this should fail since both fds are sparse (-1) - const sqe = try ring.read(0xcccccccc, fd_index, &buffer, 0); + const sqe = try ring.read(0xcccccccc, fd_index, .{ .buffer = &buffer }, 0); try testing.expectEqual(linux.IORING_OP.READ, sqe.opcode); sqe.flags |= linux.IOSQE_FIXED_FILE; @@ -2701,3 +2816,455 @@ test "linkat" { const read = try second_file.readAll(&second_file_data); try testing.expectEqualStrings("hello", second_file_data[0..read]); } + +test "provide_buffers: read" { + if (builtin.os.tag != .linux) return error.SkipZigTest; + + var ring = IO_Uring.init(1, 0) catch |err| switch (err) { + error.SystemOutdated => return error.SkipZigTest, + error.PermissionDenied => return error.SkipZigTest, + else => return err, + }; + defer ring.deinit(); + + const fd = try os.openZ("/dev/zero", os.O.RDONLY | os.O.CLOEXEC, 0); + defer os.close(fd); + + const group_id = 1337; + const buffer_id = 0; + + const buffer_len = 128; + + var buffers: [4][buffer_len]u8 = undefined; + + // Provide 4 buffers + + { + const sqe = try ring.provide_buffers(0xcccccccc, @ptrCast([*]u8, &buffers), buffers.len, buffer_len, group_id, buffer_id); + try testing.expectEqual(linux.IORING_OP.PROVIDE_BUFFERS, sqe.opcode); + try testing.expectEqual(@as(i32, buffers.len), sqe.fd); + try testing.expectEqual(@as(u32, buffers[0].len), sqe.len); + try testing.expectEqual(@as(u16, group_id), sqe.buf_index); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + const cqe = try ring.copy_cqe(); + switch (cqe.err()) { + // Happens when the kernel is < 5.7 + .INVAL => return error.SkipZigTest, + .SUCCESS => {}, + else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), + } + try testing.expectEqual(@as(u64, 0xcccccccc), cqe.user_data); + } + + // Do 4 reads which should consume all buffers + + var i: usize = 0; + while (i < buffers.len) : (i += 1) { + var sqe = try ring.read(0xdededede, fd, .{ .buffer_selection = .{ .group_id = group_id, .len = buffer_len } }, 0); + try testing.expectEqual(linux.IORING_OP.READ, sqe.opcode); + try testing.expectEqual(@as(i32, fd), sqe.fd); + try testing.expectEqual(@as(u64, 0), sqe.addr); + try testing.expectEqual(@as(u32, buffer_len), sqe.len); + try testing.expectEqual(@as(u16, group_id), sqe.buf_index); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + const cqe = try ring.copy_cqe(); + switch (cqe.err()) { + .SUCCESS => {}, + else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), + } + + try testing.expect(cqe.flags & linux.IORING_CQE_F_BUFFER == linux.IORING_CQE_F_BUFFER); + const used_buffer_id = cqe.flags >> 16; + try testing.expect(used_buffer_id >= 0 and used_buffer_id <= 3); + try testing.expectEqual(@as(i32, buffer_len), cqe.res); + + try testing.expectEqual(@as(u64, 0xdededede), cqe.user_data); + try testing.expectEqualSlices(u8, &([_]u8{0} ** buffer_len), buffers[used_buffer_id][0..@intCast(usize, cqe.res)]); + } + + // This read should fail + + { + var sqe = try ring.read(0xdfdfdfdf, fd, .{ .buffer_selection = .{ .group_id = group_id, .len = buffer_len } }, 0); + try testing.expectEqual(linux.IORING_OP.READ, sqe.opcode); + try testing.expectEqual(@as(i32, fd), sqe.fd); + try testing.expectEqual(@as(u64, 0), sqe.addr); + try testing.expectEqual(@as(u32, buffer_len), sqe.len); + try testing.expectEqual(@as(u16, group_id), sqe.buf_index); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + const cqe = try ring.copy_cqe(); + switch (cqe.err()) { + // Expected + .NOBUFS => {}, + .SUCCESS => std.debug.panic("unexpected success", .{}), + else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), + } + try testing.expectEqual(@as(u64, 0xdfdfdfdf), cqe.user_data); + } + + // Provide 1 buffer again + + // Deliberately put something we don't expect in the buffers + mem.set(u8, mem.sliceAsBytes(&buffers), 42); + + const reprovided_buffer_id = 2; + + { + _ = try ring.provide_buffers(0xabababab, @ptrCast([*]u8, &buffers[reprovided_buffer_id]), 1, buffer_len, group_id, reprovided_buffer_id); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + const cqe = try ring.copy_cqe(); + switch (cqe.err()) { + .SUCCESS => {}, + else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), + } + } + + // Final read which should work + + { + var sqe = try ring.read(0xdfdfdfdf, fd, .{ .buffer_selection = .{ .group_id = group_id, .len = buffer_len } }, 0); + try testing.expectEqual(linux.IORING_OP.READ, sqe.opcode); + try testing.expectEqual(@as(i32, fd), sqe.fd); + try testing.expectEqual(@as(u64, 0), sqe.addr); + try testing.expectEqual(@as(u32, buffer_len), sqe.len); + try testing.expectEqual(@as(u16, group_id), sqe.buf_index); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + const cqe = try ring.copy_cqe(); + switch (cqe.err()) { + .SUCCESS => {}, + else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), + } + + try testing.expect(cqe.flags & linux.IORING_CQE_F_BUFFER == linux.IORING_CQE_F_BUFFER); + const used_buffer_id = cqe.flags >> 16; + try testing.expectEqual(used_buffer_id, reprovided_buffer_id); + try testing.expectEqual(@as(i32, buffer_len), cqe.res); + try testing.expectEqual(@as(u64, 0xdfdfdfdf), cqe.user_data); + try testing.expectEqualSlices(u8, &([_]u8{0} ** buffer_len), buffers[used_buffer_id][0..@intCast(usize, cqe.res)]); + } +} + +test "remove_buffers" { + if (builtin.os.tag != .linux) return error.SkipZigTest; + + var ring = IO_Uring.init(1, 0) catch |err| switch (err) { + error.SystemOutdated => return error.SkipZigTest, + error.PermissionDenied => return error.SkipZigTest, + else => return err, + }; + defer ring.deinit(); + + const fd = try os.openZ("/dev/zero", os.O.RDONLY | os.O.CLOEXEC, 0); + defer os.close(fd); + + const group_id = 1337; + const buffer_id = 0; + + const buffer_len = 128; + + var buffers: [4][buffer_len]u8 = undefined; + + // Provide 4 buffers + + { + _ = try ring.provide_buffers(0xcccccccc, @ptrCast([*]u8, &buffers), buffers.len, buffer_len, group_id, buffer_id); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + const cqe = try ring.copy_cqe(); + switch (cqe.err()) { + .SUCCESS => {}, + else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), + } + try testing.expectEqual(@as(u64, 0xcccccccc), cqe.user_data); + } + + // Remove the first 3 buffers + + { + var sqe = try ring.remove_buffers(0xbababababa, 3, group_id); + try testing.expectEqual(linux.IORING_OP.REMOVE_BUFFERS, sqe.opcode); + try testing.expectEqual(@as(i32, 3), sqe.fd); + try testing.expectEqual(@as(u64, 0), sqe.addr); + try testing.expectEqual(@as(u16, group_id), sqe.buf_index); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + const cqe = try ring.copy_cqe(); + switch (cqe.err()) { + .SUCCESS => {}, + else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), + } + try testing.expectEqual(@as(u64, 0xbababababa), cqe.user_data); + } + + // This read should work + + { + _ = try ring.read(0xdfdfdfdf, fd, .{ .buffer_selection = .{ .group_id = group_id, .len = buffer_len } }, 0); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + const cqe = try ring.copy_cqe(); + switch (cqe.err()) { + .SUCCESS => {}, + else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), + } + + try testing.expect(cqe.flags & linux.IORING_CQE_F_BUFFER == linux.IORING_CQE_F_BUFFER); + const used_buffer_id = cqe.flags >> 16; + try testing.expectEqual(used_buffer_id, 0); + try testing.expectEqual(@as(i32, buffer_len), cqe.res); + try testing.expectEqual(@as(u64, 0xdfdfdfdf), cqe.user_data); + try testing.expectEqualSlices(u8, &([_]u8{0} ** buffer_len), buffers[used_buffer_id][0..@intCast(usize, cqe.res)]); + } + + // Final read should _not_ work + + { + _ = try ring.read(0xdfdfdfdf, fd, .{ .buffer_selection = .{ .group_id = group_id, .len = buffer_len } }, 0); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + const cqe = try ring.copy_cqe(); + switch (cqe.err()) { + // Expected + .NOBUFS => {}, + .SUCCESS => std.debug.panic("unexpected success", .{}), + else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), + } + } +} + +test "provide_buffers: accept/connect/send/recv" { + if (builtin.os.tag != .linux) return error.SkipZigTest; + + var ring = IO_Uring.init(16, 0) catch |err| switch (err) { + error.SystemOutdated => return error.SkipZigTest, + error.PermissionDenied => return error.SkipZigTest, + else => return err, + }; + defer ring.deinit(); + + const group_id = 1337; + const buffer_id = 0; + + const buffer_len = 128; + var buffers: [4][buffer_len]u8 = undefined; + + // Provide 4 buffers + + { + const sqe = try ring.provide_buffers(0xcccccccc, @ptrCast([*]u8, &buffers), buffers.len, buffer_len, group_id, buffer_id); + try testing.expectEqual(linux.IORING_OP.PROVIDE_BUFFERS, sqe.opcode); + try testing.expectEqual(@as(i32, buffers.len), sqe.fd); + try testing.expectEqual(@as(u32, buffer_len), sqe.len); + try testing.expectEqual(@as(u16, group_id), sqe.buf_index); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + const cqe = try ring.copy_cqe(); + switch (cqe.err()) { + // Happens when the kernel is < 5.7 + .INVAL => return error.SkipZigTest, + .SUCCESS => {}, + else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), + } + try testing.expectEqual(@as(u64, 0xcccccccc), cqe.user_data); + } + + const socket_test_harness = try createSocketTestHarness(&ring); + defer socket_test_harness.close(); + + // Do 4 send on the socket + + { + var i: usize = 0; + while (i < buffers.len) : (i += 1) { + _ = try ring.send(0xdeaddead, socket_test_harness.server, &([_]u8{'z'} ** buffer_len), 0); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + } + + var cqes: [4]linux.io_uring_cqe = undefined; + try testing.expectEqual(@as(u32, 4), try ring.copy_cqes(&cqes, 4)); + } + + // Do 4 recv which should consume all buffers + + // Deliberately put something we don't expect in the buffers + mem.set(u8, mem.sliceAsBytes(&buffers), 1); + + var i: usize = 0; + while (i < buffers.len) : (i += 1) { + var sqe = try ring.recv(0xdededede, socket_test_harness.client, .{ .buffer_selection = .{ .group_id = group_id, .len = buffer_len } }, 0); + try testing.expectEqual(linux.IORING_OP.RECV, sqe.opcode); + try testing.expectEqual(@as(i32, socket_test_harness.client), sqe.fd); + try testing.expectEqual(@as(u64, 0), sqe.addr); + try testing.expectEqual(@as(u32, buffer_len), sqe.len); + try testing.expectEqual(@as(u16, group_id), sqe.buf_index); + try testing.expectEqual(@as(u32, 0), sqe.rw_flags); + try testing.expectEqual(@as(u32, linux.IOSQE_BUFFER_SELECT), sqe.flags); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + const cqe = try ring.copy_cqe(); + switch (cqe.err()) { + .SUCCESS => {}, + else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), + } + + try testing.expect(cqe.flags & linux.IORING_CQE_F_BUFFER == linux.IORING_CQE_F_BUFFER); + const used_buffer_id = cqe.flags >> 16; + try testing.expect(used_buffer_id >= 0 and used_buffer_id <= 3); + try testing.expectEqual(@as(i32, buffer_len), cqe.res); + + try testing.expectEqual(@as(u64, 0xdededede), cqe.user_data); + const buffer = buffers[used_buffer_id][0..@intCast(usize, cqe.res)]; + try testing.expectEqualSlices(u8, &([_]u8{'z'} ** buffer_len), buffer); + } + + // This recv should fail + + { + var sqe = try ring.recv(0xdfdfdfdf, socket_test_harness.client, .{ .buffer_selection = .{ .group_id = group_id, .len = buffer_len } }, 0); + try testing.expectEqual(linux.IORING_OP.RECV, sqe.opcode); + try testing.expectEqual(@as(i32, socket_test_harness.client), sqe.fd); + try testing.expectEqual(@as(u64, 0), sqe.addr); + try testing.expectEqual(@as(u32, buffer_len), sqe.len); + try testing.expectEqual(@as(u16, group_id), sqe.buf_index); + try testing.expectEqual(@as(u32, 0), sqe.rw_flags); + try testing.expectEqual(@as(u32, linux.IOSQE_BUFFER_SELECT), sqe.flags); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + const cqe = try ring.copy_cqe(); + switch (cqe.err()) { + // Expected + .NOBUFS => {}, + .SUCCESS => std.debug.panic("unexpected success", .{}), + else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), + } + try testing.expectEqual(@as(u64, 0xdfdfdfdf), cqe.user_data); + } + + // Provide 1 buffer again + + const reprovided_buffer_id = 2; + + { + _ = try ring.provide_buffers(0xabababab, @ptrCast([*]u8, &buffers[reprovided_buffer_id]), 1, buffer_len, group_id, reprovided_buffer_id); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + const cqe = try ring.copy_cqe(); + switch (cqe.err()) { + .SUCCESS => {}, + else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), + } + } + + // Redo 1 send on the server socket + + { + _ = try ring.send(0xdeaddead, socket_test_harness.server, &([_]u8{'w'} ** buffer_len), 0); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + _ = try ring.copy_cqe(); + } + + // Final recv which should work + + // Deliberately put something we don't expect in the buffers + mem.set(u8, mem.sliceAsBytes(&buffers), 1); + + { + var sqe = try ring.recv(0xdfdfdfdf, socket_test_harness.client, .{ .buffer_selection = .{ .group_id = group_id, .len = buffer_len } }, 0); + try testing.expectEqual(linux.IORING_OP.RECV, sqe.opcode); + try testing.expectEqual(@as(i32, socket_test_harness.client), sqe.fd); + try testing.expectEqual(@as(u64, 0), sqe.addr); + try testing.expectEqual(@as(u32, buffer_len), sqe.len); + try testing.expectEqual(@as(u16, group_id), sqe.buf_index); + try testing.expectEqual(@as(u32, 0), sqe.rw_flags); + try testing.expectEqual(@as(u32, linux.IOSQE_BUFFER_SELECT), sqe.flags); + try testing.expectEqual(@as(u32, 1), try ring.submit()); + + const cqe = try ring.copy_cqe(); + switch (cqe.err()) { + .SUCCESS => {}, + else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), + } + + try testing.expect(cqe.flags & linux.IORING_CQE_F_BUFFER == linux.IORING_CQE_F_BUFFER); + const used_buffer_id = cqe.flags >> 16; + try testing.expectEqual(used_buffer_id, reprovided_buffer_id); + try testing.expectEqual(@as(i32, buffer_len), cqe.res); + try testing.expectEqual(@as(u64, 0xdfdfdfdf), cqe.user_data); + const buffer = buffers[used_buffer_id][0..@intCast(usize, cqe.res)]; + try testing.expectEqualSlices(u8, &([_]u8{'w'} ** buffer_len), buffer); + } +} + +/// Used for testing server/client interactions. +const SocketTestHarness = struct { + listener: os.socket_t, + server: os.socket_t, + client: os.socket_t, + + fn close(self: SocketTestHarness) void { + os.closeSocket(self.client); + os.closeSocket(self.listener); + } +}; + +fn createSocketTestHarness(ring: *IO_Uring) !SocketTestHarness { + // Create a TCP server socket + + const address = try net.Address.parseIp4("127.0.0.1", 3131); + const kernel_backlog = 1; + const listener_socket = try os.socket(address.any.family, os.SOCK.STREAM | os.SOCK.CLOEXEC, 0); + errdefer os.closeSocket(listener_socket); + + try os.setsockopt(listener_socket, os.SOL.SOCKET, os.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1))); + try os.bind(listener_socket, &address.any, address.getOsSockLen()); + try os.listen(listener_socket, kernel_backlog); + + // Submit 1 accept + var accept_addr: os.sockaddr = undefined; + var accept_addr_len: os.socklen_t = @sizeOf(@TypeOf(accept_addr)); + _ = try ring.accept(0xaaaaaaaa, listener_socket, &accept_addr, &accept_addr_len, 0); + + // Create a TCP client socket + const client = try os.socket(address.any.family, os.SOCK.STREAM | os.SOCK.CLOEXEC, 0); + errdefer os.closeSocket(client); + _ = try ring.connect(0xcccccccc, client, &address.any, address.getOsSockLen()); + + try testing.expectEqual(@as(u32, 2), try ring.submit()); + + var cqe_accept = try ring.copy_cqe(); + if (cqe_accept.err() == .INVAL) return error.SkipZigTest; + var cqe_connect = try ring.copy_cqe(); + if (cqe_connect.err() == .INVAL) return error.SkipZigTest; + + // The accept/connect CQEs may arrive in any order, the connect CQE will sometimes come first: + if (cqe_accept.user_data == 0xcccccccc and cqe_connect.user_data == 0xaaaaaaaa) { + const a = cqe_accept; + const b = cqe_connect; + cqe_accept = b; + cqe_connect = a; + } + + try testing.expectEqual(@as(u64, 0xaaaaaaaa), cqe_accept.user_data); + if (cqe_accept.res <= 0) std.debug.print("\ncqe_accept.res={}\n", .{cqe_accept.res}); + try testing.expect(cqe_accept.res > 0); + try testing.expectEqual(@as(u32, 0), cqe_accept.flags); + try testing.expectEqual(linux.io_uring_cqe{ + .user_data = 0xcccccccc, + .res = 0, + .flags = 0, + }, cqe_connect); + + // All good + + return SocketTestHarness{ + .listener = listener_socket, + .server = cqe_accept.res, + .client = client, + }; +} diff --git a/lib/std/os/linux/ioctl.zig b/lib/std/os/linux/ioctl.zig index 35ff1bfc32..96ec96c306 100644 --- a/lib/std/os/linux/ioctl.zig +++ b/lib/std/os/linux/ioctl.zig @@ -10,7 +10,7 @@ const bits = switch (@import("builtin").cpu.arch) { .powerpc64, .powerpc64le, .sparc, - .sparcv9, + .sparc64, .sparcel, => .{ .size = 13, .dir = 3, .none = 1, .read = 2, .write = 4 }, else => .{ .size = 14, .dir = 2, .none = 0, .read = 2, .write = 1 }, diff --git a/lib/std/os/linux/mips.zig b/lib/std/os/linux/mips.zig index a7235f4de2..ee0aff281c 100644 --- a/lib/std/os/linux/mips.zig +++ b/lib/std/os/linux/mips.zig @@ -1,12 +1,14 @@ const std = @import("../../std.zig"); const maxInt = std.math.maxInt; const linux = std.os.linux; +const SYS = linux.SYS; const socklen_t = linux.socklen_t; -const iovec = linux.iovec; -const iovec_const = linux.iovec_const; +const iovec = std.os.iovec; +const iovec_const = std.os.iovec_const; const uid_t = linux.uid_t; const gid_t = linux.gid_t; const pid_t = linux.pid_t; +const sockaddr = linux.sockaddr; const timespec = linux.timespec; pub fn syscall0(number: SYS) usize { @@ -188,8 +190,13 @@ pub fn syscall7( ); } +const CloneFn = switch (@import("builtin").zig_backend) { + .stage1 => fn (arg: usize) callconv(.C) u8, + else => *const fn (arg: usize) callconv(.C) u8, +}; + /// This matches the libc clone function. -pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags: u32, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; +pub extern fn clone(func: CloneFn, stack: usize, flags: u32, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; pub fn restore() callconv(.Naked) void { return asm volatile ("syscall" @@ -207,433 +214,6 @@ pub fn restore_rt() callconv(.Naked) void { ); } -pub const SYS = enum(usize) { - pub const Linux = 4000; - - syscall = Linux + 0, - exit = Linux + 1, - fork = Linux + 2, - read = Linux + 3, - write = Linux + 4, - open = Linux + 5, - close = Linux + 6, - waitpid = Linux + 7, - creat = Linux + 8, - link = Linux + 9, - unlink = Linux + 10, - execve = Linux + 11, - chdir = Linux + 12, - time = Linux + 13, - mknod = Linux + 14, - chmod = Linux + 15, - lchown = Linux + 16, - @"break" = Linux + 17, - unused18 = Linux + 18, - lseek = Linux + 19, - getpid = Linux + 20, - mount = Linux + 21, - umount = Linux + 22, - setuid = Linux + 23, - getuid = Linux + 24, - stime = Linux + 25, - ptrace = Linux + 26, - alarm = Linux + 27, - unused28 = Linux + 28, - pause = Linux + 29, - utime = Linux + 30, - stty = Linux + 31, - gtty = Linux + 32, - access = Linux + 33, - nice = Linux + 34, - ftime = Linux + 35, - sync = Linux + 36, - kill = Linux + 37, - rename = Linux + 38, - mkdir = Linux + 39, - rmdir = Linux + 40, - dup = Linux + 41, - pipe = Linux + 42, - times = Linux + 43, - prof = Linux + 44, - brk = Linux + 45, - setgid = Linux + 46, - getgid = Linux + 47, - signal = Linux + 48, - geteuid = Linux + 49, - getegid = Linux + 50, - acct = Linux + 51, - umount2 = Linux + 52, - lock = Linux + 53, - ioctl = Linux + 54, - fcntl = Linux + 55, - mpx = Linux + 56, - setpgid = Linux + 57, - ulimit = Linux + 58, - unused59 = Linux + 59, - umask = Linux + 60, - chroot = Linux + 61, - ustat = Linux + 62, - dup2 = Linux + 63, - getppid = Linux + 64, - getpgrp = Linux + 65, - setsid = Linux + 66, - sigaction = Linux + 67, - sgetmask = Linux + 68, - ssetmask = Linux + 69, - setreuid = Linux + 70, - setregid = Linux + 71, - sigsuspend = Linux + 72, - sigpending = Linux + 73, - sethostname = Linux + 74, - setrlimit = Linux + 75, - getrlimit = Linux + 76, - getrusage = Linux + 77, - gettimeofday = Linux + 78, - settimeofday = Linux + 79, - getgroups = Linux + 80, - setgroups = Linux + 81, - reserved82 = Linux + 82, - symlink = Linux + 83, - unused84 = Linux + 84, - readlink = Linux + 85, - uselib = Linux + 86, - swapon = Linux + 87, - reboot = Linux + 88, - readdir = Linux + 89, - mmap = Linux + 90, - munmap = Linux + 91, - truncate = Linux + 92, - ftruncate = Linux + 93, - fchmod = Linux + 94, - fchown = Linux + 95, - getpriority = Linux + 96, - setpriority = Linux + 97, - profil = Linux + 98, - statfs = Linux + 99, - fstatfs = Linux + 100, - ioperm = Linux + 101, - socketcall = Linux + 102, - syslog = Linux + 103, - setitimer = Linux + 104, - getitimer = Linux + 105, - stat = Linux + 106, - lstat = Linux + 107, - fstat = Linux + 108, - unused109 = Linux + 109, - iopl = Linux + 110, - vhangup = Linux + 111, - idle = Linux + 112, - vm86 = Linux + 113, - wait4 = Linux + 114, - swapoff = Linux + 115, - sysinfo = Linux + 116, - ipc = Linux + 117, - fsync = Linux + 118, - sigreturn = Linux + 119, - clone = Linux + 120, - setdomainname = Linux + 121, - uname = Linux + 122, - modify_ldt = Linux + 123, - adjtimex = Linux + 124, - mprotect = Linux + 125, - sigprocmask = Linux + 126, - create_module = Linux + 127, - init_module = Linux + 128, - delete_module = Linux + 129, - get_kernel_syms = Linux + 130, - quotactl = Linux + 131, - getpgid = Linux + 132, - fchdir = Linux + 133, - bdflush = Linux + 134, - sysfs = Linux + 135, - personality = Linux + 136, - afs_syscall = Linux + 137, - setfsuid = Linux + 138, - setfsgid = Linux + 139, - _llseek = Linux + 140, - getdents = Linux + 141, - _newselect = Linux + 142, - flock = Linux + 143, - msync = Linux + 144, - readv = Linux + 145, - writev = Linux + 146, - cacheflush = Linux + 147, - cachectl = Linux + 148, - sysmips = Linux + 149, - unused150 = Linux + 150, - getsid = Linux + 151, - fdatasync = Linux + 152, - _sysctl = Linux + 153, - mlock = Linux + 154, - munlock = Linux + 155, - mlockall = Linux + 156, - munlockall = Linux + 157, - sched_setparam = Linux + 158, - sched_getparam = Linux + 159, - sched_setscheduler = Linux + 160, - sched_getscheduler = Linux + 161, - sched_yield = Linux + 162, - sched_get_priority_max = Linux + 163, - sched_get_priority_min = Linux + 164, - sched_rr_get_interval = Linux + 165, - nanosleep = Linux + 166, - mremap = Linux + 167, - accept = Linux + 168, - bind = Linux + 169, - connect = Linux + 170, - getpeername = Linux + 171, - getsockname = Linux + 172, - getsockopt = Linux + 173, - listen = Linux + 174, - recv = Linux + 175, - recvfrom = Linux + 176, - recvmsg = Linux + 177, - send = Linux + 178, - sendmsg = Linux + 179, - sendto = Linux + 180, - setsockopt = Linux + 181, - shutdown = Linux + 182, - socket = Linux + 183, - socketpair = Linux + 184, - setresuid = Linux + 185, - getresuid = Linux + 186, - query_module = Linux + 187, - poll = Linux + 188, - nfsservctl = Linux + 189, - setresgid = Linux + 190, - getresgid = Linux + 191, - prctl = Linux + 192, - rt_sigreturn = Linux + 193, - rt_sigaction = Linux + 194, - rt_sigprocmask = Linux + 195, - rt_sigpending = Linux + 196, - rt_sigtimedwait = Linux + 197, - rt_sigqueueinfo = Linux + 198, - rt_sigsuspend = Linux + 199, - pread64 = Linux + 200, - pwrite64 = Linux + 201, - chown = Linux + 202, - getcwd = Linux + 203, - capget = Linux + 204, - capset = Linux + 205, - sigaltstack = Linux + 206, - sendfile = Linux + 207, - getpmsg = Linux + 208, - putpmsg = Linux + 209, - mmap2 = Linux + 210, - truncate64 = Linux + 211, - ftruncate64 = Linux + 212, - stat64 = Linux + 213, - lstat64 = Linux + 214, - fstat64 = Linux + 215, - pivot_root = Linux + 216, - mincore = Linux + 217, - madvise = Linux + 218, - getdents64 = Linux + 219, - fcntl64 = Linux + 220, - reserved221 = Linux + 221, - gettid = Linux + 222, - readahead = Linux + 223, - setxattr = Linux + 224, - lsetxattr = Linux + 225, - fsetxattr = Linux + 226, - getxattr = Linux + 227, - lgetxattr = Linux + 228, - fgetxattr = Linux + 229, - listxattr = Linux + 230, - llistxattr = Linux + 231, - flistxattr = Linux + 232, - removexattr = Linux + 233, - lremovexattr = Linux + 234, - fremovexattr = Linux + 235, - tkill = Linux + 236, - sendfile64 = Linux + 237, - futex = Linux + 238, - sched_setaffinity = Linux + 239, - sched_getaffinity = Linux + 240, - io_setup = Linux + 241, - io_destroy = Linux + 242, - io_getevents = Linux + 243, - io_submit = Linux + 244, - io_cancel = Linux + 245, - exit_group = Linux + 246, - lookup_dcookie = Linux + 247, - epoll_create = Linux + 248, - epoll_ctl = Linux + 249, - epoll_wait = Linux + 250, - remap_file_pages = Linux + 251, - set_tid_address = Linux + 252, - restart_syscall = Linux + 253, - fadvise64 = Linux + 254, - statfs64 = Linux + 255, - fstatfs64 = Linux + 256, - timer_create = Linux + 257, - timer_settime = Linux + 258, - timer_gettime = Linux + 259, - timer_getoverrun = Linux + 260, - timer_delete = Linux + 261, - clock_settime = Linux + 262, - clock_gettime = Linux + 263, - clock_getres = Linux + 264, - clock_nanosleep = Linux + 265, - tgkill = Linux + 266, - utimes = Linux + 267, - mbind = Linux + 268, - get_mempolicy = Linux + 269, - set_mempolicy = Linux + 270, - mq_open = Linux + 271, - mq_unlink = Linux + 272, - mq_timedsend = Linux + 273, - mq_timedreceive = Linux + 274, - mq_notify = Linux + 275, - mq_getsetattr = Linux + 276, - vserver = Linux + 277, - waitid = Linux + 278, - add_key = Linux + 280, - request_key = Linux + 281, - keyctl = Linux + 282, - set_thread_area = Linux + 283, - inotify_init = Linux + 284, - inotify_add_watch = Linux + 285, - inotify_rm_watch = Linux + 286, - migrate_pages = Linux + 287, - openat = Linux + 288, - mkdirat = Linux + 289, - mknodat = Linux + 290, - fchownat = Linux + 291, - futimesat = Linux + 292, - fstatat64 = Linux + 293, - unlinkat = Linux + 294, - renameat = Linux + 295, - linkat = Linux + 296, - symlinkat = Linux + 297, - readlinkat = Linux + 298, - fchmodat = Linux + 299, - faccessat = Linux + 300, - pselect6 = Linux + 301, - ppoll = Linux + 302, - unshare = Linux + 303, - splice = Linux + 304, - sync_file_range = Linux + 305, - tee = Linux + 306, - vmsplice = Linux + 307, - move_pages = Linux + 308, - set_robust_list = Linux + 309, - get_robust_list = Linux + 310, - kexec_load = Linux + 311, - getcpu = Linux + 312, - epoll_pwait = Linux + 313, - ioprio_set = Linux + 314, - ioprio_get = Linux + 315, - utimensat = Linux + 316, - signalfd = Linux + 317, - timerfd = Linux + 318, - eventfd = Linux + 319, - fallocate = Linux + 320, - timerfd_create = Linux + 321, - timerfd_gettime = Linux + 322, - timerfd_settime = Linux + 323, - signalfd4 = Linux + 324, - eventfd2 = Linux + 325, - epoll_create1 = Linux + 326, - dup3 = Linux + 327, - pipe2 = Linux + 328, - inotify_init1 = Linux + 329, - preadv = Linux + 330, - pwritev = Linux + 331, - rt_tgsigqueueinfo = Linux + 332, - perf_event_open = Linux + 333, - accept4 = Linux + 334, - recvmmsg = Linux + 335, - fanotify_init = Linux + 336, - fanotify_mark = Linux + 337, - prlimit64 = Linux + 338, - name_to_handle_at = Linux + 339, - open_by_handle_at = Linux + 340, - clock_adjtime = Linux + 341, - syncfs = Linux + 342, - sendmmsg = Linux + 343, - setns = Linux + 344, - process_vm_readv = Linux + 345, - process_vm_writev = Linux + 346, - kcmp = Linux + 347, - finit_module = Linux + 348, - sched_setattr = Linux + 349, - sched_getattr = Linux + 350, - renameat2 = Linux + 351, - seccomp = Linux + 352, - getrandom = Linux + 353, - memfd_create = Linux + 354, - bpf = Linux + 355, - execveat = Linux + 356, - userfaultfd = Linux + 357, - membarrier = Linux + 358, - mlock2 = Linux + 359, - copy_file_range = Linux + 360, - preadv2 = Linux + 361, - pwritev2 = Linux + 362, - pkey_mprotect = Linux + 363, - pkey_alloc = Linux + 364, - pkey_free = Linux + 365, - statx = Linux + 366, - rseq = Linux + 367, - io_pgetevents = Linux + 368, - semget = Linux + 393, - semctl = Linux + 394, - shmget = Linux + 395, - shmctl = Linux + 396, - shmat = Linux + 397, - shmdt = Linux + 398, - msgget = Linux + 399, - msgsnd = Linux + 400, - msgrcv = Linux + 401, - msgctl = Linux + 402, - clock_gettime64 = Linux + 403, - clock_settime64 = Linux + 404, - clock_adjtime64 = Linux + 405, - clock_getres_time64 = Linux + 406, - clock_nanosleep_time64 = Linux + 407, - timer_gettime64 = Linux + 408, - timer_settime64 = Linux + 409, - timerfd_gettime64 = Linux + 410, - timerfd_settime64 = Linux + 411, - utimensat_time64 = Linux + 412, - pselect6_time64 = Linux + 413, - ppoll_time64 = Linux + 414, - io_pgetevents_time64 = Linux + 416, - recvmmsg_time64 = Linux + 417, - mq_timedsend_time64 = Linux + 418, - mq_timedreceive_time64 = Linux + 419, - semtimedop_time64 = Linux + 420, - rt_sigtimedwait_time64 = Linux + 421, - futex_time64 = Linux + 422, - sched_rr_get_interval_time64 = Linux + 423, - pidfd_send_signal = Linux + 424, - io_uring_setup = Linux + 425, - io_uring_enter = Linux + 426, - io_uring_register = Linux + 427, - open_tree = Linux + 428, - move_mount = Linux + 429, - fsopen = Linux + 430, - fsconfig = Linux + 431, - fsmount = Linux + 432, - fspick = Linux + 433, - pidfd_open = Linux + 434, - clone3 = Linux + 435, - close_range = Linux + 436, - openat2 = Linux + 437, - pidfd_getfd = Linux + 438, - faccessat2 = Linux + 439, - process_madvise = Linux + 440, - epoll_pwait2 = Linux + 441, - mount_setattr = Linux + 442, - landlock_create_ruleset = Linux + 444, - landlock_add_rule = Linux + 445, - landlock_restrict_self = Linux + 446, - - _, -}; - pub const O = struct { pub const CREAT = 0o0400; pub const EXCL = 0o02000; @@ -707,15 +287,35 @@ pub const VDSO = struct { }; pub const Flock = extern struct { - l_type: i16, - l_whence: i16, + type: i16, + whence: i16, __pad0: [4]u8, - l_start: off_t, - l_len: off_t, - l_pid: pid_t, + start: off_t, + len: off_t, + pid: pid_t, __unused: [4]u8, }; +pub const msghdr = extern struct { + name: ?*sockaddr, + namelen: socklen_t, + iov: [*]iovec, + iovlen: i32, + control: ?*anyopaque, + controllen: socklen_t, + flags: i32, +}; + +pub const msghdr_const = extern struct { + name: ?*const sockaddr, + namelen: socklen_t, + iov: [*]const iovec_const, + iovlen: i32, + control: ?*const anyopaque, + controllen: socklen_t, + flags: i32, +}; + pub const blksize_t = i32; pub const nlink_t = u32; pub const time_t = i32; diff --git a/lib/std/os/linux/powerpc.zig b/lib/std/os/linux/powerpc.zig index f5ef42680b..d0601f858b 100644 --- a/lib/std/os/linux/powerpc.zig +++ b/lib/std/os/linux/powerpc.zig @@ -1,9 +1,10 @@ const std = @import("../../std.zig"); const maxInt = std.math.maxInt; const linux = std.os.linux; +const SYS = linux.SYS; const socklen_t = linux.socklen_t; -const iovec = linux.iovec; -const iovec_const = linux.iovec_const; +const iovec = std.os.iovec; +const iovec_const = std.os.iovec_const; const uid_t = linux.uid_t; const gid_t = linux.gid_t; const pid_t = linux.pid_t; @@ -125,8 +126,13 @@ pub fn syscall6( ); } +const CloneFn = switch (@import("builtin").zig_backend) { + .stage1 => fn (arg: usize) callconv(.C) u8, + else => *const fn (arg: usize) callconv(.C) u8, +}; + /// This matches the libc clone function. -pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags: usize, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; +pub extern fn clone(func: CloneFn, stack: usize, flags: usize, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; pub const restore = restore_rt; @@ -138,436 +144,6 @@ pub fn restore_rt() callconv(.Naked) void { ); } -pub const SYS = enum(usize) { - restart_syscall = 0, - exit = 1, - fork = 2, - read = 3, - write = 4, - open = 5, - close = 6, - waitpid = 7, - creat = 8, - link = 9, - unlink = 10, - execve = 11, - chdir = 12, - time = 13, - mknod = 14, - chmod = 15, - lchown = 16, - @"break" = 17, - oldstat = 18, - lseek = 19, - getpid = 20, - mount = 21, - umount = 22, - setuid = 23, - getuid = 24, - stime = 25, - ptrace = 26, - alarm = 27, - oldfstat = 28, - pause = 29, - utime = 30, - stty = 31, - gtty = 32, - access = 33, - nice = 34, - ftime = 35, - sync = 36, - kill = 37, - rename = 38, - mkdir = 39, - rmdir = 40, - dup = 41, - pipe = 42, - times = 43, - prof = 44, - brk = 45, - setgid = 46, - getgid = 47, - signal = 48, - geteuid = 49, - getegid = 50, - acct = 51, - umount2 = 52, - lock = 53, - ioctl = 54, - fcntl = 55, - mpx = 56, - setpgid = 57, - ulimit = 58, - oldolduname = 59, - umask = 60, - chroot = 61, - ustat = 62, - dup2 = 63, - getppid = 64, - getpgrp = 65, - setsid = 66, - sigaction = 67, - sgetmask = 68, - ssetmask = 69, - setreuid = 70, - setregid = 71, - sigsuspend = 72, - sigpending = 73, - sethostname = 74, - setrlimit = 75, - getrlimit = 76, - getrusage = 77, - gettimeofday = 78, - settimeofday = 79, - getgroups = 80, - setgroups = 81, - select = 82, - symlink = 83, - oldlstat = 84, - readlink = 85, - uselib = 86, - swapon = 87, - reboot = 88, - readdir = 89, - mmap = 90, - munmap = 91, - truncate = 92, - ftruncate = 93, - fchmod = 94, - fchown = 95, - getpriority = 96, - setpriority = 97, - profil = 98, - statfs = 99, - fstatfs = 100, - ioperm = 101, - socketcall = 102, - syslog = 103, - setitimer = 104, - getitimer = 105, - stat = 106, - lstat = 107, - fstat = 108, - olduname = 109, - iopl = 110, - vhangup = 111, - idle = 112, - vm86 = 113, - wait4 = 114, - swapoff = 115, - sysinfo = 116, - ipc = 117, - fsync = 118, - sigreturn = 119, - clone = 120, - setdomainname = 121, - uname = 122, - modify_ldt = 123, - adjtimex = 124, - mprotect = 125, - sigprocmask = 126, - create_module = 127, - init_module = 128, - delete_module = 129, - get_kernel_syms = 130, - quotactl = 131, - getpgid = 132, - fchdir = 133, - bdflush = 134, - sysfs = 135, - personality = 136, - afs_syscall = 137, - setfsuid = 138, - setfsgid = 139, - _llseek = 140, - getdents = 141, - _newselect = 142, - flock = 143, - msync = 144, - readv = 145, - writev = 146, - getsid = 147, - fdatasync = 148, - _sysctl = 149, - mlock = 150, - munlock = 151, - mlockall = 152, - munlockall = 153, - sched_setparam = 154, - sched_getparam = 155, - sched_setscheduler = 156, - sched_getscheduler = 157, - sched_yield = 158, - sched_get_priority_max = 159, - sched_get_priority_min = 160, - sched_rr_get_interval = 161, - nanosleep = 162, - mremap = 163, - setresuid = 164, - getresuid = 165, - query_module = 166, - poll = 167, - nfsservctl = 168, - setresgid = 169, - getresgid = 170, - prctl = 171, - rt_sigreturn = 172, - rt_sigaction = 173, - rt_sigprocmask = 174, - rt_sigpending = 175, - rt_sigtimedwait = 176, - rt_sigqueueinfo = 177, - rt_sigsuspend = 178, - pread64 = 179, - pwrite64 = 180, - chown = 181, - getcwd = 182, - capget = 183, - capset = 184, - sigaltstack = 185, - sendfile = 186, - getpmsg = 187, - putpmsg = 188, - vfork = 189, - ugetrlimit = 190, - readahead = 191, - mmap2 = 192, - truncate64 = 193, - ftruncate64 = 194, - stat64 = 195, - lstat64 = 196, - fstat64 = 197, - pciconfig_read = 198, - pciconfig_write = 199, - pciconfig_iobase = 200, - multiplexer = 201, - getdents64 = 202, - pivot_root = 203, - fcntl64 = 204, - madvise = 205, - mincore = 206, - gettid = 207, - tkill = 208, - setxattr = 209, - lsetxattr = 210, - fsetxattr = 211, - getxattr = 212, - lgetxattr = 213, - fgetxattr = 214, - listxattr = 215, - llistxattr = 216, - flistxattr = 217, - removexattr = 218, - lremovexattr = 219, - fremovexattr = 220, - futex = 221, - sched_setaffinity = 222, - sched_getaffinity = 223, - tuxcall = 225, - sendfile64 = 226, - io_setup = 227, - io_destroy = 228, - io_getevents = 229, - io_submit = 230, - io_cancel = 231, - set_tid_address = 232, - fadvise64 = 233, - exit_group = 234, - lookup_dcookie = 235, - epoll_create = 236, - epoll_ctl = 237, - epoll_wait = 238, - remap_file_pages = 239, - timer_create = 240, - timer_settime = 241, - timer_gettime = 242, - timer_getoverrun = 243, - timer_delete = 244, - clock_settime = 245, - clock_gettime = 246, - clock_getres = 247, - clock_nanosleep = 248, - swapcontext = 249, - tgkill = 250, - utimes = 251, - statfs64 = 252, - fstatfs64 = 253, - fadvise64_64 = 254, - rtas = 255, - sys_debug_setcontext = 256, - migrate_pages = 258, - mbind = 259, - get_mempolicy = 260, - set_mempolicy = 261, - mq_open = 262, - mq_unlink = 263, - mq_timedsend = 264, - mq_timedreceive = 265, - mq_notify = 266, - mq_getsetattr = 267, - kexec_load = 268, - add_key = 269, - request_key = 270, - keyctl = 271, - waitid = 272, - ioprio_set = 273, - ioprio_get = 274, - inotify_init = 275, - inotify_add_watch = 276, - inotify_rm_watch = 277, - spu_run = 278, - spu_create = 279, - pselect6 = 280, - ppoll = 281, - unshare = 282, - splice = 283, - tee = 284, - vmsplice = 285, - openat = 286, - mkdirat = 287, - mknodat = 288, - fchownat = 289, - futimesat = 290, - fstatat64 = 291, - unlinkat = 292, - renameat = 293, - linkat = 294, - symlinkat = 295, - readlinkat = 296, - fchmodat = 297, - faccessat = 298, - get_robust_list = 299, - set_robust_list = 300, - move_pages = 301, - getcpu = 302, - epoll_pwait = 303, - utimensat = 304, - signalfd = 305, - timerfd_create = 306, - eventfd = 307, - sync_file_range = 308, - fallocate = 309, - subpage_prot = 310, - timerfd_settime = 311, - timerfd_gettime = 312, - signalfd4 = 313, - eventfd2 = 314, - epoll_create1 = 315, - dup3 = 316, - pipe2 = 317, - inotify_init1 = 318, - perf_event_open = 319, - preadv = 320, - pwritev = 321, - rt_tgsigqueueinfo = 322, - fanotify_init = 323, - fanotify_mark = 324, - prlimit64 = 325, - socket = 326, - bind = 327, - connect = 328, - listen = 329, - accept = 330, - getsockname = 331, - getpeername = 332, - socketpair = 333, - send = 334, - sendto = 335, - recv = 336, - recvfrom = 337, - shutdown = 338, - setsockopt = 339, - getsockopt = 340, - sendmsg = 341, - recvmsg = 342, - recvmmsg = 343, - accept4 = 344, - name_to_handle_at = 345, - open_by_handle_at = 346, - clock_adjtime = 347, - syncfs = 348, - sendmmsg = 349, - setns = 350, - process_vm_readv = 351, - process_vm_writev = 352, - finit_module = 353, - kcmp = 354, - sched_setattr = 355, - sched_getattr = 356, - renameat2 = 357, - seccomp = 358, - getrandom = 359, - memfd_create = 360, - bpf = 361, - execveat = 362, - switch_endian = 363, - userfaultfd = 364, - membarrier = 365, - mlock2 = 378, - copy_file_range = 379, - preadv2 = 380, - pwritev2 = 381, - kexec_file_load = 382, - statx = 383, - pkey_alloc = 384, - pkey_free = 385, - pkey_mprotect = 386, - rseq = 387, - io_pgetevents = 388, - semget = 393, - semctl = 394, - shmget = 395, - shmctl = 396, - shmat = 397, - shmdt = 398, - msgget = 399, - msgsnd = 400, - msgrcv = 401, - msgctl = 402, - clock_gettime64 = 403, - clock_settime64 = 404, - clock_adjtime64 = 405, - clock_getres_time64 = 406, - clock_nanosleep_time64 = 407, - timer_gettime64 = 408, - timer_settime64 = 409, - timerfd_gettime64 = 410, - timerfd_settime64 = 411, - utimensat_time64 = 412, - pselect6_time64 = 413, - ppoll_time64 = 414, - io_pgetevents_time64 = 416, - recvmmsg_time64 = 417, - mq_timedsend_time64 = 418, - mq_timedreceive_time64 = 419, - semtimedop_time64 = 420, - rt_sigtimedwait_time64 = 421, - futex_time64 = 422, - sched_rr_get_interval_time64 = 423, - pidfd_send_signal = 424, - io_uring_setup = 425, - io_uring_enter = 426, - io_uring_register = 427, - open_tree = 428, - move_mount = 429, - fsopen = 430, - fsconfig = 431, - fsmount = 432, - fspick = 433, - pidfd_open = 434, - clone3 = 435, - close_range = 436, - openat2 = 437, - pidfd_getfd = 438, - faccessat2 = 439, - process_madvise = 440, - epoll_pwait2 = 441, - mount_setattr = 442, - landlock_create_ruleset = 444, - landlock_add_rule = 445, - landlock_restrict_self = 446, -}; - pub const O = struct { pub const CREAT = 0o100; pub const EXCL = 0o200; @@ -643,31 +219,31 @@ pub const VDSO = struct { }; pub const Flock = extern struct { - l_type: i16, - l_whence: i16, - l_start: off_t, - l_len: off_t, - l_pid: pid_t, + type: i16, + whence: i16, + start: off_t, + len: off_t, + pid: pid_t, }; pub const msghdr = extern struct { - msg_name: ?*sockaddr, - msg_namelen: socklen_t, - msg_iov: [*]iovec, - msg_iovlen: usize, - msg_control: ?*anyopaque, - msg_controllen: socklen_t, - msg_flags: i32, + name: ?*sockaddr, + namelen: socklen_t, + iov: [*]iovec, + iovlen: usize, + control: ?*anyopaque, + controllen: socklen_t, + flags: i32, }; pub const msghdr_const = extern struct { - msg_name: ?*const sockaddr, - msg_namelen: socklen_t, - msg_iov: [*]iovec_const, - msg_iovlen: usize, - msg_control: ?*anyopaque, - msg_controllen: socklen_t, - msg_flags: i32, + name: ?*const sockaddr, + namelen: socklen_t, + iov: [*]const iovec_const, + iovlen: usize, + control: ?*const anyopaque, + controllen: socklen_t, + flags: i32, }; pub const blksize_t = i32; @@ -740,7 +316,7 @@ pub const mcontext_t = extern struct { pub const ucontext_t = extern struct { flags: u32, - link: *ucontext_t, + link: ?*ucontext_t, stack: stack_t, pad: [7]i32, regs: *mcontext_t, diff --git a/lib/std/os/linux/powerpc64.zig b/lib/std/os/linux/powerpc64.zig index 165ca848c6..329674cd72 100644 --- a/lib/std/os/linux/powerpc64.zig +++ b/lib/std/os/linux/powerpc64.zig @@ -1,9 +1,10 @@ const std = @import("../../std.zig"); const maxInt = std.math.maxInt; const linux = std.os.linux; +const SYS = linux.SYS; const socklen_t = linux.socklen_t; -const iovec = linux.iovec; -const iovec_const = linux.iovec_const; +const iovec = std.os.iovec; +const iovec_const = std.os.iovec_const; const uid_t = linux.uid_t; const gid_t = linux.gid_t; const pid_t = linux.pid_t; @@ -125,8 +126,13 @@ pub fn syscall6( ); } +const CloneFn = switch (@import("builtin").zig_backend) { + .stage1 => fn (arg: usize) callconv(.C) u8, + else => *const fn (arg: usize) callconv(.C) u8, +}; + /// This matches the libc clone function. -pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags: usize, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; +pub extern fn clone(func: CloneFn, stack: usize, flags: usize, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; pub const restore = restore_rt; @@ -138,410 +144,6 @@ pub fn restore_rt() callconv(.Naked) void { ); } -pub const SYS = enum(usize) { - restart_syscall = 0, - exit = 1, - fork = 2, - read = 3, - write = 4, - open = 5, - close = 6, - waitpid = 7, - creat = 8, - link = 9, - unlink = 10, - execve = 11, - chdir = 12, - time = 13, - mknod = 14, - chmod = 15, - lchown = 16, - @"break" = 17, - oldstat = 18, - lseek = 19, - getpid = 20, - mount = 21, - umount = 22, - setuid = 23, - getuid = 24, - stime = 25, - ptrace = 26, - alarm = 27, - oldfstat = 28, - pause = 29, - utime = 30, - stty = 31, - gtty = 32, - access = 33, - nice = 34, - ftime = 35, - sync = 36, - kill = 37, - rename = 38, - mkdir = 39, - rmdir = 40, - dup = 41, - pipe = 42, - times = 43, - prof = 44, - brk = 45, - setgid = 46, - getgid = 47, - signal = 48, - geteuid = 49, - getegid = 50, - acct = 51, - umount2 = 52, - lock = 53, - ioctl = 54, - fcntl = 55, - mpx = 56, - setpgid = 57, - ulimit = 58, - oldolduname = 59, - umask = 60, - chroot = 61, - ustat = 62, - dup2 = 63, - getppid = 64, - getpgrp = 65, - setsid = 66, - sigaction = 67, - sgetmask = 68, - ssetmask = 69, - setreuid = 70, - setregid = 71, - sigsuspend = 72, - sigpending = 73, - sethostname = 74, - setrlimit = 75, - getrlimit = 76, - getrusage = 77, - gettimeofday = 78, - settimeofday = 79, - getgroups = 80, - setgroups = 81, - select = 82, - symlink = 83, - oldlstat = 84, - readlink = 85, - uselib = 86, - swapon = 87, - reboot = 88, - readdir = 89, - mmap = 90, - munmap = 91, - truncate = 92, - ftruncate = 93, - fchmod = 94, - fchown = 95, - getpriority = 96, - setpriority = 97, - profil = 98, - statfs = 99, - fstatfs = 100, - ioperm = 101, - socketcall = 102, - syslog = 103, - setitimer = 104, - getitimer = 105, - stat = 106, - lstat = 107, - fstat = 108, - olduname = 109, - iopl = 110, - vhangup = 111, - idle = 112, - vm86 = 113, - wait4 = 114, - swapoff = 115, - sysinfo = 116, - ipc = 117, - fsync = 118, - sigreturn = 119, - clone = 120, - setdomainname = 121, - uname = 122, - modify_ldt = 123, - adjtimex = 124, - mprotect = 125, - sigprocmask = 126, - create_module = 127, - init_module = 128, - delete_module = 129, - get_kernel_syms = 130, - quotactl = 131, - getpgid = 132, - fchdir = 133, - bdflush = 134, - sysfs = 135, - personality = 136, - afs_syscall = 137, - setfsuid = 138, - setfsgid = 139, - _llseek = 140, - getdents = 141, - _newselect = 142, - flock = 143, - msync = 144, - readv = 145, - writev = 146, - getsid = 147, - fdatasync = 148, - _sysctl = 149, - mlock = 150, - munlock = 151, - mlockall = 152, - munlockall = 153, - sched_setparam = 154, - sched_getparam = 155, - sched_setscheduler = 156, - sched_getscheduler = 157, - sched_yield = 158, - sched_get_priority_max = 159, - sched_get_priority_min = 160, - sched_rr_get_interval = 161, - nanosleep = 162, - mremap = 163, - setresuid = 164, - getresuid = 165, - query_module = 166, - poll = 167, - nfsservctl = 168, - setresgid = 169, - getresgid = 170, - prctl = 171, - rt_sigreturn = 172, - rt_sigaction = 173, - rt_sigprocmask = 174, - rt_sigpending = 175, - rt_sigtimedwait = 176, - rt_sigqueueinfo = 177, - rt_sigsuspend = 178, - pread64 = 179, - pwrite64 = 180, - chown = 181, - getcwd = 182, - capget = 183, - capset = 184, - sigaltstack = 185, - sendfile = 186, - getpmsg = 187, - putpmsg = 188, - vfork = 189, - ugetrlimit = 190, - readahead = 191, - pciconfig_read = 198, - pciconfig_write = 199, - pciconfig_iobase = 200, - multiplexer = 201, - getdents64 = 202, - pivot_root = 203, - madvise = 205, - mincore = 206, - gettid = 207, - tkill = 208, - setxattr = 209, - lsetxattr = 210, - fsetxattr = 211, - getxattr = 212, - lgetxattr = 213, - fgetxattr = 214, - listxattr = 215, - llistxattr = 216, - flistxattr = 217, - removexattr = 218, - lremovexattr = 219, - fremovexattr = 220, - futex = 221, - sched_setaffinity = 222, - sched_getaffinity = 223, - tuxcall = 225, - io_setup = 227, - io_destroy = 228, - io_getevents = 229, - io_submit = 230, - io_cancel = 231, - set_tid_address = 232, - fadvise64 = 233, - exit_group = 234, - lookup_dcookie = 235, - epoll_create = 236, - epoll_ctl = 237, - epoll_wait = 238, - remap_file_pages = 239, - timer_create = 240, - timer_settime = 241, - timer_gettime = 242, - timer_getoverrun = 243, - timer_delete = 244, - clock_settime = 245, - clock_gettime = 246, - clock_getres = 247, - clock_nanosleep = 248, - swapcontext = 249, - tgkill = 250, - utimes = 251, - statfs64 = 252, - fstatfs64 = 253, - rtas = 255, - sys_debug_setcontext = 256, - migrate_pages = 258, - mbind = 259, - get_mempolicy = 260, - set_mempolicy = 261, - mq_open = 262, - mq_unlink = 263, - mq_timedsend = 264, - mq_timedreceive = 265, - mq_notify = 266, - mq_getsetattr = 267, - kexec_load = 268, - add_key = 269, - request_key = 270, - keyctl = 271, - waitid = 272, - ioprio_set = 273, - ioprio_get = 274, - inotify_init = 275, - inotify_add_watch = 276, - inotify_rm_watch = 277, - spu_run = 278, - spu_create = 279, - pselect6 = 280, - ppoll = 281, - unshare = 282, - splice = 283, - tee = 284, - vmsplice = 285, - openat = 286, - mkdirat = 287, - mknodat = 288, - fchownat = 289, - futimesat = 290, - fstatat = 291, - unlinkat = 292, - renameat = 293, - linkat = 294, - symlinkat = 295, - readlinkat = 296, - fchmodat = 297, - faccessat = 298, - get_robust_list = 299, - set_robust_list = 300, - move_pages = 301, - getcpu = 302, - epoll_pwait = 303, - utimensat = 304, - signalfd = 305, - timerfd_create = 306, - eventfd = 307, - sync_file_range = 308, - fallocate = 309, - subpage_prot = 310, - timerfd_settime = 311, - timerfd_gettime = 312, - signalfd4 = 313, - eventfd2 = 314, - epoll_create1 = 315, - dup3 = 316, - pipe2 = 317, - inotify_init1 = 318, - perf_event_open = 319, - preadv = 320, - pwritev = 321, - rt_tgsigqueueinfo = 322, - fanotify_init = 323, - fanotify_mark = 324, - prlimit64 = 325, - socket = 326, - bind = 327, - connect = 328, - listen = 329, - accept = 330, - getsockname = 331, - getpeername = 332, - socketpair = 333, - send = 334, - sendto = 335, - recv = 336, - recvfrom = 337, - shutdown = 338, - setsockopt = 339, - getsockopt = 340, - sendmsg = 341, - recvmsg = 342, - recvmmsg = 343, - accept4 = 344, - name_to_handle_at = 345, - open_by_handle_at = 346, - clock_adjtime = 347, - syncfs = 348, - sendmmsg = 349, - setns = 350, - process_vm_readv = 351, - process_vm_writev = 352, - finit_module = 353, - kcmp = 354, - sched_setattr = 355, - sched_getattr = 356, - renameat2 = 357, - seccomp = 358, - getrandom = 359, - memfd_create = 360, - bpf = 361, - execveat = 362, - switch_endian = 363, - userfaultfd = 364, - membarrier = 365, - mlock2 = 378, - copy_file_range = 379, - preadv2 = 380, - pwritev2 = 381, - kexec_file_load = 382, - statx = 383, - pkey_alloc = 384, - pkey_free = 385, - pkey_mprotect = 386, - rseq = 387, - io_pgetevents = 388, - semtimedop = 392, - semget = 393, - semctl = 394, - shmget = 395, - shmctl = 396, - shmat = 397, - shmdt = 398, - msgget = 399, - msgsnd = 400, - msgrcv = 401, - msgctl = 402, - pidfd_send_signal = 424, - io_uring_setup = 425, - io_uring_enter = 426, - io_uring_register = 427, - open_tree = 428, - move_mount = 429, - fsopen = 430, - fsconfig = 431, - fsmount = 432, - fspick = 433, - pidfd_open = 434, - clone3 = 435, - close_range = 436, - openat2 = 437, - pidfd_getfd = 438, - faccessat2 = 439, - process_madvise = 440, - epoll_pwait2 = 441, - mount_setattr = 442, - landlock_create_ruleset = 444, - landlock_add_rule = 445, - landlock_restrict_self = 446, - - _, -}; - pub const O = struct { pub const CREAT = 0o100; pub const EXCL = 0o200; @@ -617,32 +219,32 @@ pub const VDSO = struct { }; pub const Flock = extern struct { - l_type: i16, - l_whence: i16, - l_start: off_t, - l_len: off_t, - l_pid: pid_t, + type: i16, + whence: i16, + start: off_t, + len: off_t, + pid: pid_t, __unused: [4]u8, }; pub const msghdr = extern struct { - msg_name: ?*sockaddr, - msg_namelen: socklen_t, - msg_iov: [*]iovec, - msg_iovlen: usize, - msg_control: ?*anyopaque, - msg_controllen: usize, - msg_flags: i32, + name: ?*sockaddr, + namelen: socklen_t, + iov: [*]iovec, + iovlen: usize, + control: ?*anyopaque, + controllen: usize, + flags: i32, }; pub const msghdr_const = extern struct { - msg_name: ?*const sockaddr, - msg_namelen: socklen_t, - msg_iov: [*]iovec_const, - msg_iovlen: usize, - msg_control: ?*anyopaque, - msg_controllen: usize, - msg_flags: i32, + name: ?*const sockaddr, + namelen: socklen_t, + iov: [*]const iovec_const, + iovlen: usize, + control: ?*const anyopaque, + controllen: usize, + flags: i32, }; pub const blksize_t = i64; @@ -727,7 +329,7 @@ pub const mcontext_t = extern struct { pub const ucontext_t = extern struct { flags: u32, - link: *ucontext_t, + link: ?*ucontext_t, stack: stack_t, sigmask: sigset_t, mcontext: mcontext_t, diff --git a/lib/std/os/linux/riscv64.zig b/lib/std/os/linux/riscv64.zig index 75505442c0..dbf22e0aa4 100644 --- a/lib/std/os/linux/riscv64.zig +++ b/lib/std/os/linux/riscv64.zig @@ -1,7 +1,13 @@ const std = @import("../../std.zig"); +const iovec = std.os.iovec; +const iovec_const = std.os.iovec_const; +const linux = std.os.linux; +const SYS = linux.SYS; const uid_t = std.os.linux.uid_t; const gid_t = std.os.linux.gid_t; const pid_t = std.os.linux.pid_t; +const sockaddr = linux.sockaddr; +const socklen_t = linux.socklen_t; const timespec = std.os.linux.timespec; pub fn syscall0(number: SYS) usize { @@ -89,7 +95,12 @@ pub fn syscall6( ); } -pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags: u32, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; +const CloneFn = switch (@import("builtin").zig_backend) { + .stage1 => fn (arg: usize) callconv(.C) u8, + else => *const fn (arg: usize) callconv(.C) u8, +}; + +pub extern fn clone(func: CloneFn, stack: usize, flags: u32, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; pub const restore = restore_rt; @@ -101,316 +112,6 @@ pub fn restore_rt() callconv(.Naked) void { ); } -pub const SYS = enum(usize) { - pub const arch_specific_syscall = 244; - - io_setup = 0, - io_destroy = 1, - io_submit = 2, - io_cancel = 3, - io_getevents = 4, - setxattr = 5, - lsetxattr = 6, - fsetxattr = 7, - getxattr = 8, - lgetxattr = 9, - fgetxattr = 10, - listxattr = 11, - llistxattr = 12, - flistxattr = 13, - removexattr = 14, - lremovexattr = 15, - fremovexattr = 16, - getcwd = 17, - lookup_dcookie = 18, - eventfd2 = 19, - epoll_create1 = 20, - epoll_ctl = 21, - epoll_pwait = 22, - dup = 23, - dup3 = 24, - fcntl = 25, - inotify_init1 = 26, - inotify_add_watch = 27, - inotify_rm_watch = 28, - ioctl = 29, - ioprio_set = 30, - ioprio_get = 31, - flock = 32, - mknodat = 33, - mkdirat = 34, - unlinkat = 35, - symlinkat = 36, - linkat = 37, - umount2 = 39, - mount = 40, - pivot_root = 41, - nfsservctl = 42, - statfs = 43, - fstatfs = 44, - truncate = 45, - ftruncate = 46, - fallocate = 47, - faccessat = 48, - chdir = 49, - fchdir = 50, - chroot = 51, - fchmod = 52, - fchmodat = 53, - fchownat = 54, - fchown = 55, - openat = 56, - close = 57, - vhangup = 58, - pipe2 = 59, - quotactl = 60, - getdents64 = 61, - lseek = 62, - read = 63, - write = 64, - readv = 65, - writev = 66, - pread64 = 67, - pwrite64 = 68, - preadv = 69, - pwritev = 70, - sendfile = 71, - pselect6 = 72, - ppoll = 73, - signalfd4 = 74, - vmsplice = 75, - splice = 76, - tee = 77, - readlinkat = 78, - fstatat = 79, - fstat = 80, - sync = 81, - fsync = 82, - fdatasync = 83, - sync_file_range = 84, - timerfd_create = 85, - timerfd_settime = 86, - timerfd_gettime = 87, - utimensat = 88, - acct = 89, - capget = 90, - capset = 91, - personality = 92, - exit = 93, - exit_group = 94, - waitid = 95, - set_tid_address = 96, - unshare = 97, - futex = 98, - set_robust_list = 99, - get_robust_list = 100, - nanosleep = 101, - getitimer = 102, - setitimer = 103, - kexec_load = 104, - init_module = 105, - delete_module = 106, - timer_create = 107, - timer_gettime = 108, - timer_getoverrun = 109, - timer_settime = 110, - timer_delete = 111, - clock_settime = 112, - clock_gettime = 113, - clock_getres = 114, - clock_nanosleep = 115, - syslog = 116, - ptrace = 117, - sched_setparam = 118, - sched_setscheduler = 119, - sched_getscheduler = 120, - sched_getparam = 121, - sched_setaffinity = 122, - sched_getaffinity = 123, - sched_yield = 124, - sched_get_priority_max = 125, - sched_get_priority_min = 126, - sched_rr_get_interval = 127, - restart_syscall = 128, - kill = 129, - tkill = 130, - tgkill = 131, - sigaltstack = 132, - rt_sigsuspend = 133, - rt_sigaction = 134, - rt_sigprocmask = 135, - rt_sigpending = 136, - rt_sigtimedwait = 137, - rt_sigqueueinfo = 138, - rt_sigreturn = 139, - setpriority = 140, - getpriority = 141, - reboot = 142, - setregid = 143, - setgid = 144, - setreuid = 145, - setuid = 146, - setresuid = 147, - getresuid = 148, - setresgid = 149, - getresgid = 150, - setfsuid = 151, - setfsgid = 152, - times = 153, - setpgid = 154, - getpgid = 155, - getsid = 156, - setsid = 157, - getgroups = 158, - setgroups = 159, - uname = 160, - sethostname = 161, - setdomainname = 162, - getrlimit = 163, - setrlimit = 164, - getrusage = 165, - umask = 166, - prctl = 167, - getcpu = 168, - gettimeofday = 169, - settimeofday = 170, - adjtimex = 171, - getpid = 172, - getppid = 173, - getuid = 174, - geteuid = 175, - getgid = 176, - getegid = 177, - gettid = 178, - sysinfo = 179, - mq_open = 180, - mq_unlink = 181, - mq_timedsend = 182, - mq_timedreceive = 183, - mq_notify = 184, - mq_getsetattr = 185, - msgget = 186, - msgctl = 187, - msgrcv = 188, - msgsnd = 189, - semget = 190, - semctl = 191, - semtimedop = 192, - semop = 193, - shmget = 194, - shmctl = 195, - shmat = 196, - shmdt = 197, - socket = 198, - socketpair = 199, - bind = 200, - listen = 201, - accept = 202, - connect = 203, - getsockname = 204, - getpeername = 205, - sendto = 206, - recvfrom = 207, - setsockopt = 208, - getsockopt = 209, - shutdown = 210, - sendmsg = 211, - recvmsg = 212, - readahead = 213, - brk = 214, - munmap = 215, - mremap = 216, - add_key = 217, - request_key = 218, - keyctl = 219, - clone = 220, - execve = 221, - mmap = 222, - fadvise64 = 223, - swapon = 224, - swapoff = 225, - mprotect = 226, - msync = 227, - mlock = 228, - munlock = 229, - mlockall = 230, - munlockall = 231, - mincore = 232, - madvise = 233, - remap_file_pages = 234, - mbind = 235, - get_mempolicy = 236, - set_mempolicy = 237, - migrate_pages = 238, - move_pages = 239, - rt_tgsigqueueinfo = 240, - perf_event_open = 241, - accept4 = 242, - recvmmsg = 243, - - riscv_flush_icache = arch_specific_syscall + 15, - - wait4 = 260, - prlimit64 = 261, - fanotify_init = 262, - fanotify_mark = 263, - name_to_handle_at = 264, - open_by_handle_at = 265, - clock_adjtime = 266, - syncfs = 267, - setns = 268, - sendmmsg = 269, - process_vm_readv = 270, - process_vm_writev = 271, - kcmp = 272, - finit_module = 273, - sched_setattr = 274, - sched_getattr = 275, - renameat2 = 276, - seccomp = 277, - getrandom = 278, - memfd_create = 279, - bpf = 280, - execveat = 281, - userfaultfd = 282, - membarrier = 283, - mlock2 = 284, - copy_file_range = 285, - preadv2 = 286, - pwritev2 = 287, - pkey_mprotect = 288, - pkey_alloc = 289, - pkey_free = 290, - statx = 291, - io_pgetevents = 292, - rseq = 293, - kexec_file_load = 294, - pidfd_send_signal = 424, - io_uring_setup = 425, - io_uring_enter = 426, - io_uring_register = 427, - open_tree = 428, - move_mount = 429, - fsopen = 430, - fsconfig = 431, - fsmount = 432, - fspick = 433, - pidfd_open = 434, - clone3 = 435, - close_range = 436, - openat2 = 437, - pidfd_getfd = 438, - faccessat2 = 439, - process_madvise = 440, - epoll_pwait2 = 441, - mount_setattr = 442, - landlock_create_ruleset = 444, - landlock_add_rule = 445, - landlock_restrict_self = 446, - - _, -}; - pub const O = struct { pub const CREAT = 0o100; pub const EXCL = 0o200; @@ -480,14 +181,38 @@ pub const timeval = extern struct { }; pub const Flock = extern struct { - l_type: i16, - l_whence: i16, - l_start: off_t, - l_len: off_t, - l_pid: pid_t, + type: i16, + whence: i16, + start: off_t, + len: off_t, + pid: pid_t, __unused: [4]u8, }; +pub const msghdr = extern struct { + name: ?*sockaddr, + namelen: socklen_t, + iov: [*]iovec, + iovlen: i32, + __pad1: i32 = 0, + control: ?*anyopaque, + controllen: socklen_t, + __pad2: socklen_t = 0, + flags: i32, +}; + +pub const msghdr_const = extern struct { + name: ?*const sockaddr, + namelen: socklen_t, + iov: [*]const iovec_const, + iovlen: i32, + __pad1: i32 = 0, + control: ?*const anyopaque, + controllen: socklen_t, + __pad2: socklen_t = 0, + flags: i32, +}; + // The `stat` definition used by the Linux kernel. pub const Stat = extern struct { dev: dev_t, diff --git a/lib/std/os/linux/seccomp.zig b/lib/std/os/linux/seccomp.zig new file mode 100644 index 0000000000..fd002e7416 --- /dev/null +++ b/lib/std/os/linux/seccomp.zig @@ -0,0 +1,212 @@ +//! API bits for the Secure Computing facility in the Linux kernel, which allows +//! processes to restrict access to the system call API. +//! +//! Seccomp started life with a single "strict" mode, which only allowed calls +//! to read(2), write(2), _exit(2) and sigreturn(2). It turns out that this +//! isn't that useful for general-purpose applications, and so a mode that +//! utilizes user-supplied filters mode was added. +//! +//! Seccomp filters are classic BPF programs, which means that all the +//! information under `std.x.net.bpf` applies here as well. Conceptually, a +//! seccomp program is attached to the kernel and is executed on each syscall. +//! The "packet" being validated is the `data` structure, and the verdict is an +//! action that the kernel performs on the calling process. The actions are +//! variations on a "pass" or "fail" result, where a pass allows the syscall to +//! continue and a fail blocks the syscall and returns some sort of error value. +//! See the full list of actions under ::RET for more information. Finally, only +//! word-sized, absolute loads (`ld [k]`) are supported to read from the `data` +//! structure. +//! +//! There are some issues with the filter API that have traditionally made +//! writing them a pain: +//! +//! 1. Each CPU architecture supported by Linux has its own unique ABI and +//! syscall API. It is not guaranteed that the syscall numbers and arguments +//! are the same across architectures, or that they're even implemted. Thus, +//! filters cannot be assumed to be portable without consulting documentation +//! like syscalls(2) and testing on target hardware. This also requires +//! checking the value of `data.arch` to make sure that a filter was compiled +//! for the correct architecture. +//! 2. Many syscalls take an `unsigned long` or `size_t` argument, the size of +//! which is dependant on the ABI. Since BPF programs execute in a 32-bit +//! machine, validation of 64-bit arguments necessitates two load-and-compare +//! instructions for the upper and lower words. +//! 3. A further wrinkle to the above is endianess. Unlike network packets, +//! syscall data shares the endianess of the target machine. A filter +//! compiled on a little-endian machine will not work on a big-endian one, +//! and vice-versa. For example: Checking the upper 32-bits of `data.arg1` +//! requires a load at `@offsetOf(data, "arg1") + 4` on big-endian systems +//! and `@offsetOf(data, "arg1")` on little-endian systems. Endian-portable +//! filters require adjusting these offsets at compile time, similar to how +//! e.g. OpenSSH does[1]. +//! 4. Syscalls with userspace implementations via the vDSO cannot be traced or +//! filtered. The vDSO can be disabled or just ignored, which must be taken +//! into account when writing filters. +//! 5. Software libraries - especially dynamically loaded ones - tend to use +//! more of the syscall API over time, thus filters must evolve with them. +//! Static filters can result in reduced or even broken functionality when +//! calling newer code from these libraries. This is known to happen with +//! critical libraries like glibc[2]. +//! +//! Some of these issues can be mitigated with help from Zig and the standard +//! library. Since the target CPU is known at compile time, the proper syscall +//! numbers are mixed into the `os` namespace under `std.os.SYS (see the code +//! for `arch_bits` in `os/linux.zig`). Referencing an unimplemented syscall +//! would be a compile error. Endian offsets can also be defined in a similar +//! manner to the OpenSSH example: +//! +//! ```zig +//! const offset = if (native_endian == .Little) struct { +//! pub const low = 0; +//! pub const high = @sizeOf(u32); +//! } else struct { +//! pub const low = @sizeOf(u32); +//! pub const high = 0; +//! }; +//! ``` +//! +//! Unfortunately, there is no easy solution for issue 5. The most reliable +//! strategy is to keep testing; test newer Zig versions, different libcs, +//! different distros, and design your filter to accomidate all of them. +//! Alternatively, you could inject a filter at runtime. Since filters are +//! preserved across execve(2), a filter could be setup before executing your +//! program, without your program having any knowledge of this happening. This +//! is the method used by systemd[3] and Cloudflare's sandbox library[4]. +//! +//! [1]: https://github.com/openssh/openssh-portable/blob/master/sandbox-seccomp-filter.c#L81 +//! [2]: https://sourceware.org/legacy-ml/libc-alpha/2017-11/msg00246.html +//! [3]: https://www.freedesktop.org/software/systemd/man/systemd.exec.html#SystemCallFilter= +//! [4]: https://github.com/cloudflare/sandbox +//! +//! See Also +//! - seccomp(2), seccomp_unotify(2) +//! - https://www.kernel.org/doc/html/latest/userspace-api/seccomp_filter.html +const IOCTL = @import("ioctl.zig"); + +// Modes for the prctl(2) form `prctl(PR_SET_SECCOMP, mode)` +pub const MODE = struct { + /// Seccomp not in use. + pub const DISABLED = 0; + /// Uses a hard-coded filter. + pub const STRICT = 1; + /// Uses a user-supplied filter. + pub const FILTER = 2; +}; + +// Operations for the seccomp(2) form `seccomp(operation, flags, args)` +pub const SET_MODE_STRICT = 0; +pub const SET_MODE_FILTER = 1; +pub const GET_ACTION_AVAIL = 2; +pub const GET_NOTIF_SIZES = 3; + +/// Bitflags for the SET_MODE_FILTER operation. +pub const FILTER_FLAG = struct { + pub const TSYNC = 1 << 0; + pub const LOG = 1 << 1; + pub const SPEC_ALLOW = 1 << 2; + pub const NEW_LISTENER = 1 << 3; + pub const TSYNC_ESRCH = 1 << 4; +}; + +/// Action values for seccomp BPF programs. +/// The lower 16-bits are for optional return data. +/// The upper 16-bits are ordered from least permissive values to most. +pub const RET = struct { + /// Kill the process. + pub const KILL_PROCESS = 0x80000000; + /// Kill the thread. + pub const KILL_THREAD = 0x00000000; + pub const KILL = KILL_THREAD; + /// Disallow and force a SIGSYS. + pub const TRAP = 0x00030000; + /// Return an errno. + pub const ERRNO = 0x00050000; + /// Forward the syscall to a userspace supervisor to make a decision. + pub const USER_NOTIF = 0x7fc00000; + /// Pass to a tracer or disallow. + pub const TRACE = 0x7ff00000; + /// Allow after logging. + pub const LOG = 0x7ffc0000; + /// Allow. + pub const ALLOW = 0x7fff0000; + + // Masks for the return value sections. + pub const ACTION_FULL = 0xffff0000; + pub const ACTION = 0x7fff0000; + pub const DATA = 0x0000ffff; +}; + +pub const IOCTL_NOTIF = struct { + pub const RECV = IOCTL.IOWR('!', 0, notif); + pub const SEND = IOCTL.IOWR('!', 1, notif_resp); + pub const ID_VALID = IOCTL.IOW('!', 2, u64); + pub const ADDFD = IOCTL.IOW('!', 3, notif_addfd); +}; + +/// Tells the kernel that the supervisor allows the syscall to continue. +pub const USER_NOTIF_FLAG_CONTINUE = 1 << 0; + +/// See seccomp_unotify(2). +pub const ADDFD_FLAG = struct { + pub const SETFD = 1 << 0; + pub const SEND = 1 << 1; +}; + +pub const data = extern struct { + /// The system call number. + nr: c_int, + /// The CPU architecture/system call convention. + /// One of the values defined in `std.os.linux.AUDIT`. + arch: u32, + instruction_pointer: u64, + arg0: u64, + arg1: u64, + arg2: u64, + arg3: u64, + arg4: u64, + arg5: u64, +}; + +/// Used with the ::GET_NOTIF_SIZES command to check if the kernel structures +/// have changed. +pub const notif_sizes = extern struct { + /// Size of ::notif. + notif: u16, + /// Size of ::resp. + notif_resp: u16, + /// Size of ::data. + data: u16, +}; + +pub const notif = extern struct { + /// Unique notification cookie for each filter. + id: u64, + /// ID of the thread that triggered the notification. + pid: u32, + /// Bitmask for event information. Currently set to zero. + flags: u32, + /// The current system call data. + data: data, +}; + +/// The decision payload the supervisor process sends to the kernel. +pub const notif_resp = extern struct { + /// The filter cookie. + id: u64, + /// The return value for a spoofed syscall. + val: i64, + /// Set to zero for a spoofed success or a negative error number for a + /// failure. + @"error": i32, + /// Bitmask containing the decision. Either USER_NOTIF_FLAG_CONTINUE to + /// allow the syscall or zero to spoof the return values. + flags: u32, +}; + +pub const notif_addfd = extern struct { + id: u64, + flags: u32, + srcfd: u32, + newfd: u32, + newfd_flags: u32, +}; diff --git a/lib/std/os/linux/sparc64.zig b/lib/std/os/linux/sparc64.zig index 3ec9a67210..6e1792ae0a 100644 --- a/lib/std/os/linux/sparc64.zig +++ b/lib/std/os/linux/sparc64.zig @@ -7,10 +7,11 @@ const stack_t = linux.stack_t; const sigset_t = linux.sigset_t; const linux = std.os.linux; +const SYS = linux.SYS; const sockaddr = linux.sockaddr; const socklen_t = linux.socklen_t; -const iovec = linux.iovec; -const iovec_const = linux.iovec_const; +const iovec = std.os.iovec; +const iovec_const = std.os.iovec_const; const timespec = linux.timespec; pub fn syscall_pipe(fd: *[2]i32) usize { @@ -177,8 +178,13 @@ pub fn syscall6( ); } +const CloneFn = switch (@import("builtin").zig_backend) { + .stage1 => fn (arg: usize) callconv(.C) u8, + else => *const fn (arg: usize) callconv(.C) u8, +}; + /// This matches the libc clone function. -pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags: usize, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; +pub extern fn clone(func: CloneFn, stack: usize, flags: usize, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; pub const restore = restore_rt; @@ -192,390 +198,6 @@ pub fn restore_rt() callconv(.C) void { ); } -pub const SYS = enum(usize) { - restart_syscall = 0, - exit = 1, - fork = 2, - read = 3, - write = 4, - open = 5, - close = 6, - wait4 = 7, - creat = 8, - link = 9, - unlink = 10, - execv = 11, - chdir = 12, - chown = 13, - mknod = 14, - chmod = 15, - lchown = 16, - brk = 17, - perfctr = 18, - lseek = 19, - getpid = 20, - capget = 21, - capset = 22, - setuid = 23, - getuid = 24, - vmsplice = 25, - ptrace = 26, - alarm = 27, - sigaltstack = 28, - pause = 29, - utime = 30, - access = 33, - nice = 34, - sync = 36, - kill = 37, - stat = 38, - sendfile = 39, - lstat = 40, - dup = 41, - pipe = 42, - times = 43, - umount2 = 45, - setgid = 46, - getgid = 47, - signal = 48, - geteuid = 49, - getegid = 50, - acct = 51, - memory_ordering = 52, - ioctl = 54, - reboot = 55, - symlink = 57, - readlink = 58, - execve = 59, - umask = 60, - chroot = 61, - fstat = 62, - fstat64 = 63, - getpagesize = 64, - msync = 65, - vfork = 66, - pread64 = 67, - pwrite64 = 68, - mmap = 71, - munmap = 73, - mprotect = 74, - madvise = 75, - vhangup = 76, - mincore = 78, - getgroups = 79, - setgroups = 80, - getpgrp = 81, - setitimer = 83, - swapon = 85, - getitimer = 86, - sethostname = 88, - dup2 = 90, - fcntl = 92, - select = 93, - fsync = 95, - setpriority = 96, - socket = 97, - connect = 98, - accept = 99, - getpriority = 100, - rt_sigreturn = 101, - rt_sigaction = 102, - rt_sigprocmask = 103, - rt_sigpending = 104, - rt_sigtimedwait = 105, - rt_sigqueueinfo = 106, - rt_sigsuspend = 107, - setresuid = 108, - getresuid = 109, - setresgid = 110, - getresgid = 111, - recvmsg = 113, - sendmsg = 114, - gettimeofday = 116, - getrusage = 117, - getsockopt = 118, - getcwd = 119, - readv = 120, - writev = 121, - settimeofday = 122, - fchown = 123, - fchmod = 124, - recvfrom = 125, - setreuid = 126, - setregid = 127, - rename = 128, - truncate = 129, - ftruncate = 130, - flock = 131, - lstat64 = 132, - sendto = 133, - shutdown = 134, - socketpair = 135, - mkdir = 136, - rmdir = 137, - utimes = 138, - stat64 = 139, - sendfile64 = 140, - getpeername = 141, - futex = 142, - gettid = 143, - getrlimit = 144, - setrlimit = 145, - pivot_root = 146, - prctl = 147, - pciconfig_read = 148, - pciconfig_write = 149, - getsockname = 150, - inotify_init = 151, - inotify_add_watch = 152, - poll = 153, - getdents64 = 154, - inotify_rm_watch = 156, - statfs = 157, - fstatfs = 158, - umount = 159, - sched_set_affinity = 160, - sched_get_affinity = 161, - getdomainname = 162, - setdomainname = 163, - utrap_install = 164, - quotactl = 165, - set_tid_address = 166, - mount = 167, - ustat = 168, - setxattr = 169, - lsetxattr = 170, - fsetxattr = 171, - getxattr = 172, - lgetxattr = 173, - getdents = 174, - setsid = 175, - fchdir = 176, - fgetxattr = 177, - listxattr = 178, - llistxattr = 179, - flistxattr = 180, - removexattr = 181, - lremovexattr = 182, - sigpending = 183, - query_module = 184, - setpgid = 185, - fremovexattr = 186, - tkill = 187, - exit_group = 188, - uname = 189, - init_module = 190, - personality = 191, - remap_file_pages = 192, - epoll_create = 193, - epoll_ctl = 194, - epoll_wait = 195, - ioprio_set = 196, - getppid = 197, - sigaction = 198, - sgetmask = 199, - ssetmask = 200, - sigsuspend = 201, - oldlstat = 202, - uselib = 203, - readdir = 204, - readahead = 205, - socketcall = 206, - syslog = 207, - lookup_dcookie = 208, - fadvise64 = 209, - fadvise64_64 = 210, - tgkill = 211, - waitpid = 212, - swapoff = 213, - sysinfo = 214, - ipc = 215, - sigreturn = 216, - clone = 217, - ioprio_get = 218, - adjtimex = 219, - sigprocmask = 220, - create_module = 221, - delete_module = 222, - get_kernel_syms = 223, - getpgid = 224, - bdflush = 225, - sysfs = 226, - afs_syscall = 227, - setfsuid = 228, - setfsgid = 229, - _newselect = 230, - splice = 232, - stime = 233, - statfs64 = 234, - fstatfs64 = 235, - _llseek = 236, - mlock = 237, - munlock = 238, - mlockall = 239, - munlockall = 240, - sched_setparam = 241, - sched_getparam = 242, - sched_setscheduler = 243, - sched_getscheduler = 244, - sched_yield = 245, - sched_get_priority_max = 246, - sched_get_priority_min = 247, - sched_rr_get_interval = 248, - nanosleep = 249, - mremap = 250, - _sysctl = 251, - getsid = 252, - fdatasync = 253, - nfsservctl = 254, - sync_file_range = 255, - clock_settime = 256, - clock_gettime = 257, - clock_getres = 258, - clock_nanosleep = 259, - sched_getaffinity = 260, - sched_setaffinity = 261, - timer_settime = 262, - timer_gettime = 263, - timer_getoverrun = 264, - timer_delete = 265, - timer_create = 266, - vserver = 267, - io_setup = 268, - io_destroy = 269, - io_submit = 270, - io_cancel = 271, - io_getevents = 272, - mq_open = 273, - mq_unlink = 274, - mq_timedsend = 275, - mq_timedreceive = 276, - mq_notify = 277, - mq_getsetattr = 278, - waitid = 279, - tee = 280, - add_key = 281, - request_key = 282, - keyctl = 283, - openat = 284, - mkdirat = 285, - mknodat = 286, - fchownat = 287, - futimesat = 288, - fstatat64 = 289, - unlinkat = 290, - renameat = 291, - linkat = 292, - symlinkat = 293, - readlinkat = 294, - fchmodat = 295, - faccessat = 296, - pselect6 = 297, - ppoll = 298, - unshare = 299, - set_robust_list = 300, - get_robust_list = 301, - migrate_pages = 302, - mbind = 303, - get_mempolicy = 304, - set_mempolicy = 305, - kexec_load = 306, - move_pages = 307, - getcpu = 308, - epoll_pwait = 309, - utimensat = 310, - signalfd = 311, - timerfd_create = 312, - eventfd = 313, - fallocate = 314, - timerfd_settime = 315, - timerfd_gettime = 316, - signalfd4 = 317, - eventfd2 = 318, - epoll_create1 = 319, - dup3 = 320, - pipe2 = 321, - inotify_init1 = 322, - accept4 = 323, - preadv = 324, - pwritev = 325, - rt_tgsigqueueinfo = 326, - perf_event_open = 327, - recvmmsg = 328, - fanotify_init = 329, - fanotify_mark = 330, - prlimit64 = 331, - name_to_handle_at = 332, - open_by_handle_at = 333, - clock_adjtime = 334, - syncfs = 335, - sendmmsg = 336, - setns = 337, - process_vm_readv = 338, - process_vm_writev = 339, - kern_features = 340, - kcmp = 341, - finit_module = 342, - sched_setattr = 343, - sched_getattr = 344, - renameat2 = 345, - seccomp = 346, - getrandom = 347, - memfd_create = 348, - bpf = 349, - execveat = 350, - membarrier = 351, - userfaultfd = 352, - bind = 353, - listen = 354, - setsockopt = 355, - mlock2 = 356, - copy_file_range = 357, - preadv2 = 358, - pwritev2 = 359, - statx = 360, - io_pgetevents = 361, - pkey_mprotect = 362, - pkey_alloc = 363, - pkey_free = 364, - rseq = 365, - semtimedop = 392, - semget = 393, - semctl = 394, - shmget = 395, - shmctl = 396, - shmat = 397, - shmdt = 398, - msgget = 399, - msgsnd = 400, - msgrcv = 401, - msgctl = 402, - pidfd_send_signal = 424, - io_uring_setup = 425, - io_uring_enter = 426, - io_uring_register = 427, - open_tree = 428, - move_mount = 429, - fsopen = 430, - fsconfig = 431, - fsmount = 432, - fspick = 433, - pidfd_open = 434, - clone3 = 435, - close_range = 436, - openat2 = 437, - pidfd_getfd = 438, - faccessat2 = 439, - process_madvise = 440, - epoll_pwait2 = 441, - mount_setattr = 442, - landlock_create_ruleset = 444, - landlock_add_rule = 445, - landlock_restrict_self = 446, - - _, -}; - pub const O = struct { pub const CREAT = 0x200; pub const EXCL = 0x800; @@ -648,31 +270,31 @@ pub const VDSO = struct { }; pub const Flock = extern struct { - l_type: i16, - l_whence: i16, - l_start: off_t, - l_len: off_t, - l_pid: pid_t, + type: i16, + whence: i16, + start: off_t, + len: off_t, + pid: pid_t, }; pub const msghdr = extern struct { - msg_name: ?*sockaddr, - msg_namelen: socklen_t, - msg_iov: [*]iovec, - msg_iovlen: u64, - msg_control: ?*anyopaque, - msg_controllen: u64, - msg_flags: i32, + name: ?*sockaddr, + namelen: socklen_t, + iov: [*]iovec, + iovlen: u64, + control: ?*anyopaque, + controllen: u64, + flags: i32, }; pub const msghdr_const = extern struct { - msg_name: ?*const sockaddr, - msg_namelen: socklen_t, - msg_iov: [*]iovec_const, - msg_iovlen: u64, - msg_control: ?*anyopaque, - msg_controllen: u64, - msg_flags: i32, + name: ?*const sockaddr, + namelen: socklen_t, + iov: [*]const iovec_const, + iovlen: u64, + control: ?*const anyopaque, + controllen: u64, + flags: i32, }; pub const off_t = i64; @@ -821,7 +443,7 @@ pub const mcontext_t = extern struct { }; pub const ucontext_t = extern struct { - link: *ucontext_t, + link: ?*ucontext_t, flags: u64, sigmask: u64, mcontext: mcontext_t, diff --git a/lib/std/os/linux/syscalls.zig b/lib/std/os/linux/syscalls.zig new file mode 100644 index 0000000000..fb0993afe5 --- /dev/null +++ b/lib/std/os/linux/syscalls.zig @@ -0,0 +1,3493 @@ +// This file is automatically generated. +// See tools/generate_linux_syscalls.zig for more info. + +pub const X86 = enum(usize) { + restart_syscall = 0, + exit = 1, + fork = 2, + read = 3, + write = 4, + open = 5, + close = 6, + waitpid = 7, + creat = 8, + link = 9, + unlink = 10, + execve = 11, + chdir = 12, + time = 13, + mknod = 14, + chmod = 15, + lchown = 16, + @"break" = 17, + oldstat = 18, + lseek = 19, + getpid = 20, + mount = 21, + umount = 22, + setuid = 23, + getuid = 24, + stime = 25, + ptrace = 26, + alarm = 27, + oldfstat = 28, + pause = 29, + utime = 30, + stty = 31, + gtty = 32, + access = 33, + nice = 34, + ftime = 35, + sync = 36, + kill = 37, + rename = 38, + mkdir = 39, + rmdir = 40, + dup = 41, + pipe = 42, + times = 43, + prof = 44, + brk = 45, + setgid = 46, + getgid = 47, + signal = 48, + geteuid = 49, + getegid = 50, + acct = 51, + umount2 = 52, + lock = 53, + ioctl = 54, + fcntl = 55, + mpx = 56, + setpgid = 57, + ulimit = 58, + oldolduname = 59, + umask = 60, + chroot = 61, + ustat = 62, + dup2 = 63, + getppid = 64, + getpgrp = 65, + setsid = 66, + sigaction = 67, + sgetmask = 68, + ssetmask = 69, + setreuid = 70, + setregid = 71, + sigsuspend = 72, + sigpending = 73, + sethostname = 74, + setrlimit = 75, + getrlimit = 76, + getrusage = 77, + gettimeofday = 78, + settimeofday = 79, + getgroups = 80, + setgroups = 81, + select = 82, + symlink = 83, + oldlstat = 84, + readlink = 85, + uselib = 86, + swapon = 87, + reboot = 88, + readdir = 89, + mmap = 90, + munmap = 91, + truncate = 92, + ftruncate = 93, + fchmod = 94, + fchown = 95, + getpriority = 96, + setpriority = 97, + profil = 98, + statfs = 99, + fstatfs = 100, + ioperm = 101, + socketcall = 102, + syslog = 103, + setitimer = 104, + getitimer = 105, + stat = 106, + lstat = 107, + fstat = 108, + olduname = 109, + iopl = 110, + vhangup = 111, + idle = 112, + vm86old = 113, + wait4 = 114, + swapoff = 115, + sysinfo = 116, + ipc = 117, + fsync = 118, + sigreturn = 119, + clone = 120, + setdomainname = 121, + uname = 122, + modify_ldt = 123, + adjtimex = 124, + mprotect = 125, + sigprocmask = 126, + create_module = 127, + init_module = 128, + delete_module = 129, + get_kernel_syms = 130, + quotactl = 131, + getpgid = 132, + fchdir = 133, + bdflush = 134, + sysfs = 135, + personality = 136, + afs_syscall = 137, + setfsuid = 138, + setfsgid = 139, + _llseek = 140, + getdents = 141, + _newselect = 142, + flock = 143, + msync = 144, + readv = 145, + writev = 146, + getsid = 147, + fdatasync = 148, + _sysctl = 149, + mlock = 150, + munlock = 151, + mlockall = 152, + munlockall = 153, + sched_setparam = 154, + sched_getparam = 155, + sched_setscheduler = 156, + sched_getscheduler = 157, + sched_yield = 158, + sched_get_priority_max = 159, + sched_get_priority_min = 160, + sched_rr_get_interval = 161, + nanosleep = 162, + mremap = 163, + setresuid = 164, + getresuid = 165, + vm86 = 166, + query_module = 167, + poll = 168, + nfsservctl = 169, + setresgid = 170, + getresgid = 171, + prctl = 172, + rt_sigreturn = 173, + rt_sigaction = 174, + rt_sigprocmask = 175, + rt_sigpending = 176, + rt_sigtimedwait = 177, + rt_sigqueueinfo = 178, + rt_sigsuspend = 179, + pread64 = 180, + pwrite64 = 181, + chown = 182, + getcwd = 183, + capget = 184, + capset = 185, + sigaltstack = 186, + sendfile = 187, + getpmsg = 188, + putpmsg = 189, + vfork = 190, + ugetrlimit = 191, + mmap2 = 192, + truncate64 = 193, + ftruncate64 = 194, + stat64 = 195, + lstat64 = 196, + fstat64 = 197, + lchown32 = 198, + getuid32 = 199, + getgid32 = 200, + geteuid32 = 201, + getegid32 = 202, + setreuid32 = 203, + setregid32 = 204, + getgroups32 = 205, + setgroups32 = 206, + fchown32 = 207, + setresuid32 = 208, + getresuid32 = 209, + setresgid32 = 210, + getresgid32 = 211, + chown32 = 212, + setuid32 = 213, + setgid32 = 214, + setfsuid32 = 215, + setfsgid32 = 216, + pivot_root = 217, + mincore = 218, + madvise = 219, + getdents64 = 220, + fcntl64 = 221, + gettid = 224, + readahead = 225, + setxattr = 226, + lsetxattr = 227, + fsetxattr = 228, + getxattr = 229, + lgetxattr = 230, + fgetxattr = 231, + listxattr = 232, + llistxattr = 233, + flistxattr = 234, + removexattr = 235, + lremovexattr = 236, + fremovexattr = 237, + tkill = 238, + sendfile64 = 239, + futex = 240, + sched_setaffinity = 241, + sched_getaffinity = 242, + set_thread_area = 243, + get_thread_area = 244, + io_setup = 245, + io_destroy = 246, + io_getevents = 247, + io_submit = 248, + io_cancel = 249, + fadvise64 = 250, + exit_group = 252, + lookup_dcookie = 253, + epoll_create = 254, + epoll_ctl = 255, + epoll_wait = 256, + remap_file_pages = 257, + set_tid_address = 258, + timer_create = 259, + timer_settime = 260, + timer_gettime = 261, + timer_getoverrun = 262, + timer_delete = 263, + clock_settime = 264, + clock_gettime = 265, + clock_getres = 266, + clock_nanosleep = 267, + statfs64 = 268, + fstatfs64 = 269, + tgkill = 270, + utimes = 271, + fadvise64_64 = 272, + vserver = 273, + mbind = 274, + get_mempolicy = 275, + set_mempolicy = 276, + mq_open = 277, + mq_unlink = 278, + mq_timedsend = 279, + mq_timedreceive = 280, + mq_notify = 281, + mq_getsetattr = 282, + kexec_load = 283, + waitid = 284, + add_key = 286, + request_key = 287, + keyctl = 288, + ioprio_set = 289, + ioprio_get = 290, + inotify_init = 291, + inotify_add_watch = 292, + inotify_rm_watch = 293, + migrate_pages = 294, + openat = 295, + mkdirat = 296, + mknodat = 297, + fchownat = 298, + futimesat = 299, + fstatat64 = 300, + unlinkat = 301, + renameat = 302, + linkat = 303, + symlinkat = 304, + readlinkat = 305, + fchmodat = 306, + faccessat = 307, + pselect6 = 308, + ppoll = 309, + unshare = 310, + set_robust_list = 311, + get_robust_list = 312, + splice = 313, + sync_file_range = 314, + tee = 315, + vmsplice = 316, + move_pages = 317, + getcpu = 318, + epoll_pwait = 319, + utimensat = 320, + signalfd = 321, + timerfd_create = 322, + eventfd = 323, + fallocate = 324, + timerfd_settime = 325, + timerfd_gettime = 326, + signalfd4 = 327, + eventfd2 = 328, + epoll_create1 = 329, + dup3 = 330, + pipe2 = 331, + inotify_init1 = 332, + preadv = 333, + pwritev = 334, + rt_tgsigqueueinfo = 335, + perf_event_open = 336, + recvmmsg = 337, + fanotify_init = 338, + fanotify_mark = 339, + prlimit64 = 340, + name_to_handle_at = 341, + open_by_handle_at = 342, + clock_adjtime = 343, + syncfs = 344, + sendmmsg = 345, + setns = 346, + process_vm_readv = 347, + process_vm_writev = 348, + kcmp = 349, + finit_module = 350, + sched_setattr = 351, + sched_getattr = 352, + renameat2 = 353, + seccomp = 354, + getrandom = 355, + memfd_create = 356, + bpf = 357, + execveat = 358, + socket = 359, + socketpair = 360, + bind = 361, + connect = 362, + listen = 363, + accept4 = 364, + getsockopt = 365, + setsockopt = 366, + getsockname = 367, + getpeername = 368, + sendto = 369, + sendmsg = 370, + recvfrom = 371, + recvmsg = 372, + shutdown = 373, + userfaultfd = 374, + membarrier = 375, + mlock2 = 376, + copy_file_range = 377, + preadv2 = 378, + pwritev2 = 379, + pkey_mprotect = 380, + pkey_alloc = 381, + pkey_free = 382, + statx = 383, + arch_prctl = 384, + io_pgetevents = 385, + rseq = 386, + semget = 393, + semctl = 394, + shmget = 395, + shmctl = 396, + shmat = 397, + shmdt = 398, + msgget = 399, + msgsnd = 400, + msgrcv = 401, + msgctl = 402, + clock_gettime64 = 403, + clock_settime64 = 404, + clock_adjtime64 = 405, + clock_getres_time64 = 406, + clock_nanosleep_time64 = 407, + timer_gettime64 = 408, + timer_settime64 = 409, + timerfd_gettime64 = 410, + timerfd_settime64 = 411, + utimensat_time64 = 412, + pselect6_time64 = 413, + ppoll_time64 = 414, + io_pgetevents_time64 = 416, + recvmmsg_time64 = 417, + mq_timedsend_time64 = 418, + mq_timedreceive_time64 = 419, + semtimedop_time64 = 420, + rt_sigtimedwait_time64 = 421, + futex_time64 = 422, + sched_rr_get_interval_time64 = 423, + pidfd_send_signal = 424, + io_uring_setup = 425, + io_uring_enter = 426, + io_uring_register = 427, + open_tree = 428, + move_mount = 429, + fsopen = 430, + fsconfig = 431, + fsmount = 432, + fspick = 433, + pidfd_open = 434, + clone3 = 435, + close_range = 436, + openat2 = 437, + pidfd_getfd = 438, + faccessat2 = 439, + process_madvise = 440, + epoll_pwait2 = 441, + mount_setattr = 442, + quotactl_fd = 443, + landlock_create_ruleset = 444, + landlock_add_rule = 445, + landlock_restrict_self = 446, + memfd_secret = 447, + process_mrelease = 448, + futex_waitv = 449, + set_mempolicy_home_node = 450, +}; + +pub const X64 = enum(usize) { + read = 0, + write = 1, + open = 2, + close = 3, + stat = 4, + fstat = 5, + lstat = 6, + poll = 7, + lseek = 8, + mmap = 9, + mprotect = 10, + munmap = 11, + brk = 12, + rt_sigaction = 13, + rt_sigprocmask = 14, + rt_sigreturn = 15, + ioctl = 16, + pread64 = 17, + pwrite64 = 18, + readv = 19, + writev = 20, + access = 21, + pipe = 22, + select = 23, + sched_yield = 24, + mremap = 25, + msync = 26, + mincore = 27, + madvise = 28, + shmget = 29, + shmat = 30, + shmctl = 31, + dup = 32, + dup2 = 33, + pause = 34, + nanosleep = 35, + getitimer = 36, + alarm = 37, + setitimer = 38, + getpid = 39, + sendfile = 40, + socket = 41, + connect = 42, + accept = 43, + sendto = 44, + recvfrom = 45, + sendmsg = 46, + recvmsg = 47, + shutdown = 48, + bind = 49, + listen = 50, + getsockname = 51, + getpeername = 52, + socketpair = 53, + setsockopt = 54, + getsockopt = 55, + clone = 56, + fork = 57, + vfork = 58, + execve = 59, + exit = 60, + wait4 = 61, + kill = 62, + uname = 63, + semget = 64, + semop = 65, + semctl = 66, + shmdt = 67, + msgget = 68, + msgsnd = 69, + msgrcv = 70, + msgctl = 71, + fcntl = 72, + flock = 73, + fsync = 74, + fdatasync = 75, + truncate = 76, + ftruncate = 77, + getdents = 78, + getcwd = 79, + chdir = 80, + fchdir = 81, + rename = 82, + mkdir = 83, + rmdir = 84, + creat = 85, + link = 86, + unlink = 87, + symlink = 88, + readlink = 89, + chmod = 90, + fchmod = 91, + chown = 92, + fchown = 93, + lchown = 94, + umask = 95, + gettimeofday = 96, + getrlimit = 97, + getrusage = 98, + sysinfo = 99, + times = 100, + ptrace = 101, + getuid = 102, + syslog = 103, + getgid = 104, + setuid = 105, + setgid = 106, + geteuid = 107, + getegid = 108, + setpgid = 109, + getppid = 110, + getpgrp = 111, + setsid = 112, + setreuid = 113, + setregid = 114, + getgroups = 115, + setgroups = 116, + setresuid = 117, + getresuid = 118, + setresgid = 119, + getresgid = 120, + getpgid = 121, + setfsuid = 122, + setfsgid = 123, + getsid = 124, + capget = 125, + capset = 126, + rt_sigpending = 127, + rt_sigtimedwait = 128, + rt_sigqueueinfo = 129, + rt_sigsuspend = 130, + sigaltstack = 131, + utime = 132, + mknod = 133, + uselib = 134, + personality = 135, + ustat = 136, + statfs = 137, + fstatfs = 138, + sysfs = 139, + getpriority = 140, + setpriority = 141, + sched_setparam = 142, + sched_getparam = 143, + sched_setscheduler = 144, + sched_getscheduler = 145, + sched_get_priority_max = 146, + sched_get_priority_min = 147, + sched_rr_get_interval = 148, + mlock = 149, + munlock = 150, + mlockall = 151, + munlockall = 152, + vhangup = 153, + modify_ldt = 154, + pivot_root = 155, + _sysctl = 156, + prctl = 157, + arch_prctl = 158, + adjtimex = 159, + setrlimit = 160, + chroot = 161, + sync = 162, + acct = 163, + settimeofday = 164, + mount = 165, + umount2 = 166, + swapon = 167, + swapoff = 168, + reboot = 169, + sethostname = 170, + setdomainname = 171, + iopl = 172, + ioperm = 173, + create_module = 174, + init_module = 175, + delete_module = 176, + get_kernel_syms = 177, + query_module = 178, + quotactl = 179, + nfsservctl = 180, + getpmsg = 181, + putpmsg = 182, + afs_syscall = 183, + tuxcall = 184, + security = 185, + gettid = 186, + readahead = 187, + setxattr = 188, + lsetxattr = 189, + fsetxattr = 190, + getxattr = 191, + lgetxattr = 192, + fgetxattr = 193, + listxattr = 194, + llistxattr = 195, + flistxattr = 196, + removexattr = 197, + lremovexattr = 198, + fremovexattr = 199, + tkill = 200, + time = 201, + futex = 202, + sched_setaffinity = 203, + sched_getaffinity = 204, + set_thread_area = 205, + io_setup = 206, + io_destroy = 207, + io_getevents = 208, + io_submit = 209, + io_cancel = 210, + get_thread_area = 211, + lookup_dcookie = 212, + epoll_create = 213, + epoll_ctl_old = 214, + epoll_wait_old = 215, + remap_file_pages = 216, + getdents64 = 217, + set_tid_address = 218, + restart_syscall = 219, + semtimedop = 220, + fadvise64 = 221, + timer_create = 222, + timer_settime = 223, + timer_gettime = 224, + timer_getoverrun = 225, + timer_delete = 226, + clock_settime = 227, + clock_gettime = 228, + clock_getres = 229, + clock_nanosleep = 230, + exit_group = 231, + epoll_wait = 232, + epoll_ctl = 233, + tgkill = 234, + utimes = 235, + vserver = 236, + mbind = 237, + set_mempolicy = 238, + get_mempolicy = 239, + mq_open = 240, + mq_unlink = 241, + mq_timedsend = 242, + mq_timedreceive = 243, + mq_notify = 244, + mq_getsetattr = 245, + kexec_load = 246, + waitid = 247, + add_key = 248, + request_key = 249, + keyctl = 250, + ioprio_set = 251, + ioprio_get = 252, + inotify_init = 253, + inotify_add_watch = 254, + inotify_rm_watch = 255, + migrate_pages = 256, + openat = 257, + mkdirat = 258, + mknodat = 259, + fchownat = 260, + futimesat = 261, + fstatat64 = 262, + unlinkat = 263, + renameat = 264, + linkat = 265, + symlinkat = 266, + readlinkat = 267, + fchmodat = 268, + faccessat = 269, + pselect6 = 270, + ppoll = 271, + unshare = 272, + set_robust_list = 273, + get_robust_list = 274, + splice = 275, + tee = 276, + sync_file_range = 277, + vmsplice = 278, + move_pages = 279, + utimensat = 280, + epoll_pwait = 281, + signalfd = 282, + timerfd_create = 283, + eventfd = 284, + fallocate = 285, + timerfd_settime = 286, + timerfd_gettime = 287, + accept4 = 288, + signalfd4 = 289, + eventfd2 = 290, + epoll_create1 = 291, + dup3 = 292, + pipe2 = 293, + inotify_init1 = 294, + preadv = 295, + pwritev = 296, + rt_tgsigqueueinfo = 297, + perf_event_open = 298, + recvmmsg = 299, + fanotify_init = 300, + fanotify_mark = 301, + prlimit64 = 302, + name_to_handle_at = 303, + open_by_handle_at = 304, + clock_adjtime = 305, + syncfs = 306, + sendmmsg = 307, + setns = 308, + getcpu = 309, + process_vm_readv = 310, + process_vm_writev = 311, + kcmp = 312, + finit_module = 313, + sched_setattr = 314, + sched_getattr = 315, + renameat2 = 316, + seccomp = 317, + getrandom = 318, + memfd_create = 319, + kexec_file_load = 320, + bpf = 321, + execveat = 322, + userfaultfd = 323, + membarrier = 324, + mlock2 = 325, + copy_file_range = 326, + preadv2 = 327, + pwritev2 = 328, + pkey_mprotect = 329, + pkey_alloc = 330, + pkey_free = 331, + statx = 332, + io_pgetevents = 333, + rseq = 334, + pidfd_send_signal = 424, + io_uring_setup = 425, + io_uring_enter = 426, + io_uring_register = 427, + open_tree = 428, + move_mount = 429, + fsopen = 430, + fsconfig = 431, + fsmount = 432, + fspick = 433, + pidfd_open = 434, + clone3 = 435, + close_range = 436, + openat2 = 437, + pidfd_getfd = 438, + faccessat2 = 439, + process_madvise = 440, + epoll_pwait2 = 441, + mount_setattr = 442, + quotactl_fd = 443, + landlock_create_ruleset = 444, + landlock_add_rule = 445, + landlock_restrict_self = 446, + memfd_secret = 447, + process_mrelease = 448, + futex_waitv = 449, + set_mempolicy_home_node = 450, +}; + +pub const Arm = enum(usize) { + const arm_base = 0x0f0000; + + restart_syscall = 0, + exit = 1, + fork = 2, + read = 3, + write = 4, + open = 5, + close = 6, + creat = 8, + link = 9, + unlink = 10, + execve = 11, + chdir = 12, + mknod = 14, + chmod = 15, + lchown = 16, + lseek = 19, + getpid = 20, + mount = 21, + setuid = 23, + getuid = 24, + ptrace = 26, + pause = 29, + access = 33, + nice = 34, + sync = 36, + kill = 37, + rename = 38, + mkdir = 39, + rmdir = 40, + dup = 41, + pipe = 42, + times = 43, + brk = 45, + setgid = 46, + getgid = 47, + geteuid = 49, + getegid = 50, + acct = 51, + umount2 = 52, + ioctl = 54, + fcntl = 55, + setpgid = 57, + umask = 60, + chroot = 61, + ustat = 62, + dup2 = 63, + getppid = 64, + getpgrp = 65, + setsid = 66, + sigaction = 67, + setreuid = 70, + setregid = 71, + sigsuspend = 72, + sigpending = 73, + sethostname = 74, + setrlimit = 75, + getrusage = 77, + gettimeofday = 78, + settimeofday = 79, + getgroups = 80, + setgroups = 81, + symlink = 83, + readlink = 85, + uselib = 86, + swapon = 87, + reboot = 88, + munmap = 91, + truncate = 92, + ftruncate = 93, + fchmod = 94, + fchown = 95, + getpriority = 96, + setpriority = 97, + statfs = 99, + fstatfs = 100, + syslog = 103, + setitimer = 104, + getitimer = 105, + stat = 106, + lstat = 107, + fstat = 108, + vhangup = 111, + wait4 = 114, + swapoff = 115, + sysinfo = 116, + fsync = 118, + sigreturn = 119, + clone = 120, + setdomainname = 121, + uname = 122, + adjtimex = 124, + mprotect = 125, + sigprocmask = 126, + init_module = 128, + delete_module = 129, + quotactl = 131, + getpgid = 132, + fchdir = 133, + bdflush = 134, + sysfs = 135, + personality = 136, + setfsuid = 138, + setfsgid = 139, + _llseek = 140, + getdents = 141, + _newselect = 142, + flock = 143, + msync = 144, + readv = 145, + writev = 146, + getsid = 147, + fdatasync = 148, + _sysctl = 149, + mlock = 150, + munlock = 151, + mlockall = 152, + munlockall = 153, + sched_setparam = 154, + sched_getparam = 155, + sched_setscheduler = 156, + sched_getscheduler = 157, + sched_yield = 158, + sched_get_priority_max = 159, + sched_get_priority_min = 160, + sched_rr_get_interval = 161, + nanosleep = 162, + mremap = 163, + setresuid = 164, + getresuid = 165, + poll = 168, + nfsservctl = 169, + setresgid = 170, + getresgid = 171, + prctl = 172, + rt_sigreturn = 173, + rt_sigaction = 174, + rt_sigprocmask = 175, + rt_sigpending = 176, + rt_sigtimedwait = 177, + rt_sigqueueinfo = 178, + rt_sigsuspend = 179, + pread64 = 180, + pwrite64 = 181, + chown = 182, + getcwd = 183, + capget = 184, + capset = 185, + sigaltstack = 186, + sendfile = 187, + vfork = 190, + ugetrlimit = 191, + mmap2 = 192, + truncate64 = 193, + ftruncate64 = 194, + stat64 = 195, + lstat64 = 196, + fstat64 = 197, + lchown32 = 198, + getuid32 = 199, + getgid32 = 200, + geteuid32 = 201, + getegid32 = 202, + setreuid32 = 203, + setregid32 = 204, + getgroups32 = 205, + setgroups32 = 206, + fchown32 = 207, + setresuid32 = 208, + getresuid32 = 209, + setresgid32 = 210, + getresgid32 = 211, + chown32 = 212, + setuid32 = 213, + setgid32 = 214, + setfsuid32 = 215, + setfsgid32 = 216, + getdents64 = 217, + pivot_root = 218, + mincore = 219, + madvise = 220, + fcntl64 = 221, + gettid = 224, + readahead = 225, + setxattr = 226, + lsetxattr = 227, + fsetxattr = 228, + getxattr = 229, + lgetxattr = 230, + fgetxattr = 231, + listxattr = 232, + llistxattr = 233, + flistxattr = 234, + removexattr = 235, + lremovexattr = 236, + fremovexattr = 237, + tkill = 238, + sendfile64 = 239, + futex = 240, + sched_setaffinity = 241, + sched_getaffinity = 242, + io_setup = 243, + io_destroy = 244, + io_getevents = 245, + io_submit = 246, + io_cancel = 247, + exit_group = 248, + lookup_dcookie = 249, + epoll_create = 250, + epoll_ctl = 251, + epoll_wait = 252, + remap_file_pages = 253, + set_tid_address = 256, + timer_create = 257, + timer_settime = 258, + timer_gettime = 259, + timer_getoverrun = 260, + timer_delete = 261, + clock_settime = 262, + clock_gettime = 263, + clock_getres = 264, + clock_nanosleep = 265, + statfs64 = 266, + fstatfs64 = 267, + tgkill = 268, + utimes = 269, + fadvise64_64 = 270, + pciconfig_iobase = 271, + pciconfig_read = 272, + pciconfig_write = 273, + mq_open = 274, + mq_unlink = 275, + mq_timedsend = 276, + mq_timedreceive = 277, + mq_notify = 278, + mq_getsetattr = 279, + waitid = 280, + socket = 281, + bind = 282, + connect = 283, + listen = 284, + accept = 285, + getsockname = 286, + getpeername = 287, + socketpair = 288, + send = 289, + sendto = 290, + recv = 291, + recvfrom = 292, + shutdown = 293, + setsockopt = 294, + getsockopt = 295, + sendmsg = 296, + recvmsg = 297, + semop = 298, + semget = 299, + semctl = 300, + msgsnd = 301, + msgrcv = 302, + msgget = 303, + msgctl = 304, + shmat = 305, + shmdt = 306, + shmget = 307, + shmctl = 308, + add_key = 309, + request_key = 310, + keyctl = 311, + semtimedop = 312, + vserver = 313, + ioprio_set = 314, + ioprio_get = 315, + inotify_init = 316, + inotify_add_watch = 317, + inotify_rm_watch = 318, + mbind = 319, + get_mempolicy = 320, + set_mempolicy = 321, + openat = 322, + mkdirat = 323, + mknodat = 324, + fchownat = 325, + futimesat = 326, + fstatat64 = 327, + unlinkat = 328, + renameat = 329, + linkat = 330, + symlinkat = 331, + readlinkat = 332, + fchmodat = 333, + faccessat = 334, + pselect6 = 335, + ppoll = 336, + unshare = 337, + set_robust_list = 338, + get_robust_list = 339, + splice = 340, + sync_file_range = 341, + tee = 342, + vmsplice = 343, + move_pages = 344, + getcpu = 345, + epoll_pwait = 346, + kexec_load = 347, + utimensat = 348, + signalfd = 349, + timerfd_create = 350, + eventfd = 351, + fallocate = 352, + timerfd_settime = 353, + timerfd_gettime = 354, + signalfd4 = 355, + eventfd2 = 356, + epoll_create1 = 357, + dup3 = 358, + pipe2 = 359, + inotify_init1 = 360, + preadv = 361, + pwritev = 362, + rt_tgsigqueueinfo = 363, + perf_event_open = 364, + recvmmsg = 365, + accept4 = 366, + fanotify_init = 367, + fanotify_mark = 368, + prlimit64 = 369, + name_to_handle_at = 370, + open_by_handle_at = 371, + clock_adjtime = 372, + syncfs = 373, + sendmmsg = 374, + setns = 375, + process_vm_readv = 376, + process_vm_writev = 377, + kcmp = 378, + finit_module = 379, + sched_setattr = 380, + sched_getattr = 381, + renameat2 = 382, + seccomp = 383, + getrandom = 384, + memfd_create = 385, + bpf = 386, + execveat = 387, + userfaultfd = 388, + membarrier = 389, + mlock2 = 390, + copy_file_range = 391, + preadv2 = 392, + pwritev2 = 393, + pkey_mprotect = 394, + pkey_alloc = 395, + pkey_free = 396, + statx = 397, + rseq = 398, + io_pgetevents = 399, + migrate_pages = 400, + kexec_file_load = 401, + clock_gettime64 = 403, + clock_settime64 = 404, + clock_adjtime64 = 405, + clock_getres_time64 = 406, + clock_nanosleep_time64 = 407, + timer_gettime64 = 408, + timer_settime64 = 409, + timerfd_gettime64 = 410, + timerfd_settime64 = 411, + utimensat_time64 = 412, + pselect6_time64 = 413, + ppoll_time64 = 414, + io_pgetevents_time64 = 416, + recvmmsg_time64 = 417, + mq_timedsend_time64 = 418, + mq_timedreceive_time64 = 419, + semtimedop_time64 = 420, + rt_sigtimedwait_time64 = 421, + futex_time64 = 422, + sched_rr_get_interval_time64 = 423, + pidfd_send_signal = 424, + io_uring_setup = 425, + io_uring_enter = 426, + io_uring_register = 427, + open_tree = 428, + move_mount = 429, + fsopen = 430, + fsconfig = 431, + fsmount = 432, + fspick = 433, + pidfd_open = 434, + clone3 = 435, + close_range = 436, + openat2 = 437, + pidfd_getfd = 438, + faccessat2 = 439, + process_madvise = 440, + epoll_pwait2 = 441, + mount_setattr = 442, + quotactl_fd = 443, + landlock_create_ruleset = 444, + landlock_add_rule = 445, + landlock_restrict_self = 446, + process_mrelease = 448, + futex_waitv = 449, + set_mempolicy_home_node = 450, + + breakpoint = arm_base + 1, + cacheflush = arm_base + 2, + usr26 = arm_base + 3, + usr32 = arm_base + 4, + set_tls = arm_base + 5, + get_tls = arm_base + 6, +}; + +pub const Sparc64 = enum(usize) { + restart_syscall = 0, + exit = 1, + fork = 2, + read = 3, + write = 4, + open = 5, + close = 6, + wait4 = 7, + creat = 8, + link = 9, + unlink = 10, + execv = 11, + chdir = 12, + chown = 13, + mknod = 14, + chmod = 15, + lchown = 16, + brk = 17, + perfctr = 18, + lseek = 19, + getpid = 20, + capget = 21, + capset = 22, + setuid = 23, + getuid = 24, + vmsplice = 25, + ptrace = 26, + alarm = 27, + sigaltstack = 28, + pause = 29, + utime = 30, + access = 33, + nice = 34, + sync = 36, + kill = 37, + stat = 38, + sendfile = 39, + lstat = 40, + dup = 41, + pipe = 42, + times = 43, + umount2 = 45, + setgid = 46, + getgid = 47, + signal = 48, + geteuid = 49, + getegid = 50, + acct = 51, + memory_ordering = 52, + ioctl = 54, + reboot = 55, + symlink = 57, + readlink = 58, + execve = 59, + umask = 60, + chroot = 61, + fstat = 62, + fstat64 = 63, + getpagesize = 64, + msync = 65, + vfork = 66, + pread64 = 67, + pwrite64 = 68, + mmap = 71, + munmap = 73, + mprotect = 74, + madvise = 75, + vhangup = 76, + mincore = 78, + getgroups = 79, + setgroups = 80, + getpgrp = 81, + setitimer = 83, + swapon = 85, + getitimer = 86, + sethostname = 88, + dup2 = 90, + fcntl = 92, + select = 93, + fsync = 95, + setpriority = 96, + socket = 97, + connect = 98, + accept = 99, + getpriority = 100, + rt_sigreturn = 101, + rt_sigaction = 102, + rt_sigprocmask = 103, + rt_sigpending = 104, + rt_sigtimedwait = 105, + rt_sigqueueinfo = 106, + rt_sigsuspend = 107, + setresuid = 108, + getresuid = 109, + setresgid = 110, + getresgid = 111, + recvmsg = 113, + sendmsg = 114, + gettimeofday = 116, + getrusage = 117, + getsockopt = 118, + getcwd = 119, + readv = 120, + writev = 121, + settimeofday = 122, + fchown = 123, + fchmod = 124, + recvfrom = 125, + setreuid = 126, + setregid = 127, + rename = 128, + truncate = 129, + ftruncate = 130, + flock = 131, + lstat64 = 132, + sendto = 133, + shutdown = 134, + socketpair = 135, + mkdir = 136, + rmdir = 137, + utimes = 138, + stat64 = 139, + sendfile64 = 140, + getpeername = 141, + futex = 142, + gettid = 143, + getrlimit = 144, + setrlimit = 145, + pivot_root = 146, + prctl = 147, + pciconfig_read = 148, + pciconfig_write = 149, + getsockname = 150, + inotify_init = 151, + inotify_add_watch = 152, + poll = 153, + getdents64 = 154, + inotify_rm_watch = 156, + statfs = 157, + fstatfs = 158, + umount = 159, + sched_set_affinity = 160, + sched_get_affinity = 161, + getdomainname = 162, + setdomainname = 163, + utrap_install = 164, + quotactl = 165, + set_tid_address = 166, + mount = 167, + ustat = 168, + setxattr = 169, + lsetxattr = 170, + fsetxattr = 171, + getxattr = 172, + lgetxattr = 173, + getdents = 174, + setsid = 175, + fchdir = 176, + fgetxattr = 177, + listxattr = 178, + llistxattr = 179, + flistxattr = 180, + removexattr = 181, + lremovexattr = 182, + sigpending = 183, + query_module = 184, + setpgid = 185, + fremovexattr = 186, + tkill = 187, + exit_group = 188, + uname = 189, + init_module = 190, + personality = 191, + remap_file_pages = 192, + epoll_create = 193, + epoll_ctl = 194, + epoll_wait = 195, + ioprio_set = 196, + getppid = 197, + sigaction = 198, + sgetmask = 199, + ssetmask = 200, + sigsuspend = 201, + oldlstat = 202, + uselib = 203, + readdir = 204, + readahead = 205, + socketcall = 206, + syslog = 207, + lookup_dcookie = 208, + fadvise64 = 209, + fadvise64_64 = 210, + tgkill = 211, + waitpid = 212, + swapoff = 213, + sysinfo = 214, + ipc = 215, + sigreturn = 216, + clone = 217, + ioprio_get = 218, + adjtimex = 219, + sigprocmask = 220, + create_module = 221, + delete_module = 222, + get_kernel_syms = 223, + getpgid = 224, + bdflush = 225, + sysfs = 226, + afs_syscall = 227, + setfsuid = 228, + setfsgid = 229, + _newselect = 230, + splice = 232, + stime = 233, + statfs64 = 234, + fstatfs64 = 235, + _llseek = 236, + mlock = 237, + munlock = 238, + mlockall = 239, + munlockall = 240, + sched_setparam = 241, + sched_getparam = 242, + sched_setscheduler = 243, + sched_getscheduler = 244, + sched_yield = 245, + sched_get_priority_max = 246, + sched_get_priority_min = 247, + sched_rr_get_interval = 248, + nanosleep = 249, + mremap = 250, + _sysctl = 251, + getsid = 252, + fdatasync = 253, + nfsservctl = 254, + sync_file_range = 255, + clock_settime = 256, + clock_gettime = 257, + clock_getres = 258, + clock_nanosleep = 259, + sched_getaffinity = 260, + sched_setaffinity = 261, + timer_settime = 262, + timer_gettime = 263, + timer_getoverrun = 264, + timer_delete = 265, + timer_create = 266, + vserver = 267, + io_setup = 268, + io_destroy = 269, + io_submit = 270, + io_cancel = 271, + io_getevents = 272, + mq_open = 273, + mq_unlink = 274, + mq_timedsend = 275, + mq_timedreceive = 276, + mq_notify = 277, + mq_getsetattr = 278, + waitid = 279, + tee = 280, + add_key = 281, + request_key = 282, + keyctl = 283, + openat = 284, + mkdirat = 285, + mknodat = 286, + fchownat = 287, + futimesat = 288, + fstatat64 = 289, + unlinkat = 290, + renameat = 291, + linkat = 292, + symlinkat = 293, + readlinkat = 294, + fchmodat = 295, + faccessat = 296, + pselect6 = 297, + ppoll = 298, + unshare = 299, + set_robust_list = 300, + get_robust_list = 301, + migrate_pages = 302, + mbind = 303, + get_mempolicy = 304, + set_mempolicy = 305, + kexec_load = 306, + move_pages = 307, + getcpu = 308, + epoll_pwait = 309, + utimensat = 310, + signalfd = 311, + timerfd_create = 312, + eventfd = 313, + fallocate = 314, + timerfd_settime = 315, + timerfd_gettime = 316, + signalfd4 = 317, + eventfd2 = 318, + epoll_create1 = 319, + dup3 = 320, + pipe2 = 321, + inotify_init1 = 322, + accept4 = 323, + preadv = 324, + pwritev = 325, + rt_tgsigqueueinfo = 326, + perf_event_open = 327, + recvmmsg = 328, + fanotify_init = 329, + fanotify_mark = 330, + prlimit64 = 331, + name_to_handle_at = 332, + open_by_handle_at = 333, + clock_adjtime = 334, + syncfs = 335, + sendmmsg = 336, + setns = 337, + process_vm_readv = 338, + process_vm_writev = 339, + kern_features = 340, + kcmp = 341, + finit_module = 342, + sched_setattr = 343, + sched_getattr = 344, + renameat2 = 345, + seccomp = 346, + getrandom = 347, + memfd_create = 348, + bpf = 349, + execveat = 350, + membarrier = 351, + userfaultfd = 352, + bind = 353, + listen = 354, + setsockopt = 355, + mlock2 = 356, + copy_file_range = 357, + preadv2 = 358, + pwritev2 = 359, + statx = 360, + io_pgetevents = 361, + pkey_mprotect = 362, + pkey_alloc = 363, + pkey_free = 364, + rseq = 365, + semtimedop = 392, + semget = 393, + semctl = 394, + shmget = 395, + shmctl = 396, + shmat = 397, + shmdt = 398, + msgget = 399, + msgsnd = 400, + msgrcv = 401, + msgctl = 402, + pidfd_send_signal = 424, + io_uring_setup = 425, + io_uring_enter = 426, + io_uring_register = 427, + open_tree = 428, + move_mount = 429, + fsopen = 430, + fsconfig = 431, + fsmount = 432, + fspick = 433, + pidfd_open = 434, + close_range = 436, + openat2 = 437, + pidfd_getfd = 438, + faccessat2 = 439, + process_madvise = 440, + epoll_pwait2 = 441, + mount_setattr = 442, + quotactl_fd = 443, + landlock_create_ruleset = 444, + landlock_add_rule = 445, + landlock_restrict_self = 446, + process_mrelease = 448, + futex_waitv = 449, + set_mempolicy_home_node = 450, +}; + +pub const Mips = enum(usize) { + pub const Linux = 4000; + + syscall = Linux + 0, + exit = Linux + 1, + fork = Linux + 2, + read = Linux + 3, + write = Linux + 4, + open = Linux + 5, + close = Linux + 6, + waitpid = Linux + 7, + creat = Linux + 8, + link = Linux + 9, + unlink = Linux + 10, + execve = Linux + 11, + chdir = Linux + 12, + time = Linux + 13, + mknod = Linux + 14, + chmod = Linux + 15, + lchown = Linux + 16, + @"break" = Linux + 17, + lseek = Linux + 19, + getpid = Linux + 20, + mount = Linux + 21, + umount = Linux + 22, + setuid = Linux + 23, + getuid = Linux + 24, + stime = Linux + 25, + ptrace = Linux + 26, + alarm = Linux + 27, + pause = Linux + 29, + utime = Linux + 30, + stty = Linux + 31, + gtty = Linux + 32, + access = Linux + 33, + nice = Linux + 34, + ftime = Linux + 35, + sync = Linux + 36, + kill = Linux + 37, + rename = Linux + 38, + mkdir = Linux + 39, + rmdir = Linux + 40, + dup = Linux + 41, + pipe = Linux + 42, + times = Linux + 43, + prof = Linux + 44, + brk = Linux + 45, + setgid = Linux + 46, + getgid = Linux + 47, + signal = Linux + 48, + geteuid = Linux + 49, + getegid = Linux + 50, + acct = Linux + 51, + umount2 = Linux + 52, + lock = Linux + 53, + ioctl = Linux + 54, + fcntl = Linux + 55, + mpx = Linux + 56, + setpgid = Linux + 57, + ulimit = Linux + 58, + umask = Linux + 60, + chroot = Linux + 61, + ustat = Linux + 62, + dup2 = Linux + 63, + getppid = Linux + 64, + getpgrp = Linux + 65, + setsid = Linux + 66, + sigaction = Linux + 67, + sgetmask = Linux + 68, + ssetmask = Linux + 69, + setreuid = Linux + 70, + setregid = Linux + 71, + sigsuspend = Linux + 72, + sigpending = Linux + 73, + sethostname = Linux + 74, + setrlimit = Linux + 75, + getrlimit = Linux + 76, + getrusage = Linux + 77, + gettimeofday = Linux + 78, + settimeofday = Linux + 79, + getgroups = Linux + 80, + setgroups = Linux + 81, + reserved82 = Linux + 82, + symlink = Linux + 83, + readlink = Linux + 85, + uselib = Linux + 86, + swapon = Linux + 87, + reboot = Linux + 88, + readdir = Linux + 89, + mmap = Linux + 90, + munmap = Linux + 91, + truncate = Linux + 92, + ftruncate = Linux + 93, + fchmod = Linux + 94, + fchown = Linux + 95, + getpriority = Linux + 96, + setpriority = Linux + 97, + profil = Linux + 98, + statfs = Linux + 99, + fstatfs = Linux + 100, + ioperm = Linux + 101, + socketcall = Linux + 102, + syslog = Linux + 103, + setitimer = Linux + 104, + getitimer = Linux + 105, + stat = Linux + 106, + lstat = Linux + 107, + fstat = Linux + 108, + iopl = Linux + 110, + vhangup = Linux + 111, + idle = Linux + 112, + vm86 = Linux + 113, + wait4 = Linux + 114, + swapoff = Linux + 115, + sysinfo = Linux + 116, + ipc = Linux + 117, + fsync = Linux + 118, + sigreturn = Linux + 119, + clone = Linux + 120, + setdomainname = Linux + 121, + uname = Linux + 122, + modify_ldt = Linux + 123, + adjtimex = Linux + 124, + mprotect = Linux + 125, + sigprocmask = Linux + 126, + create_module = Linux + 127, + init_module = Linux + 128, + delete_module = Linux + 129, + get_kernel_syms = Linux + 130, + quotactl = Linux + 131, + getpgid = Linux + 132, + fchdir = Linux + 133, + bdflush = Linux + 134, + sysfs = Linux + 135, + personality = Linux + 136, + afs_syscall = Linux + 137, + setfsuid = Linux + 138, + setfsgid = Linux + 139, + _llseek = Linux + 140, + getdents = Linux + 141, + _newselect = Linux + 142, + flock = Linux + 143, + msync = Linux + 144, + readv = Linux + 145, + writev = Linux + 146, + cacheflush = Linux + 147, + cachectl = Linux + 148, + sysmips = Linux + 149, + getsid = Linux + 151, + fdatasync = Linux + 152, + _sysctl = Linux + 153, + mlock = Linux + 154, + munlock = Linux + 155, + mlockall = Linux + 156, + munlockall = Linux + 157, + sched_setparam = Linux + 158, + sched_getparam = Linux + 159, + sched_setscheduler = Linux + 160, + sched_getscheduler = Linux + 161, + sched_yield = Linux + 162, + sched_get_priority_max = Linux + 163, + sched_get_priority_min = Linux + 164, + sched_rr_get_interval = Linux + 165, + nanosleep = Linux + 166, + mremap = Linux + 167, + accept = Linux + 168, + bind = Linux + 169, + connect = Linux + 170, + getpeername = Linux + 171, + getsockname = Linux + 172, + getsockopt = Linux + 173, + listen = Linux + 174, + recv = Linux + 175, + recvfrom = Linux + 176, + recvmsg = Linux + 177, + send = Linux + 178, + sendmsg = Linux + 179, + sendto = Linux + 180, + setsockopt = Linux + 181, + shutdown = Linux + 182, + socket = Linux + 183, + socketpair = Linux + 184, + setresuid = Linux + 185, + getresuid = Linux + 186, + query_module = Linux + 187, + poll = Linux + 188, + nfsservctl = Linux + 189, + setresgid = Linux + 190, + getresgid = Linux + 191, + prctl = Linux + 192, + rt_sigreturn = Linux + 193, + rt_sigaction = Linux + 194, + rt_sigprocmask = Linux + 195, + rt_sigpending = Linux + 196, + rt_sigtimedwait = Linux + 197, + rt_sigqueueinfo = Linux + 198, + rt_sigsuspend = Linux + 199, + pread64 = Linux + 200, + pwrite64 = Linux + 201, + chown = Linux + 202, + getcwd = Linux + 203, + capget = Linux + 204, + capset = Linux + 205, + sigaltstack = Linux + 206, + sendfile = Linux + 207, + getpmsg = Linux + 208, + putpmsg = Linux + 209, + mmap2 = Linux + 210, + truncate64 = Linux + 211, + ftruncate64 = Linux + 212, + stat64 = Linux + 213, + lstat64 = Linux + 214, + fstat64 = Linux + 215, + pivot_root = Linux + 216, + mincore = Linux + 217, + madvise = Linux + 218, + getdents64 = Linux + 219, + fcntl64 = Linux + 220, + reserved221 = Linux + 221, + gettid = Linux + 222, + readahead = Linux + 223, + setxattr = Linux + 224, + lsetxattr = Linux + 225, + fsetxattr = Linux + 226, + getxattr = Linux + 227, + lgetxattr = Linux + 228, + fgetxattr = Linux + 229, + listxattr = Linux + 230, + llistxattr = Linux + 231, + flistxattr = Linux + 232, + removexattr = Linux + 233, + lremovexattr = Linux + 234, + fremovexattr = Linux + 235, + tkill = Linux + 236, + sendfile64 = Linux + 237, + futex = Linux + 238, + sched_setaffinity = Linux + 239, + sched_getaffinity = Linux + 240, + io_setup = Linux + 241, + io_destroy = Linux + 242, + io_getevents = Linux + 243, + io_submit = Linux + 244, + io_cancel = Linux + 245, + exit_group = Linux + 246, + lookup_dcookie = Linux + 247, + epoll_create = Linux + 248, + epoll_ctl = Linux + 249, + epoll_wait = Linux + 250, + remap_file_pages = Linux + 251, + set_tid_address = Linux + 252, + restart_syscall = Linux + 253, + fadvise64 = Linux + 254, + statfs64 = Linux + 255, + fstatfs64 = Linux + 256, + timer_create = Linux + 257, + timer_settime = Linux + 258, + timer_gettime = Linux + 259, + timer_getoverrun = Linux + 260, + timer_delete = Linux + 261, + clock_settime = Linux + 262, + clock_gettime = Linux + 263, + clock_getres = Linux + 264, + clock_nanosleep = Linux + 265, + tgkill = Linux + 266, + utimes = Linux + 267, + mbind = Linux + 268, + get_mempolicy = Linux + 269, + set_mempolicy = Linux + 270, + mq_open = Linux + 271, + mq_unlink = Linux + 272, + mq_timedsend = Linux + 273, + mq_timedreceive = Linux + 274, + mq_notify = Linux + 275, + mq_getsetattr = Linux + 276, + vserver = Linux + 277, + waitid = Linux + 278, + add_key = Linux + 280, + request_key = Linux + 281, + keyctl = Linux + 282, + set_thread_area = Linux + 283, + inotify_init = Linux + 284, + inotify_add_watch = Linux + 285, + inotify_rm_watch = Linux + 286, + migrate_pages = Linux + 287, + openat = Linux + 288, + mkdirat = Linux + 289, + mknodat = Linux + 290, + fchownat = Linux + 291, + futimesat = Linux + 292, + fstatat64 = Linux + 293, + unlinkat = Linux + 294, + renameat = Linux + 295, + linkat = Linux + 296, + symlinkat = Linux + 297, + readlinkat = Linux + 298, + fchmodat = Linux + 299, + faccessat = Linux + 300, + pselect6 = Linux + 301, + ppoll = Linux + 302, + unshare = Linux + 303, + splice = Linux + 304, + sync_file_range = Linux + 305, + tee = Linux + 306, + vmsplice = Linux + 307, + move_pages = Linux + 308, + set_robust_list = Linux + 309, + get_robust_list = Linux + 310, + kexec_load = Linux + 311, + getcpu = Linux + 312, + epoll_pwait = Linux + 313, + ioprio_set = Linux + 314, + ioprio_get = Linux + 315, + utimensat = Linux + 316, + signalfd = Linux + 317, + timerfd = Linux + 318, + eventfd = Linux + 319, + fallocate = Linux + 320, + timerfd_create = Linux + 321, + timerfd_gettime = Linux + 322, + timerfd_settime = Linux + 323, + signalfd4 = Linux + 324, + eventfd2 = Linux + 325, + epoll_create1 = Linux + 326, + dup3 = Linux + 327, + pipe2 = Linux + 328, + inotify_init1 = Linux + 329, + preadv = Linux + 330, + pwritev = Linux + 331, + rt_tgsigqueueinfo = Linux + 332, + perf_event_open = Linux + 333, + accept4 = Linux + 334, + recvmmsg = Linux + 335, + fanotify_init = Linux + 336, + fanotify_mark = Linux + 337, + prlimit64 = Linux + 338, + name_to_handle_at = Linux + 339, + open_by_handle_at = Linux + 340, + clock_adjtime = Linux + 341, + syncfs = Linux + 342, + sendmmsg = Linux + 343, + setns = Linux + 344, + process_vm_readv = Linux + 345, + process_vm_writev = Linux + 346, + kcmp = Linux + 347, + finit_module = Linux + 348, + sched_setattr = Linux + 349, + sched_getattr = Linux + 350, + renameat2 = Linux + 351, + seccomp = Linux + 352, + getrandom = Linux + 353, + memfd_create = Linux + 354, + bpf = Linux + 355, + execveat = Linux + 356, + userfaultfd = Linux + 357, + membarrier = Linux + 358, + mlock2 = Linux + 359, + copy_file_range = Linux + 360, + preadv2 = Linux + 361, + pwritev2 = Linux + 362, + pkey_mprotect = Linux + 363, + pkey_alloc = Linux + 364, + pkey_free = Linux + 365, + statx = Linux + 366, + rseq = Linux + 367, + io_pgetevents = Linux + 368, + semget = Linux + 393, + semctl = Linux + 394, + shmget = Linux + 395, + shmctl = Linux + 396, + shmat = Linux + 397, + shmdt = Linux + 398, + msgget = Linux + 399, + msgsnd = Linux + 400, + msgrcv = Linux + 401, + msgctl = Linux + 402, + clock_gettime64 = Linux + 403, + clock_settime64 = Linux + 404, + clock_adjtime64 = Linux + 405, + clock_getres_time64 = Linux + 406, + clock_nanosleep_time64 = Linux + 407, + timer_gettime64 = Linux + 408, + timer_settime64 = Linux + 409, + timerfd_gettime64 = Linux + 410, + timerfd_settime64 = Linux + 411, + utimensat_time64 = Linux + 412, + pselect6_time64 = Linux + 413, + ppoll_time64 = Linux + 414, + io_pgetevents_time64 = Linux + 416, + recvmmsg_time64 = Linux + 417, + mq_timedsend_time64 = Linux + 418, + mq_timedreceive_time64 = Linux + 419, + semtimedop_time64 = Linux + 420, + rt_sigtimedwait_time64 = Linux + 421, + futex_time64 = Linux + 422, + sched_rr_get_interval_time64 = Linux + 423, + pidfd_send_signal = Linux + 424, + io_uring_setup = Linux + 425, + io_uring_enter = Linux + 426, + io_uring_register = Linux + 427, + open_tree = Linux + 428, + move_mount = Linux + 429, + fsopen = Linux + 430, + fsconfig = Linux + 431, + fsmount = Linux + 432, + fspick = Linux + 433, + pidfd_open = Linux + 434, + clone3 = Linux + 435, + close_range = Linux + 436, + openat2 = Linux + 437, + pidfd_getfd = Linux + 438, + faccessat2 = Linux + 439, + process_madvise = Linux + 440, + epoll_pwait2 = Linux + 441, + mount_setattr = Linux + 442, + quotactl_fd = Linux + 443, + landlock_create_ruleset = Linux + 444, + landlock_add_rule = Linux + 445, + landlock_restrict_self = Linux + 446, + process_mrelease = Linux + 448, + futex_waitv = Linux + 449, + set_mempolicy_home_node = Linux + 450, +}; + +pub const PowerPC = enum(usize) { + restart_syscall = 0, + exit = 1, + fork = 2, + read = 3, + write = 4, + open = 5, + close = 6, + waitpid = 7, + creat = 8, + link = 9, + unlink = 10, + execve = 11, + chdir = 12, + time = 13, + mknod = 14, + chmod = 15, + lchown = 16, + @"break" = 17, + oldstat = 18, + lseek = 19, + getpid = 20, + mount = 21, + umount = 22, + setuid = 23, + getuid = 24, + stime = 25, + ptrace = 26, + alarm = 27, + oldfstat = 28, + pause = 29, + utime = 30, + stty = 31, + gtty = 32, + access = 33, + nice = 34, + ftime = 35, + sync = 36, + kill = 37, + rename = 38, + mkdir = 39, + rmdir = 40, + dup = 41, + pipe = 42, + times = 43, + prof = 44, + brk = 45, + setgid = 46, + getgid = 47, + signal = 48, + geteuid = 49, + getegid = 50, + acct = 51, + umount2 = 52, + lock = 53, + ioctl = 54, + fcntl = 55, + mpx = 56, + setpgid = 57, + ulimit = 58, + oldolduname = 59, + umask = 60, + chroot = 61, + ustat = 62, + dup2 = 63, + getppid = 64, + getpgrp = 65, + setsid = 66, + sigaction = 67, + sgetmask = 68, + ssetmask = 69, + setreuid = 70, + setregid = 71, + sigsuspend = 72, + sigpending = 73, + sethostname = 74, + setrlimit = 75, + getrlimit = 76, + getrusage = 77, + gettimeofday = 78, + settimeofday = 79, + getgroups = 80, + setgroups = 81, + select = 82, + symlink = 83, + oldlstat = 84, + readlink = 85, + uselib = 86, + swapon = 87, + reboot = 88, + readdir = 89, + mmap = 90, + munmap = 91, + truncate = 92, + ftruncate = 93, + fchmod = 94, + fchown = 95, + getpriority = 96, + setpriority = 97, + profil = 98, + statfs = 99, + fstatfs = 100, + ioperm = 101, + socketcall = 102, + syslog = 103, + setitimer = 104, + getitimer = 105, + stat = 106, + lstat = 107, + fstat = 108, + olduname = 109, + iopl = 110, + vhangup = 111, + idle = 112, + vm86 = 113, + wait4 = 114, + swapoff = 115, + sysinfo = 116, + ipc = 117, + fsync = 118, + sigreturn = 119, + clone = 120, + setdomainname = 121, + uname = 122, + modify_ldt = 123, + adjtimex = 124, + mprotect = 125, + sigprocmask = 126, + create_module = 127, + init_module = 128, + delete_module = 129, + get_kernel_syms = 130, + quotactl = 131, + getpgid = 132, + fchdir = 133, + bdflush = 134, + sysfs = 135, + personality = 136, + afs_syscall = 137, + setfsuid = 138, + setfsgid = 139, + _llseek = 140, + getdents = 141, + _newselect = 142, + flock = 143, + msync = 144, + readv = 145, + writev = 146, + getsid = 147, + fdatasync = 148, + _sysctl = 149, + mlock = 150, + munlock = 151, + mlockall = 152, + munlockall = 153, + sched_setparam = 154, + sched_getparam = 155, + sched_setscheduler = 156, + sched_getscheduler = 157, + sched_yield = 158, + sched_get_priority_max = 159, + sched_get_priority_min = 160, + sched_rr_get_interval = 161, + nanosleep = 162, + mremap = 163, + setresuid = 164, + getresuid = 165, + query_module = 166, + poll = 167, + nfsservctl = 168, + setresgid = 169, + getresgid = 170, + prctl = 171, + rt_sigreturn = 172, + rt_sigaction = 173, + rt_sigprocmask = 174, + rt_sigpending = 175, + rt_sigtimedwait = 176, + rt_sigqueueinfo = 177, + rt_sigsuspend = 178, + pread64 = 179, + pwrite64 = 180, + chown = 181, + getcwd = 182, + capget = 183, + capset = 184, + sigaltstack = 185, + sendfile = 186, + getpmsg = 187, + putpmsg = 188, + vfork = 189, + ugetrlimit = 190, + readahead = 191, + mmap2 = 192, + truncate64 = 193, + ftruncate64 = 194, + stat64 = 195, + lstat64 = 196, + fstat64 = 197, + pciconfig_read = 198, + pciconfig_write = 199, + pciconfig_iobase = 200, + multiplexer = 201, + getdents64 = 202, + pivot_root = 203, + fcntl64 = 204, + madvise = 205, + mincore = 206, + gettid = 207, + tkill = 208, + setxattr = 209, + lsetxattr = 210, + fsetxattr = 211, + getxattr = 212, + lgetxattr = 213, + fgetxattr = 214, + listxattr = 215, + llistxattr = 216, + flistxattr = 217, + removexattr = 218, + lremovexattr = 219, + fremovexattr = 220, + futex = 221, + sched_setaffinity = 222, + sched_getaffinity = 223, + tuxcall = 225, + sendfile64 = 226, + io_setup = 227, + io_destroy = 228, + io_getevents = 229, + io_submit = 230, + io_cancel = 231, + set_tid_address = 232, + fadvise64 = 233, + exit_group = 234, + lookup_dcookie = 235, + epoll_create = 236, + epoll_ctl = 237, + epoll_wait = 238, + remap_file_pages = 239, + timer_create = 240, + timer_settime = 241, + timer_gettime = 242, + timer_getoverrun = 243, + timer_delete = 244, + clock_settime = 245, + clock_gettime = 246, + clock_getres = 247, + clock_nanosleep = 248, + swapcontext = 249, + tgkill = 250, + utimes = 251, + statfs64 = 252, + fstatfs64 = 253, + fadvise64_64 = 254, + rtas = 255, + sys_debug_setcontext = 256, + migrate_pages = 258, + mbind = 259, + get_mempolicy = 260, + set_mempolicy = 261, + mq_open = 262, + mq_unlink = 263, + mq_timedsend = 264, + mq_timedreceive = 265, + mq_notify = 266, + mq_getsetattr = 267, + kexec_load = 268, + add_key = 269, + request_key = 270, + keyctl = 271, + waitid = 272, + ioprio_set = 273, + ioprio_get = 274, + inotify_init = 275, + inotify_add_watch = 276, + inotify_rm_watch = 277, + spu_run = 278, + spu_create = 279, + pselect6 = 280, + ppoll = 281, + unshare = 282, + splice = 283, + tee = 284, + vmsplice = 285, + openat = 286, + mkdirat = 287, + mknodat = 288, + fchownat = 289, + futimesat = 290, + fstatat64 = 291, + unlinkat = 292, + renameat = 293, + linkat = 294, + symlinkat = 295, + readlinkat = 296, + fchmodat = 297, + faccessat = 298, + get_robust_list = 299, + set_robust_list = 300, + move_pages = 301, + getcpu = 302, + epoll_pwait = 303, + utimensat = 304, + signalfd = 305, + timerfd_create = 306, + eventfd = 307, + sync_file_range = 308, + fallocate = 309, + subpage_prot = 310, + timerfd_settime = 311, + timerfd_gettime = 312, + signalfd4 = 313, + eventfd2 = 314, + epoll_create1 = 315, + dup3 = 316, + pipe2 = 317, + inotify_init1 = 318, + perf_event_open = 319, + preadv = 320, + pwritev = 321, + rt_tgsigqueueinfo = 322, + fanotify_init = 323, + fanotify_mark = 324, + prlimit64 = 325, + socket = 326, + bind = 327, + connect = 328, + listen = 329, + accept = 330, + getsockname = 331, + getpeername = 332, + socketpair = 333, + send = 334, + sendto = 335, + recv = 336, + recvfrom = 337, + shutdown = 338, + setsockopt = 339, + getsockopt = 340, + sendmsg = 341, + recvmsg = 342, + recvmmsg = 343, + accept4 = 344, + name_to_handle_at = 345, + open_by_handle_at = 346, + clock_adjtime = 347, + syncfs = 348, + sendmmsg = 349, + setns = 350, + process_vm_readv = 351, + process_vm_writev = 352, + finit_module = 353, + kcmp = 354, + sched_setattr = 355, + sched_getattr = 356, + renameat2 = 357, + seccomp = 358, + getrandom = 359, + memfd_create = 360, + bpf = 361, + execveat = 362, + switch_endian = 363, + userfaultfd = 364, + membarrier = 365, + mlock2 = 378, + copy_file_range = 379, + preadv2 = 380, + pwritev2 = 381, + kexec_file_load = 382, + statx = 383, + pkey_alloc = 384, + pkey_free = 385, + pkey_mprotect = 386, + rseq = 387, + io_pgetevents = 388, + semget = 393, + semctl = 394, + shmget = 395, + shmctl = 396, + shmat = 397, + shmdt = 398, + msgget = 399, + msgsnd = 400, + msgrcv = 401, + msgctl = 402, + clock_gettime64 = 403, + clock_settime64 = 404, + clock_adjtime64 = 405, + clock_getres_time64 = 406, + clock_nanosleep_time64 = 407, + timer_gettime64 = 408, + timer_settime64 = 409, + timerfd_gettime64 = 410, + timerfd_settime64 = 411, + utimensat_time64 = 412, + pselect6_time64 = 413, + ppoll_time64 = 414, + io_pgetevents_time64 = 416, + recvmmsg_time64 = 417, + mq_timedsend_time64 = 418, + mq_timedreceive_time64 = 419, + semtimedop_time64 = 420, + rt_sigtimedwait_time64 = 421, + futex_time64 = 422, + sched_rr_get_interval_time64 = 423, + pidfd_send_signal = 424, + io_uring_setup = 425, + io_uring_enter = 426, + io_uring_register = 427, + open_tree = 428, + move_mount = 429, + fsopen = 430, + fsconfig = 431, + fsmount = 432, + fspick = 433, + pidfd_open = 434, + clone3 = 435, + close_range = 436, + openat2 = 437, + pidfd_getfd = 438, + faccessat2 = 439, + process_madvise = 440, + epoll_pwait2 = 441, + mount_setattr = 442, + quotactl_fd = 443, + landlock_create_ruleset = 444, + landlock_add_rule = 445, + landlock_restrict_self = 446, + process_mrelease = 448, + futex_waitv = 449, + set_mempolicy_home_node = 450, +}; + +pub const PowerPC64 = enum(usize) { + restart_syscall = 0, + exit = 1, + fork = 2, + read = 3, + write = 4, + open = 5, + close = 6, + waitpid = 7, + creat = 8, + link = 9, + unlink = 10, + execve = 11, + chdir = 12, + time = 13, + mknod = 14, + chmod = 15, + lchown = 16, + @"break" = 17, + oldstat = 18, + lseek = 19, + getpid = 20, + mount = 21, + umount = 22, + setuid = 23, + getuid = 24, + stime = 25, + ptrace = 26, + alarm = 27, + oldfstat = 28, + pause = 29, + utime = 30, + stty = 31, + gtty = 32, + access = 33, + nice = 34, + ftime = 35, + sync = 36, + kill = 37, + rename = 38, + mkdir = 39, + rmdir = 40, + dup = 41, + pipe = 42, + times = 43, + prof = 44, + brk = 45, + setgid = 46, + getgid = 47, + signal = 48, + geteuid = 49, + getegid = 50, + acct = 51, + umount2 = 52, + lock = 53, + ioctl = 54, + fcntl = 55, + mpx = 56, + setpgid = 57, + ulimit = 58, + oldolduname = 59, + umask = 60, + chroot = 61, + ustat = 62, + dup2 = 63, + getppid = 64, + getpgrp = 65, + setsid = 66, + sigaction = 67, + sgetmask = 68, + ssetmask = 69, + setreuid = 70, + setregid = 71, + sigsuspend = 72, + sigpending = 73, + sethostname = 74, + setrlimit = 75, + getrlimit = 76, + getrusage = 77, + gettimeofday = 78, + settimeofday = 79, + getgroups = 80, + setgroups = 81, + select = 82, + symlink = 83, + oldlstat = 84, + readlink = 85, + uselib = 86, + swapon = 87, + reboot = 88, + readdir = 89, + mmap = 90, + munmap = 91, + truncate = 92, + ftruncate = 93, + fchmod = 94, + fchown = 95, + getpriority = 96, + setpriority = 97, + profil = 98, + statfs = 99, + fstatfs = 100, + ioperm = 101, + socketcall = 102, + syslog = 103, + setitimer = 104, + getitimer = 105, + stat = 106, + lstat = 107, + fstat = 108, + olduname = 109, + iopl = 110, + vhangup = 111, + idle = 112, + vm86 = 113, + wait4 = 114, + swapoff = 115, + sysinfo = 116, + ipc = 117, + fsync = 118, + sigreturn = 119, + clone = 120, + setdomainname = 121, + uname = 122, + modify_ldt = 123, + adjtimex = 124, + mprotect = 125, + sigprocmask = 126, + create_module = 127, + init_module = 128, + delete_module = 129, + get_kernel_syms = 130, + quotactl = 131, + getpgid = 132, + fchdir = 133, + bdflush = 134, + sysfs = 135, + personality = 136, + afs_syscall = 137, + setfsuid = 138, + setfsgid = 139, + _llseek = 140, + getdents = 141, + _newselect = 142, + flock = 143, + msync = 144, + readv = 145, + writev = 146, + getsid = 147, + fdatasync = 148, + _sysctl = 149, + mlock = 150, + munlock = 151, + mlockall = 152, + munlockall = 153, + sched_setparam = 154, + sched_getparam = 155, + sched_setscheduler = 156, + sched_getscheduler = 157, + sched_yield = 158, + sched_get_priority_max = 159, + sched_get_priority_min = 160, + sched_rr_get_interval = 161, + nanosleep = 162, + mremap = 163, + setresuid = 164, + getresuid = 165, + query_module = 166, + poll = 167, + nfsservctl = 168, + setresgid = 169, + getresgid = 170, + prctl = 171, + rt_sigreturn = 172, + rt_sigaction = 173, + rt_sigprocmask = 174, + rt_sigpending = 175, + rt_sigtimedwait = 176, + rt_sigqueueinfo = 177, + rt_sigsuspend = 178, + pread64 = 179, + pwrite64 = 180, + chown = 181, + getcwd = 182, + capget = 183, + capset = 184, + sigaltstack = 185, + sendfile = 186, + getpmsg = 187, + putpmsg = 188, + vfork = 189, + ugetrlimit = 190, + readahead = 191, + pciconfig_read = 198, + pciconfig_write = 199, + pciconfig_iobase = 200, + multiplexer = 201, + getdents64 = 202, + pivot_root = 203, + madvise = 205, + mincore = 206, + gettid = 207, + tkill = 208, + setxattr = 209, + lsetxattr = 210, + fsetxattr = 211, + getxattr = 212, + lgetxattr = 213, + fgetxattr = 214, + listxattr = 215, + llistxattr = 216, + flistxattr = 217, + removexattr = 218, + lremovexattr = 219, + fremovexattr = 220, + futex = 221, + sched_setaffinity = 222, + sched_getaffinity = 223, + tuxcall = 225, + io_setup = 227, + io_destroy = 228, + io_getevents = 229, + io_submit = 230, + io_cancel = 231, + set_tid_address = 232, + fadvise64 = 233, + exit_group = 234, + lookup_dcookie = 235, + epoll_create = 236, + epoll_ctl = 237, + epoll_wait = 238, + remap_file_pages = 239, + timer_create = 240, + timer_settime = 241, + timer_gettime = 242, + timer_getoverrun = 243, + timer_delete = 244, + clock_settime = 245, + clock_gettime = 246, + clock_getres = 247, + clock_nanosleep = 248, + swapcontext = 249, + tgkill = 250, + utimes = 251, + statfs64 = 252, + fstatfs64 = 253, + rtas = 255, + sys_debug_setcontext = 256, + migrate_pages = 258, + mbind = 259, + get_mempolicy = 260, + set_mempolicy = 261, + mq_open = 262, + mq_unlink = 263, + mq_timedsend = 264, + mq_timedreceive = 265, + mq_notify = 266, + mq_getsetattr = 267, + kexec_load = 268, + add_key = 269, + request_key = 270, + keyctl = 271, + waitid = 272, + ioprio_set = 273, + ioprio_get = 274, + inotify_init = 275, + inotify_add_watch = 276, + inotify_rm_watch = 277, + spu_run = 278, + spu_create = 279, + pselect6 = 280, + ppoll = 281, + unshare = 282, + splice = 283, + tee = 284, + vmsplice = 285, + openat = 286, + mkdirat = 287, + mknodat = 288, + fchownat = 289, + futimesat = 290, + fstatat64 = 291, + unlinkat = 292, + renameat = 293, + linkat = 294, + symlinkat = 295, + readlinkat = 296, + fchmodat = 297, + faccessat = 298, + get_robust_list = 299, + set_robust_list = 300, + move_pages = 301, + getcpu = 302, + epoll_pwait = 303, + utimensat = 304, + signalfd = 305, + timerfd_create = 306, + eventfd = 307, + sync_file_range = 308, + fallocate = 309, + subpage_prot = 310, + timerfd_settime = 311, + timerfd_gettime = 312, + signalfd4 = 313, + eventfd2 = 314, + epoll_create1 = 315, + dup3 = 316, + pipe2 = 317, + inotify_init1 = 318, + perf_event_open = 319, + preadv = 320, + pwritev = 321, + rt_tgsigqueueinfo = 322, + fanotify_init = 323, + fanotify_mark = 324, + prlimit64 = 325, + socket = 326, + bind = 327, + connect = 328, + listen = 329, + accept = 330, + getsockname = 331, + getpeername = 332, + socketpair = 333, + send = 334, + sendto = 335, + recv = 336, + recvfrom = 337, + shutdown = 338, + setsockopt = 339, + getsockopt = 340, + sendmsg = 341, + recvmsg = 342, + recvmmsg = 343, + accept4 = 344, + name_to_handle_at = 345, + open_by_handle_at = 346, + clock_adjtime = 347, + syncfs = 348, + sendmmsg = 349, + setns = 350, + process_vm_readv = 351, + process_vm_writev = 352, + finit_module = 353, + kcmp = 354, + sched_setattr = 355, + sched_getattr = 356, + renameat2 = 357, + seccomp = 358, + getrandom = 359, + memfd_create = 360, + bpf = 361, + execveat = 362, + switch_endian = 363, + userfaultfd = 364, + membarrier = 365, + mlock2 = 378, + copy_file_range = 379, + preadv2 = 380, + pwritev2 = 381, + kexec_file_load = 382, + statx = 383, + pkey_alloc = 384, + pkey_free = 385, + pkey_mprotect = 386, + rseq = 387, + io_pgetevents = 388, + semtimedop = 392, + semget = 393, + semctl = 394, + shmget = 395, + shmctl = 396, + shmat = 397, + shmdt = 398, + msgget = 399, + msgsnd = 400, + msgrcv = 401, + msgctl = 402, + pidfd_send_signal = 424, + io_uring_setup = 425, + io_uring_enter = 426, + io_uring_register = 427, + open_tree = 428, + move_mount = 429, + fsopen = 430, + fsconfig = 431, + fsmount = 432, + fspick = 433, + pidfd_open = 434, + clone3 = 435, + close_range = 436, + openat2 = 437, + pidfd_getfd = 438, + faccessat2 = 439, + process_madvise = 440, + epoll_pwait2 = 441, + mount_setattr = 442, + quotactl_fd = 443, + landlock_create_ruleset = 444, + landlock_add_rule = 445, + landlock_restrict_self = 446, + process_mrelease = 448, + futex_waitv = 449, + set_mempolicy_home_node = 450, +}; + +pub const Arm64 = enum(usize) { + io_setup = 0, + io_destroy = 1, + io_submit = 2, + io_cancel = 3, + io_getevents = 4, + setxattr = 5, + lsetxattr = 6, + fsetxattr = 7, + getxattr = 8, + lgetxattr = 9, + fgetxattr = 10, + listxattr = 11, + llistxattr = 12, + flistxattr = 13, + removexattr = 14, + lremovexattr = 15, + fremovexattr = 16, + getcwd = 17, + lookup_dcookie = 18, + eventfd2 = 19, + epoll_create1 = 20, + epoll_ctl = 21, + epoll_pwait = 22, + dup = 23, + dup3 = 24, + fcntl = 25, + inotify_init1 = 26, + inotify_add_watch = 27, + inotify_rm_watch = 28, + ioctl = 29, + ioprio_set = 30, + ioprio_get = 31, + flock = 32, + mknodat = 33, + mkdirat = 34, + unlinkat = 35, + symlinkat = 36, + linkat = 37, + renameat = 38, + umount2 = 39, + mount = 40, + pivot_root = 41, + nfsservctl = 42, + statfs = 43, + fstatfs = 44, + truncate = 45, + ftruncate = 46, + fallocate = 47, + faccessat = 48, + chdir = 49, + fchdir = 50, + chroot = 51, + fchmod = 52, + fchmodat = 53, + fchownat = 54, + fchown = 55, + openat = 56, + close = 57, + vhangup = 58, + pipe2 = 59, + quotactl = 60, + getdents64 = 61, + lseek = 62, + read = 63, + write = 64, + readv = 65, + writev = 66, + pread64 = 67, + pwrite64 = 68, + preadv = 69, + pwritev = 70, + sendfile = 71, + pselect6 = 72, + ppoll = 73, + signalfd4 = 74, + vmsplice = 75, + splice = 76, + tee = 77, + readlinkat = 78, + fstatat = 79, + fstat = 80, + sync = 81, + fsync = 82, + fdatasync = 83, + sync_file_range = 84, + timerfd_create = 85, + timerfd_settime = 86, + timerfd_gettime = 87, + utimensat = 88, + acct = 89, + capget = 90, + capset = 91, + personality = 92, + exit = 93, + exit_group = 94, + waitid = 95, + set_tid_address = 96, + unshare = 97, + futex = 98, + set_robust_list = 99, + get_robust_list = 100, + nanosleep = 101, + getitimer = 102, + setitimer = 103, + kexec_load = 104, + init_module = 105, + delete_module = 106, + timer_create = 107, + timer_gettime = 108, + timer_getoverrun = 109, + timer_settime = 110, + timer_delete = 111, + clock_settime = 112, + clock_gettime = 113, + clock_getres = 114, + clock_nanosleep = 115, + syslog = 116, + ptrace = 117, + sched_setparam = 118, + sched_setscheduler = 119, + sched_getscheduler = 120, + sched_getparam = 121, + sched_setaffinity = 122, + sched_getaffinity = 123, + sched_yield = 124, + sched_get_priority_max = 125, + sched_get_priority_min = 126, + sched_rr_get_interval = 127, + restart_syscall = 128, + kill = 129, + tkill = 130, + tgkill = 131, + sigaltstack = 132, + rt_sigsuspend = 133, + rt_sigaction = 134, + rt_sigprocmask = 135, + rt_sigpending = 136, + rt_sigtimedwait = 137, + rt_sigqueueinfo = 138, + rt_sigreturn = 139, + setpriority = 140, + getpriority = 141, + reboot = 142, + setregid = 143, + setgid = 144, + setreuid = 145, + setuid = 146, + setresuid = 147, + getresuid = 148, + setresgid = 149, + getresgid = 150, + setfsuid = 151, + setfsgid = 152, + times = 153, + setpgid = 154, + getpgid = 155, + getsid = 156, + setsid = 157, + getgroups = 158, + setgroups = 159, + uname = 160, + sethostname = 161, + setdomainname = 162, + getrlimit = 163, + setrlimit = 164, + getrusage = 165, + umask = 166, + prctl = 167, + getcpu = 168, + gettimeofday = 169, + settimeofday = 170, + adjtimex = 171, + getpid = 172, + getppid = 173, + getuid = 174, + geteuid = 175, + getgid = 176, + getegid = 177, + gettid = 178, + sysinfo = 179, + mq_open = 180, + mq_unlink = 181, + mq_timedsend = 182, + mq_timedreceive = 183, + mq_notify = 184, + mq_getsetattr = 185, + msgget = 186, + msgctl = 187, + msgrcv = 188, + msgsnd = 189, + semget = 190, + semctl = 191, + semtimedop = 192, + semop = 193, + shmget = 194, + shmctl = 195, + shmat = 196, + shmdt = 197, + socket = 198, + socketpair = 199, + bind = 200, + listen = 201, + accept = 202, + connect = 203, + getsockname = 204, + getpeername = 205, + sendto = 206, + recvfrom = 207, + setsockopt = 208, + getsockopt = 209, + shutdown = 210, + sendmsg = 211, + recvmsg = 212, + readahead = 213, + brk = 214, + munmap = 215, + mremap = 216, + add_key = 217, + request_key = 218, + keyctl = 219, + clone = 220, + execve = 221, + mmap = 222, + fadvise64 = 223, + swapon = 224, + swapoff = 225, + mprotect = 226, + msync = 227, + mlock = 228, + munlock = 229, + mlockall = 230, + munlockall = 231, + mincore = 232, + madvise = 233, + remap_file_pages = 234, + mbind = 235, + get_mempolicy = 236, + set_mempolicy = 237, + migrate_pages = 238, + move_pages = 239, + rt_tgsigqueueinfo = 240, + perf_event_open = 241, + accept4 = 242, + recvmmsg = 243, + wait4 = 260, + prlimit64 = 261, + fanotify_init = 262, + fanotify_mark = 263, + name_to_handle_at = 264, + open_by_handle_at = 265, + clock_adjtime = 266, + syncfs = 267, + setns = 268, + sendmmsg = 269, + process_vm_readv = 270, + process_vm_writev = 271, + kcmp = 272, + finit_module = 273, + sched_setattr = 274, + sched_getattr = 275, + renameat2 = 276, + seccomp = 277, + getrandom = 278, + memfd_create = 279, + bpf = 280, + execveat = 281, + userfaultfd = 282, + membarrier = 283, + mlock2 = 284, + copy_file_range = 285, + preadv2 = 286, + pwritev2 = 287, + pkey_mprotect = 288, + pkey_alloc = 289, + pkey_free = 290, + statx = 291, + io_pgetevents = 292, + rseq = 293, + kexec_file_load = 294, + pidfd_send_signal = 424, + io_uring_setup = 425, + io_uring_enter = 426, + io_uring_register = 427, + open_tree = 428, + move_mount = 429, + fsopen = 430, + fsconfig = 431, + fsmount = 432, + fspick = 433, + pidfd_open = 434, + clone3 = 435, + close_range = 436, + openat2 = 437, + pidfd_getfd = 438, + faccessat2 = 439, + process_madvise = 440, + epoll_pwait2 = 441, + mount_setattr = 442, + quotactl_fd = 443, + landlock_create_ruleset = 444, + landlock_add_rule = 445, + landlock_restrict_self = 446, + memfd_secret = 447, + process_mrelease = 448, + futex_waitv = 449, + set_mempolicy_home_node = 450, +}; + +pub const RiscV64 = enum(usize) { + pub const arch_specific_syscall = 244; + + io_setup = 0, + io_destroy = 1, + io_submit = 2, + io_cancel = 3, + io_getevents = 4, + setxattr = 5, + lsetxattr = 6, + fsetxattr = 7, + getxattr = 8, + lgetxattr = 9, + fgetxattr = 10, + listxattr = 11, + llistxattr = 12, + flistxattr = 13, + removexattr = 14, + lremovexattr = 15, + fremovexattr = 16, + getcwd = 17, + lookup_dcookie = 18, + eventfd2 = 19, + epoll_create1 = 20, + epoll_ctl = 21, + epoll_pwait = 22, + dup = 23, + dup3 = 24, + fcntl = 25, + inotify_init1 = 26, + inotify_add_watch = 27, + inotify_rm_watch = 28, + ioctl = 29, + ioprio_set = 30, + ioprio_get = 31, + flock = 32, + mknodat = 33, + mkdirat = 34, + unlinkat = 35, + symlinkat = 36, + linkat = 37, + umount2 = 39, + mount = 40, + pivot_root = 41, + nfsservctl = 42, + statfs = 43, + fstatfs = 44, + truncate = 45, + ftruncate = 46, + fallocate = 47, + faccessat = 48, + chdir = 49, + fchdir = 50, + chroot = 51, + fchmod = 52, + fchmodat = 53, + fchownat = 54, + fchown = 55, + openat = 56, + close = 57, + vhangup = 58, + pipe2 = 59, + quotactl = 60, + getdents64 = 61, + lseek = 62, + read = 63, + write = 64, + readv = 65, + writev = 66, + pread64 = 67, + pwrite64 = 68, + preadv = 69, + pwritev = 70, + sendfile = 71, + pselect6 = 72, + ppoll = 73, + signalfd4 = 74, + vmsplice = 75, + splice = 76, + tee = 77, + readlinkat = 78, + fstatat = 79, + fstat = 80, + sync = 81, + fsync = 82, + fdatasync = 83, + sync_file_range = 84, + timerfd_create = 85, + timerfd_settime = 86, + timerfd_gettime = 87, + utimensat = 88, + acct = 89, + capget = 90, + capset = 91, + personality = 92, + exit = 93, + exit_group = 94, + waitid = 95, + set_tid_address = 96, + unshare = 97, + futex = 98, + set_robust_list = 99, + get_robust_list = 100, + nanosleep = 101, + getitimer = 102, + setitimer = 103, + kexec_load = 104, + init_module = 105, + delete_module = 106, + timer_create = 107, + timer_gettime = 108, + timer_getoverrun = 109, + timer_settime = 110, + timer_delete = 111, + clock_settime = 112, + clock_gettime = 113, + clock_getres = 114, + clock_nanosleep = 115, + syslog = 116, + ptrace = 117, + sched_setparam = 118, + sched_setscheduler = 119, + sched_getscheduler = 120, + sched_getparam = 121, + sched_setaffinity = 122, + sched_getaffinity = 123, + sched_yield = 124, + sched_get_priority_max = 125, + sched_get_priority_min = 126, + sched_rr_get_interval = 127, + restart_syscall = 128, + kill = 129, + tkill = 130, + tgkill = 131, + sigaltstack = 132, + rt_sigsuspend = 133, + rt_sigaction = 134, + rt_sigprocmask = 135, + rt_sigpending = 136, + rt_sigtimedwait = 137, + rt_sigqueueinfo = 138, + rt_sigreturn = 139, + setpriority = 140, + getpriority = 141, + reboot = 142, + setregid = 143, + setgid = 144, + setreuid = 145, + setuid = 146, + setresuid = 147, + getresuid = 148, + setresgid = 149, + getresgid = 150, + setfsuid = 151, + setfsgid = 152, + times = 153, + setpgid = 154, + getpgid = 155, + getsid = 156, + setsid = 157, + getgroups = 158, + setgroups = 159, + uname = 160, + sethostname = 161, + setdomainname = 162, + getrlimit = 163, + setrlimit = 164, + getrusage = 165, + umask = 166, + prctl = 167, + getcpu = 168, + gettimeofday = 169, + settimeofday = 170, + adjtimex = 171, + getpid = 172, + getppid = 173, + getuid = 174, + geteuid = 175, + getgid = 176, + getegid = 177, + gettid = 178, + sysinfo = 179, + mq_open = 180, + mq_unlink = 181, + mq_timedsend = 182, + mq_timedreceive = 183, + mq_notify = 184, + mq_getsetattr = 185, + msgget = 186, + msgctl = 187, + msgrcv = 188, + msgsnd = 189, + semget = 190, + semctl = 191, + semtimedop = 192, + semop = 193, + shmget = 194, + shmctl = 195, + shmat = 196, + shmdt = 197, + socket = 198, + socketpair = 199, + bind = 200, + listen = 201, + accept = 202, + connect = 203, + getsockname = 204, + getpeername = 205, + sendto = 206, + recvfrom = 207, + setsockopt = 208, + getsockopt = 209, + shutdown = 210, + sendmsg = 211, + recvmsg = 212, + readahead = 213, + brk = 214, + munmap = 215, + mremap = 216, + add_key = 217, + request_key = 218, + keyctl = 219, + clone = 220, + execve = 221, + mmap = 222, + fadvise64 = 223, + swapon = 224, + swapoff = 225, + mprotect = 226, + msync = 227, + mlock = 228, + munlock = 229, + mlockall = 230, + munlockall = 231, + mincore = 232, + madvise = 233, + remap_file_pages = 234, + mbind = 235, + get_mempolicy = 236, + set_mempolicy = 237, + migrate_pages = 238, + move_pages = 239, + rt_tgsigqueueinfo = 240, + perf_event_open = 241, + accept4 = 242, + recvmmsg = 243, + wait4 = 260, + prlimit64 = 261, + fanotify_init = 262, + fanotify_mark = 263, + name_to_handle_at = 264, + open_by_handle_at = 265, + clock_adjtime = 266, + syncfs = 267, + setns = 268, + sendmmsg = 269, + process_vm_readv = 270, + process_vm_writev = 271, + kcmp = 272, + finit_module = 273, + sched_setattr = 274, + sched_getattr = 275, + renameat2 = 276, + seccomp = 277, + getrandom = 278, + memfd_create = 279, + bpf = 280, + execveat = 281, + userfaultfd = 282, + membarrier = 283, + mlock2 = 284, + copy_file_range = 285, + preadv2 = 286, + pwritev2 = 287, + pkey_mprotect = 288, + pkey_alloc = 289, + pkey_free = 290, + statx = 291, + io_pgetevents = 292, + rseq = 293, + kexec_file_load = 294, + pidfd_send_signal = 424, + io_uring_setup = 425, + io_uring_enter = 426, + io_uring_register = 427, + open_tree = 428, + move_mount = 429, + fsopen = 430, + fsconfig = 431, + fsmount = 432, + fspick = 433, + pidfd_open = 434, + clone3 = 435, + close_range = 436, + openat2 = 437, + pidfd_getfd = 438, + faccessat2 = 439, + process_madvise = 440, + epoll_pwait2 = 441, + mount_setattr = 442, + quotactl_fd = 443, + landlock_create_ruleset = 444, + landlock_add_rule = 445, + landlock_restrict_self = 446, + process_mrelease = 448, + futex_waitv = 449, + set_mempolicy_home_node = 450, + + riscv_flush_icache = arch_specific_syscall + 15, +}; diff --git a/lib/std/os/linux/tls.zig b/lib/std/os/linux/tls.zig index 770ab9b92c..d91f7d7a9e 100644 --- a/lib/std/os/linux/tls.zig +++ b/lib/std/os/linux/tls.zig @@ -49,7 +49,7 @@ const TLSVariant = enum { const tls_variant = switch (native_arch) { .arm, .armeb, .thumb, .aarch64, .aarch64_be, .riscv32, .riscv64, .mips, .mipsel, .powerpc, .powerpc64, .powerpc64le => TLSVariant.VariantI, - .x86_64, .i386, .sparcv9 => TLSVariant.VariantII, + .x86_64, .i386, .sparc64 => TLSVariant.VariantII, else => @compileError("undefined tls_variant for this architecture"), }; @@ -174,7 +174,7 @@ pub fn setThreadPointer(addr: usize) void { : [addr] "r" (addr), ); }, - .sparcv9 => { + .sparc64 => { asm volatile ( \\ mov %[addr], %%g7 : diff --git a/lib/std/os/linux/x86_64.zig b/lib/std/os/linux/x86_64.zig index 0aaa28262c..3653c31584 100644 --- a/lib/std/os/linux/x86_64.zig +++ b/lib/std/os/linux/x86_64.zig @@ -1,6 +1,7 @@ const std = @import("../../std.zig"); const maxInt = std.math.maxInt; const linux = std.os.linux; +const SYS = linux.SYS; const iovec = std.os.iovec; const iovec_const = std.os.iovec_const; @@ -100,7 +101,12 @@ pub fn syscall6( } /// This matches the libc clone function. -pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags: usize, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; +pub extern fn clone(func: CloneFn, stack: usize, flags: usize, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; + +const CloneFn = switch (@import("builtin").zig_backend) { + .stage1 => fn (arg: usize) callconv(.C) u8, + else => *const fn (arg: usize) callconv(.C) u8, +}; pub const restore = restore_rt; @@ -118,369 +124,6 @@ pub const nlink_t = usize; pub const blksize_t = isize; pub const blkcnt_t = isize; -pub const SYS = enum(usize) { - read = 0, - write = 1, - open = 2, - close = 3, - stat = 4, - fstat = 5, - lstat = 6, - poll = 7, - lseek = 8, - mmap = 9, - mprotect = 10, - munmap = 11, - brk = 12, - rt_sigaction = 13, - rt_sigprocmask = 14, - rt_sigreturn = 15, - ioctl = 16, - pread = 17, - pwrite = 18, - readv = 19, - writev = 20, - access = 21, - pipe = 22, - select = 23, - sched_yield = 24, - mremap = 25, - msync = 26, - mincore = 27, - madvise = 28, - shmget = 29, - shmat = 30, - shmctl = 31, - dup = 32, - dup2 = 33, - pause = 34, - nanosleep = 35, - getitimer = 36, - alarm = 37, - setitimer = 38, - getpid = 39, - sendfile = 40, - socket = 41, - connect = 42, - accept = 43, - sendto = 44, - recvfrom = 45, - sendmsg = 46, - recvmsg = 47, - shutdown = 48, - bind = 49, - listen = 50, - getsockname = 51, - getpeername = 52, - socketpair = 53, - setsockopt = 54, - getsockopt = 55, - clone = 56, - fork = 57, - vfork = 58, - execve = 59, - exit = 60, - wait4 = 61, - kill = 62, - uname = 63, - semget = 64, - semop = 65, - semctl = 66, - shmdt = 67, - msgget = 68, - msgsnd = 69, - msgrcv = 70, - msgctl = 71, - fcntl = 72, - flock = 73, - fsync = 74, - fdatasync = 75, - truncate = 76, - ftruncate = 77, - getdents = 78, - getcwd = 79, - chdir = 80, - fchdir = 81, - rename = 82, - mkdir = 83, - rmdir = 84, - creat = 85, - link = 86, - unlink = 87, - symlink = 88, - readlink = 89, - chmod = 90, - fchmod = 91, - chown = 92, - fchown = 93, - lchown = 94, - umask = 95, - gettimeofday = 96, - getrlimit = 97, - getrusage = 98, - sysinfo = 99, - times = 100, - ptrace = 101, - getuid = 102, - syslog = 103, - getgid = 104, - setuid = 105, - setgid = 106, - geteuid = 107, - getegid = 108, - setpgid = 109, - getppid = 110, - getpgrp = 111, - setsid = 112, - setreuid = 113, - setregid = 114, - getgroups = 115, - setgroups = 116, - setresuid = 117, - getresuid = 118, - setresgid = 119, - getresgid = 120, - getpgid = 121, - setfsuid = 122, - setfsgid = 123, - getsid = 124, - capget = 125, - capset = 126, - rt_sigpending = 127, - rt_sigtimedwait = 128, - rt_sigqueueinfo = 129, - rt_sigsuspend = 130, - sigaltstack = 131, - utime = 132, - mknod = 133, - uselib = 134, - personality = 135, - ustat = 136, - statfs = 137, - fstatfs = 138, - sysfs = 139, - getpriority = 140, - setpriority = 141, - sched_setparam = 142, - sched_getparam = 143, - sched_setscheduler = 144, - sched_getscheduler = 145, - sched_get_priority_max = 146, - sched_get_priority_min = 147, - sched_rr_get_interval = 148, - mlock = 149, - munlock = 150, - mlockall = 151, - munlockall = 152, - vhangup = 153, - modify_ldt = 154, - pivot_root = 155, - _sysctl = 156, - prctl = 157, - arch_prctl = 158, - adjtimex = 159, - setrlimit = 160, - chroot = 161, - sync = 162, - acct = 163, - settimeofday = 164, - mount = 165, - umount2 = 166, - swapon = 167, - swapoff = 168, - reboot = 169, - sethostname = 170, - setdomainname = 171, - iopl = 172, - ioperm = 173, - create_module = 174, - init_module = 175, - delete_module = 176, - get_kernel_syms = 177, - query_module = 178, - quotactl = 179, - nfsservctl = 180, - getpmsg = 181, - putpmsg = 182, - afs_syscall = 183, - tuxcall = 184, - security = 185, - gettid = 186, - readahead = 187, - setxattr = 188, - lsetxattr = 189, - fsetxattr = 190, - getxattr = 191, - lgetxattr = 192, - fgetxattr = 193, - listxattr = 194, - llistxattr = 195, - flistxattr = 196, - removexattr = 197, - lremovexattr = 198, - fremovexattr = 199, - tkill = 200, - time = 201, - futex = 202, - sched_setaffinity = 203, - sched_getaffinity = 204, - set_thread_area = 205, - io_setup = 206, - io_destroy = 207, - io_getevents = 208, - io_submit = 209, - io_cancel = 210, - get_thread_area = 211, - lookup_dcookie = 212, - epoll_create = 213, - epoll_ctl_old = 214, - epoll_wait_old = 215, - remap_file_pages = 216, - getdents64 = 217, - set_tid_address = 218, - restart_syscall = 219, - semtimedop = 220, - fadvise64 = 221, - timer_create = 222, - timer_settime = 223, - timer_gettime = 224, - timer_getoverrun = 225, - timer_delete = 226, - clock_settime = 227, - clock_gettime = 228, - clock_getres = 229, - clock_nanosleep = 230, - exit_group = 231, - epoll_wait = 232, - epoll_ctl = 233, - tgkill = 234, - utimes = 235, - vserver = 236, - mbind = 237, - set_mempolicy = 238, - get_mempolicy = 239, - mq_open = 240, - mq_unlink = 241, - mq_timedsend = 242, - mq_timedreceive = 243, - mq_notify = 244, - mq_getsetattr = 245, - kexec_load = 246, - waitid = 247, - add_key = 248, - request_key = 249, - keyctl = 250, - ioprio_set = 251, - ioprio_get = 252, - inotify_init = 253, - inotify_add_watch = 254, - inotify_rm_watch = 255, - migrate_pages = 256, - openat = 257, - mkdirat = 258, - mknodat = 259, - fchownat = 260, - futimesat = 261, - fstatat = 262, - unlinkat = 263, - renameat = 264, - linkat = 265, - symlinkat = 266, - readlinkat = 267, - fchmodat = 268, - faccessat = 269, - pselect6 = 270, - ppoll = 271, - unshare = 272, - set_robust_list = 273, - get_robust_list = 274, - splice = 275, - tee = 276, - sync_file_range = 277, - vmsplice = 278, - move_pages = 279, - utimensat = 280, - epoll_pwait = 281, - signalfd = 282, - timerfd_create = 283, - eventfd = 284, - fallocate = 285, - timerfd_settime = 286, - timerfd_gettime = 287, - accept4 = 288, - signalfd4 = 289, - eventfd2 = 290, - epoll_create1 = 291, - dup3 = 292, - pipe2 = 293, - inotify_init1 = 294, - preadv = 295, - pwritev = 296, - rt_tgsigqueueinfo = 297, - perf_event_open = 298, - recvmmsg = 299, - fanotify_init = 300, - fanotify_mark = 301, - prlimit64 = 302, - name_to_handle_at = 303, - open_by_handle_at = 304, - clock_adjtime = 305, - syncfs = 306, - sendmmsg = 307, - setns = 308, - getcpu = 309, - process_vm_readv = 310, - process_vm_writev = 311, - kcmp = 312, - finit_module = 313, - sched_setattr = 314, - sched_getattr = 315, - renameat2 = 316, - seccomp = 317, - getrandom = 318, - memfd_create = 319, - kexec_file_load = 320, - bpf = 321, - execveat = 322, - userfaultfd = 323, - membarrier = 324, - mlock2 = 325, - copy_file_range = 326, - preadv2 = 327, - pwritev2 = 328, - pkey_mprotect = 329, - pkey_alloc = 330, - pkey_free = 331, - statx = 332, - io_pgetevents = 333, - rseq = 334, - pidfd_send_signal = 424, - io_uring_setup = 425, - io_uring_enter = 426, - io_uring_register = 427, - open_tree = 428, - move_mount = 429, - fsopen = 430, - fsconfig = 431, - fsmount = 432, - fspick = 433, - pidfd_open = 434, - clone3 = 435, - close_range = 436, - openat2 = 437, - pidfd_getfd = 438, - faccessat2 = 439, - process_madvise = 440, - epoll_pwait2 = 441, - mount_setattr = 442, - landlock_create_ruleset = 444, - landlock_add_rule = 445, - landlock_restrict_self = 446, - memfd_secret = 447, - - _, -}; - pub const O = struct { pub const CREAT = 0o100; pub const EXCL = 0o200; @@ -613,10 +256,10 @@ pub const msghdr = extern struct { pub const msghdr_const = extern struct { name: ?*const sockaddr, namelen: socklen_t, - iov: [*]iovec_const, + iov: [*]const iovec_const, iovlen: i32, __pad1: i32 = 0, - control: ?*anyopaque, + control: ?*const anyopaque, controllen: socklen_t, __pad2: socklen_t = 0, flags: i32, @@ -736,7 +379,7 @@ pub const mcontext_t = extern struct { pub const ucontext_t = extern struct { flags: usize, - link: *ucontext_t, + link: ?*ucontext_t, stack: stack_t, mcontext: mcontext_t, sigmask: sigset_t, |
