aboutsummaryrefslogtreecommitdiff
path: root/lib/std/os/linux
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-07-01 15:52:54 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-07-01 15:52:54 -0700
commitc89dd15e1be4959800dc7092d7dd4375253db7bc (patch)
treeca184ae53592efa21e67128a5f891d642d7f1118 /lib/std/os/linux
parent5466e87fce581f2ef90ac23bb80b1dbc05836fc6 (diff)
parent2360f8c490f3ec684ed64ff28e8c1fade249070b (diff)
downloadzig-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.zig457
-rw-r--r--lib/std/os/linux/arm64.zig357
-rw-r--r--lib/std/os/linux/i386.zig459
-rw-r--r--lib/std/os/linux/io_uring.zig1059
-rw-r--r--lib/std/os/linux/ioctl.zig2
-rw-r--r--lib/std/os/linux/mips.zig470
-rw-r--r--lib/std/os/linux/powerpc.zig482
-rw-r--r--lib/std/os/linux/powerpc64.zig456
-rw-r--r--lib/std/os/linux/riscv64.zig357
-rw-r--r--lib/std/os/linux/seccomp.zig212
-rw-r--r--lib/std/os/linux/sparc64.zig436
-rw-r--r--lib/std/os/linux/syscalls.zig3493
-rw-r--r--lib/std/os/linux/tls.zig4
-rw-r--r--lib/std/os/linux/x86_64.zig377
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, &params);
}
- /// 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,