diff --git a/README.md b/README.md index 797dabe..484001e 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,9 @@ A very cool language ## Features * Clean indentation-based syntax * Compiles to x86_64 Assembly -* ~~No libc required~~ (SOON; still used for memory allocation and DNS resolution) +* Pretty big [standard library](https://github.com/antpiasecki/zern/tree/main/src/std) * Produces tiny static executables (~30KB with musl) +* ~~No libc required~~ (SOON; still used for memory allocation and DNS resolution) * Sometimes works * Has the pipe operator diff --git a/src/main.rs b/src/main.rs index 895c10b..c065d0b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -64,6 +64,11 @@ fn compile_file(args: Args) -> Result<(), ZernError> { let mut analyzer = analyzer::Analyzer::new(); let mut codegen = codegen_x86_64::CodegenX86_64::new(&mut analyzer); codegen.emit_prologue()?; + compile_file_to( + &mut codegen, + "syscalls.zr", + include_str!("std/syscalls.zr").into(), + )?; compile_file_to(&mut codegen, "std.zr", include_str!("std/std.zr").into())?; compile_file_to( &mut codegen, diff --git a/src/std/crypto.zr b/src/std/crypto.zr index eac302d..6f4982d 100644 --- a/src/std/crypto.zr +++ b/src/std/crypto.zr @@ -23,6 +23,7 @@ func crypto.blake2b._G[v: ptr, a: i64, b: i64, c: i64, d: i64, x: i64, y: i64] : func crypto.blake2b._compress[h: ptr, block: ptr, t0: i64, t1: i64, last: i64, iv: array] : void let v: ptr = mem.alloc(16 * 8) let m: ptr = mem.alloc(16 * 8) + // https://crypto.stackexchange.com/questions/108987/rationale-for-blake2-message-schedule let sigma: array = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3,11,8,12,0,5,2,15,13,10,14,3,6,7,1,9,4,7,9,3,1,13,12,11,14,2,6,5,10,4,0,15,8,9,0,5,7,2,4,10,15,14,1,11,12,6,8,3,13,2,12,6,10,0,11,8,3,4,13,7,5,15,14,1,9,12,5,1,15,14,13,4,10,0,7,6,3,9,2,8,11,13,11,7,14,12,1,3,9,5,0,15,4,8,6,2,10,6,15,14,9,11,3,0,8,12,2,13,7,1,4,10,5,10,2,8,4,7,6,1,5,15,11,9,14,3,12,13,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3] for j in 0..8 @@ -35,9 +36,9 @@ func crypto.blake2b._compress[h: ptr, block: ptr, t0: i64, t1: i64, last: i64, i mem.write64(v + 14 * 8, mem.read64(v + 14 * 8) ^ 0xffffffffffffffff) for j in 0..16 - let w: i64 = 0 + let w = 0 for k in 0..8 - w = w | ((mem.read8(block + j*8 + k) & 0xff) << (8 * k)) + w = w | ((block[j * 8 + k] & 0xff) << (8 * k)) mem.write64(m + j * 8, w) for r in 0..12 @@ -63,13 +64,17 @@ func crypto.blake2b.hash[outlen: i64, key: ptr, keylen: i64, input: ptr, inputle dbg.panic("invalid length passed to crypto.blake2b.hash") let out: ptr = mem.alloc(outlen) + // IV[i] = floor(2**w * frac(sqrt(prime(i+1)))), where prime(i) + // is the i:th prime number ( 2, 3, 5, 7, 11, 13, 17, 19 ) + // and sqrt(x) is the square root of x. + // https://www.ietf.org/rfc/rfc7693#section-2.6 let iv: array = [0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179] let h: ptr = mem.alloc(8 * 8) - let t0: i64 = 0 - let t1: i64 = 0 - let b: ptr = mem.alloc(128) - let c: i64 = 0 + let t0 = 0 + let t1 = 0 + let block: ptr = mem.alloc(128) + let c = 0 for i in 0..8 mem.write64(h + i * 8, array.nth(iv, i)) @@ -78,9 +83,9 @@ func crypto.blake2b.hash[outlen: i64, key: ptr, keylen: i64, input: ptr, inputle if keylen > 0 for i in 0..keylen - mem.write8(b + i, key[i]) + mem.write8(block + i, key[i]) for i in (keylen)..128 - mem.write8(b + i, 0) + mem.write8(block + i, 0) c = 128 else c = 0 @@ -90,9 +95,9 @@ func crypto.blake2b.hash[outlen: i64, key: ptr, keylen: i64, input: ptr, inputle t0 = t0 + c if t0 < c t1 = t1 + 1 - crypto.blake2b._compress(h, b, t0, t1, 0, iv) + crypto.blake2b._compress(h, block, t0, t1, 0, iv) c = 0 - mem.write8(b + c, input[i]) + mem.write8(block + c, input[i]) c = c + 1 t0 = t0 + c @@ -101,14 +106,14 @@ func crypto.blake2b.hash[outlen: i64, key: ptr, keylen: i64, input: ptr, inputle if c < 128 for i in (c)..128 - mem.write8(b + i, 0) - crypto.blake2b._compress(h, b, t0, t1, 1, iv) + mem.write8(block + i, 0) + crypto.blake2b._compress(h, block, t0, t1, 1, iv) for i in 0..outlen mem.write8(out + i, ((mem.read64(h + (i >> 3) * 8) >> (8 * (i & 7))) & 0xff)) mem.free(h) - mem.free(b) + mem.free(block) array.free(iv) return out @@ -207,13 +212,13 @@ func crypto.xchacha20._stream[key: ptr, nonce: ptr, out: ptr, len: i64] : void for i in 0..8 mem.write8(nonce12 + 4 + i, nonce[16 + i]) - let blocknum: i64 = 0 + let blocknum = 0 let remaining: i64 = len let block: ptr = mem.alloc(64) while remaining > 0 crypto.xchacha20._block(subkey, nonce12, blocknum, block) - let take: i64 = 64 + let take = 64 if remaining < 64 take = remaining for i in 0..take @@ -226,7 +231,9 @@ func crypto.xchacha20._stream[key: ptr, nonce: ptr, out: ptr, len: i64] : void func crypto.xchacha20.xor[key: ptr, nonce: ptr, input: ptr, len: i64] : ptr if len <= 0 - return dbg.panic("empty buffer passed to crypto.xchacha20.xor") + let out: ptr = mem.alloc(1) + mem.write8(out, 0) + return out let out: ptr = mem.alloc(len) let ks: ptr = mem.alloc(len) crypto.xchacha20._stream(key, nonce, ks, len) @@ -334,7 +341,7 @@ func crypto.x25519.scalarmult[scalar: ptr, point: ptr] : ptr let magic: ptr = mem.alloc(16 * 8) mem.zero(magic, 16 * 8) - mem.write64(magic, 0xdb41) // 121665 + mem.write64(magic, 0xdb41) // 0xdb41 = 121665 = (486662 + 2)/4 mem.write64(magic + 8, 1) // copy and clamp scalar diff --git a/src/std/std.zr b/src/std/std.zr index 46748df..2fd7c8c 100644 --- a/src/std/std.zr +++ b/src/std/std.zr @@ -44,7 +44,7 @@ func mem.write64[x: ptr, d: i64] : void _builtin_set64(x, d) func io.print_sized[x: str, size: i64] : void - _builtin_syscall(1, 1, x, size) // write + _builtin_syscall(SYS_write, 1, x, size) func io.print[x: str] : void io.print_sized(x, str.len(x)) @@ -68,39 +68,39 @@ func io.println_i64[x: i64] : void func io.read_char[] : u8 let c: u8 = 0 - _builtin_syscall(0, 0, ^c, 1) // read + _builtin_syscall(SYS_read, 0, ^c, 1) return c func io.read_line[]: str let MAX_SIZE = 60000 let buffer: str = mem.alloc(MAX_SIZE + 1) - let n: i64 = _builtin_syscall(0, 0, buffer, MAX_SIZE) // read + let n: i64 = _builtin_syscall(SYS_read, 0, buffer, MAX_SIZE) if n < 0 return "" str.set(buffer, n, 0) return buffer func io.read_file[path: str]: str - let fd: i64 = _builtin_syscall(257, -100, path, 0, 0) // openat + let fd: i64 = _builtin_syscall(SYS_openat, -100, path, 0, 0) if fd <= 0 dbg.panic("failed to open file") - let size: i64 = _builtin_syscall(8, fd, 0, 2) // lseek to the end - _builtin_syscall(8, fd, 0, 0) // lseek back to start + let size: i64 = _builtin_syscall(SYS_lseek, fd, 0, 2) + _builtin_syscall(SYS_lseek, fd, 0, 0) let buffer: str = mem.alloc(size + 1) - let n: i64 = _builtin_syscall(0, fd, buffer, size) // read + let n: i64 = _builtin_syscall(SYS_read, fd, buffer, size) str.set(buffer, n, 0) - _builtin_syscall(3, fd) // close + _builtin_syscall(SYS_close, fd) return buffer func io.write_file[path: str, content: str] : void - let fd: ptr = _builtin_syscall(257, -100, path, 0x241, 0o644) // openat + let fd: ptr = _builtin_syscall(SYS_openat, -100, path, 0x241, 0o644) if fd < 0 dbg.panic("failed to open file") - _builtin_syscall(1, fd, content, str.len(content)) // write - _builtin_syscall(3, fd) // close + _builtin_syscall(SYS_write, fd, content, str.len(content)) + _builtin_syscall(SYS_close, fd) func str.len[s: str] : i64 let i = 0 @@ -513,13 +513,13 @@ func alg.reduce[arr: array, fn: ptr, acc: i64] : i64 return acc func os.exit[code: i64] : void - _builtin_syscall(60, code) + _builtin_syscall(SYS_exit, code) func os.urandom[n: i64]: ptr let buffer: ptr = mem.alloc(n) - let fd: i64 = _builtin_syscall(257, -100, "/dev/urandom", 0, 0) // openat - _builtin_syscall(0, fd, buffer, n) // read - _builtin_syscall(3, fd) // close + let fd: i64 = _builtin_syscall(SYS_openat, -100, "/dev/urandom", 0, 0) + _builtin_syscall(SYS_read, fd, buffer, n) + _builtin_syscall(SYS_close, fd) return buffer func os.urandom_i64[]: i64 @@ -530,7 +530,7 @@ func os.urandom_i64[]: i64 func os.time[] : i64 let tv: ptr = mem.alloc(16) - _builtin_syscall(96, tv, 0) // gettimeofday + _builtin_syscall(SYS_gettimeofday, tv, 0) let seconds: i64 = mem.read64(tv) let microseconds: i64 = mem.read64(tv + 8) mem.free(tv) @@ -538,15 +538,15 @@ func os.time[] : i64 // voodoo magic func os.shell[command: str] : i64 - let pid: i64 = _builtin_syscall(57) // fork + let pid: i64 = _builtin_syscall(SYS_fork) if pid == 0 // leaky but not sure where can i free it let argv: array = ["sh", "-c", command, 0] - _builtin_syscall(59, "/bin/sh", mem.read64(argv), _builtin_environ()) // execve - _builtin_syscall(60, 1) // exit + _builtin_syscall(SYS_execve, "/bin/sh", mem.read64(argv), _builtin_environ()) + _builtin_syscall(SYS_exit, 1) else let status = 0 - let wp: i64 = _builtin_syscall(61, pid, ^status, 0, 0) // waitpid + let wp: i64 = _builtin_syscall(SYS_wait4, pid, ^status, 0, 0) if wp == -1 return -1 let st: i64 = status & 0xffffffff @@ -557,14 +557,14 @@ func os.shell[command: str] : i64 return -(st & 0x7f) func os.listdir[path: str] : array - let fd: i64 = _builtin_syscall(257, -100, path, 0, 0) // openat + let fd: i64 = _builtin_syscall(SYS_openat, -100, path, 0, 0) if fd < 0 return [] let files: array = [] let buf: ptr = mem.alloc(1024) while true - let n: i64 = _builtin_syscall(217, fd, buf, 1024) // getdents64 + let n: i64 = _builtin_syscall(SYS_getdents64, fd, buf, 1024) if n <= 0 break @@ -586,17 +586,18 @@ func os.listdir[path: str] : array pos = pos + len mem.free(buf) - _builtin_syscall(3, fd) // close + _builtin_syscall(SYS_close, fd) return files func net.listen[packed_host: i64, port: i64] : i64 - let s: i64 = _builtin_syscall(41, 2, 1, 0) // socket + let s: i64 = _builtin_syscall(SYS_socket, 2, 1, 0) if s < 0 return -1 + // setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) let optval = 1 - if _builtin_syscall(54, s, 1, 2, ^optval, 8) < 0 // setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) - _builtin_syscall(3, s) // close + if _builtin_syscall(SYS_setsockopt, s, 1, 2, ^optval, 8) < 0 + _builtin_syscall(SYS_close, s) return -1 let sa: ptr = mem.alloc(16) @@ -610,14 +611,14 @@ func net.listen[packed_host: i64, port: i64] : i64 mem.write8(sa + 6, (packed_host >> 8) & 255) mem.write8(sa + 7, packed_host & 255) - if _builtin_syscall(49, s, sa, 16) < 0 // bind - _builtin_syscall(3, s) // close + if _builtin_syscall(SYS_bind, s, sa, 16) < 0 + _builtin_syscall(SYS_close, s) mem.free(sa) return -1 mem.free(sa) - if _builtin_syscall(50, s, 1) < 0 // listen - _builtin_syscall(3, s) // close + if _builtin_syscall(SYS_listen, s, 1) < 0 + _builtin_syscall(SYS_close, s) return -1 return s @@ -629,7 +630,7 @@ func net.connect[host: str, port: i64] : i64 let ip_ptr: ptr = mem.read64(mem.read64(he + 24)) - let s: i64 = _builtin_syscall(41, 2, 1, 0) // socket + let s: i64 = _builtin_syscall(SYS_socket, 2, 1, 0) if s < 0 return -1 @@ -643,25 +644,25 @@ func net.connect[host: str, port: i64] : i64 mem.write8(sa + 6, ip_ptr[2]) mem.write8(sa + 7, ip_ptr[3]) - if _builtin_syscall(42, s, sa, 16) < 0 // connect + if _builtin_syscall(SYS_connect, s, sa, 16) < 0 mem.free(sa) - _builtin_syscall(3, s) // close + _builtin_syscall(SYS_close, s) return -1 mem.free(sa) return s func net.accept[s: i64] : i64 - return _builtin_syscall(43, s, 0, 0) + return _builtin_syscall(SYS_accept, s, 0, 0) func net.send[s: i64, data: str, size: i64] : void - _builtin_syscall(44, s, data, size, 0, 0, 0) + _builtin_syscall(SYS_sendto, s, data, size, 0, 0, 0) func net.read[s: i64, buffer: ptr, size: i64] : i64 - return _builtin_syscall(0, s, buffer, size) + return _builtin_syscall(SYS_read, s, buffer, size) func net.close[s: i64] : void - _builtin_syscall(3, s) + _builtin_syscall(SYS_close, s) func net.pack_addr[a: i64, b: i64, c: i64, d: i64] : i64 return (a << 24) | (b << 16) | (c << 8) | d \ No newline at end of file diff --git a/src/std/syscalls.zr b/src/std/syscalls.zr new file mode 100644 index 0000000..3d5c8b2 --- /dev/null +++ b/src/std/syscalls.zr @@ -0,0 +1,381 @@ +// https://github.com/torvalds/linux/blob/19272b37aa4f83ca52bdf9c16d5d81bdd1354494/arch/x86/entry/syscalls/syscall_64.tbl +const SYS_read = 0 +const SYS_write = 1 +const SYS_open = 2 +const SYS_close = 3 +const SYS_stat = 4 +const SYS_fstat = 5 +const SYS_lstat = 6 +const SYS_poll = 7 +const SYS_lseek = 8 +const SYS_mmap = 9 +const SYS_mprotect = 10 +const SYS_munmap = 11 +const SYS_brk = 12 +const SYS_rt_sigaction = 13 +const SYS_rt_sigprocmask = 14 +const SYS_rt_sigreturn = 15 +const SYS_ioctl = 16 +const SYS_pread64 = 17 +const SYS_pwrite64 = 18 +const SYS_readv = 19 +const SYS_writev = 20 +const SYS_access = 21 +const SYS_pipe = 22 +const SYS_select = 23 +const SYS_sched_yield = 24 +const SYS_mremap = 25 +const SYS_msync = 26 +const SYS_mincore = 27 +const SYS_madvise = 28 +const SYS_shmget = 29 +const SYS_shmat = 30 +const SYS_shmctl = 31 +const SYS_dup = 32 +const SYS_dup2 = 33 +const SYS_pause = 34 +const SYS_nanosleep = 35 +const SYS_getitimer = 36 +const SYS_alarm = 37 +const SYS_setitimer = 38 +const SYS_getpid = 39 +const SYS_sendfile = 40 +const SYS_socket = 41 +const SYS_connect = 42 +const SYS_accept = 43 +const SYS_sendto = 44 +const SYS_recvfrom = 45 +const SYS_sendmsg = 46 +const SYS_recvmsg = 47 +const SYS_shutdown = 48 +const SYS_bind = 49 +const SYS_listen = 50 +const SYS_getsockname = 51 +const SYS_getpeername = 52 +const SYS_socketpair = 53 +const SYS_setsockopt = 54 +const SYS_getsockopt = 55 +const SYS_clone = 56 +const SYS_fork = 57 +const SYS_vfork = 58 +const SYS_execve = 59 +const SYS_exit = 60 +const SYS_wait4 = 61 +const SYS_kill = 62 +const SYS_uname = 63 +const SYS_semget = 64 +const SYS_semop = 65 +const SYS_semctl = 66 +const SYS_shmdt = 67 +const SYS_msgget = 68 +const SYS_msgsnd = 69 +const SYS_msgrcv = 70 +const SYS_msgctl = 71 +const SYS_fcntl = 72 +const SYS_flock = 73 +const SYS_fsync = 74 +const SYS_fdatasync = 75 +const SYS_truncate = 76 +const SYS_ftruncate = 77 +const SYS_getdents = 78 +const SYS_getcwd = 79 +const SYS_chdir = 80 +const SYS_fchdir = 81 +const SYS_rename = 82 +const SYS_mkdir = 83 +const SYS_rmdir = 84 +const SYS_creat = 85 +const SYS_link = 86 +const SYS_unlink = 87 +const SYS_symlink = 88 +const SYS_readlink = 89 +const SYS_chmod = 90 +const SYS_fchmod = 91 +const SYS_chown = 92 +const SYS_fchown = 93 +const SYS_lchown = 94 +const SYS_umask = 95 +const SYS_gettimeofday = 96 +const SYS_getrlimit = 97 +const SYS_getrusage = 98 +const SYS_sysinfo = 99 +const SYS_times = 100 +const SYS_ptrace = 101 +const SYS_getuid = 102 +const SYS_syslog = 103 +const SYS_getgid = 104 +const SYS_setuid = 105 +const SYS_setgid = 106 +const SYS_geteuid = 107 +const SYS_getegid = 108 +const SYS_setpgid = 109 +const SYS_getppid = 110 +const SYS_getpgrp = 111 +const SYS_setsid = 112 +const SYS_setreuid = 113 +const SYS_setregid = 114 +const SYS_getgroups = 115 +const SYS_setgroups = 116 +const SYS_setresuid = 117 +const SYS_getresuid = 118 +const SYS_setresgid = 119 +const SYS_getresgid = 120 +const SYS_getpgid = 121 +const SYS_setfsuid = 122 +const SYS_setfsgid = 123 +const SYS_getsid = 124 +const SYS_capget = 125 +const SYS_capset = 126 +const SYS_rt_sigpending = 127 +const SYS_rt_sigtimedwait = 128 +const SYS_rt_sigqueueinfo = 129 +const SYS_rt_sigsuspend = 130 +const SYS_sigaltstack = 131 +const SYS_utime = 132 +const SYS_mknod = 133 +const SYS_uselib = 134 +const SYS_personality = 135 +const SYS_ustat = 136 +const SYS_statfs = 137 +const SYS_fstatfs = 138 +const SYS_sysfs = 139 +const SYS_getpriority = 140 +const SYS_setpriority = 141 +const SYS_sched_setparam = 142 +const SYS_sched_getparam = 143 +const SYS_sched_setscheduler = 144 +const SYS_sched_getscheduler = 145 +const SYS_sched_get_priority_max = 146 +const SYS_sched_get_priority_min = 147 +const SYS_sched_rr_get_interval = 148 +const SYS_mlock = 149 +const SYS_munlock = 150 +const SYS_mlockall = 151 +const SYS_munlockall = 152 +const SYS_vhangup = 153 +const SYS_modify_ldt = 154 +const SYS_pivot_root = 155 +const SYS__sysctl = 156 +const SYS_prctl = 157 +const SYS_arch_prctl = 158 +const SYS_adjtimex = 159 +const SYS_setrlimit = 160 +const SYS_chroot = 161 +const SYS_sync = 162 +const SYS_acct = 163 +const SYS_settimeofday = 164 +const SYS_mount = 165 +const SYS_umount2 = 166 +const SYS_swapon = 167 +const SYS_swapoff = 168 +const SYS_reboot = 169 +const SYS_sethostname = 170 +const SYS_setdomainname = 171 +const SYS_iopl = 172 +const SYS_ioperm = 173 +const SYS_create_module = 174 +const SYS_init_module = 175 +const SYS_delete_module = 176 +const SYS_get_kernel_syms = 177 +const SYS_query_module = 178 +const SYS_quotactl = 179 +const SYS_nfsservctl = 180 +const SYS_getpmsg = 181 +const SYS_putpmsg = 182 +const SYS_afs_syscall = 183 +const SYS_tuxcall = 184 +const SYS_security = 185 +const SYS_gettid = 186 +const SYS_readahead = 187 +const SYS_setxattr = 188 +const SYS_lsetxattr = 189 +const SYS_fsetxattr = 190 +const SYS_getxattr = 191 +const SYS_lgetxattr = 192 +const SYS_fgetxattr = 193 +const SYS_listxattr = 194 +const SYS_llistxattr = 195 +const SYS_flistxattr = 196 +const SYS_removexattr = 197 +const SYS_lremovexattr = 198 +const SYS_fremovexattr = 199 +const SYS_tkill = 200 +const SYS_time = 201 +const SYS_futex = 202 +const SYS_sched_setaffinity = 203 +const SYS_sched_getaffinity = 204 +const SYS_set_thread_area = 205 +const SYS_io_setup = 206 +const SYS_io_destroy = 207 +const SYS_io_getevents = 208 +const SYS_io_submit = 209 +const SYS_io_cancel = 210 +const SYS_get_thread_area = 211 +const SYS_lookup_dcookie = 212 +const SYS_epoll_create = 213 +const SYS_epoll_ctl_old = 214 +const SYS_epoll_wait_old = 215 +const SYS_remap_file_pages = 216 +const SYS_getdents64 = 217 +const SYS_set_tid_address = 218 +const SYS_restart_syscall = 219 +const SYS_semtimedop = 220 +const SYS_fadvise64 = 221 +const SYS_timer_create = 222 +const SYS_timer_settime = 223 +const SYS_timer_gettime = 224 +const SYS_timer_getoverrun = 225 +const SYS_timer_delete = 226 +const SYS_clock_settime = 227 +const SYS_clock_gettime = 228 +const SYS_clock_getres = 229 +const SYS_clock_nanosleep = 230 +const SYS_exit_group = 231 +const SYS_epoll_wait = 232 +const SYS_epoll_ctl = 233 +const SYS_tgkill = 234 +const SYS_utimes = 235 +const SYS_vserver = 236 +const SYS_mbind = 237 +const SYS_set_mempolicy = 238 +const SYS_get_mempolicy = 239 +const SYS_mq_open = 240 +const SYS_mq_unlink = 241 +const SYS_mq_timedsend = 242 +const SYS_mq_timedreceive = 243 +const SYS_mq_notify = 244 +const SYS_mq_getsetattr = 245 +const SYS_kexec_load = 246 +const SYS_waitid = 247 +const SYS_add_key = 248 +const SYS_request_key = 249 +const SYS_keyctl = 250 +const SYS_ioprio_set = 251 +const SYS_ioprio_get = 252 +const SYS_inotify_init = 253 +const SYS_inotify_add_watch = 254 +const SYS_inotify_rm_watch = 255 +const SYS_migrate_pages = 256 +const SYS_openat = 257 +const SYS_mkdirat = 258 +const SYS_mknodat = 259 +const SYS_fchownat = 260 +const SYS_futimesat = 261 +const SYS_newfstatat = 262 +const SYS_unlinkat = 263 +const SYS_renameat = 264 +const SYS_linkat = 265 +const SYS_symlinkat = 266 +const SYS_readlinkat = 267 +const SYS_fchmodat = 268 +const SYS_faccessat = 269 +const SYS_pselect6 = 270 +const SYS_ppoll = 271 +const SYS_unshare = 272 +const SYS_set_robust_list = 273 +const SYS_get_robust_list = 274 +const SYS_splice = 275 +const SYS_tee = 276 +const SYS_sync_file_range = 277 +const SYS_vmsplice = 278 +const SYS_move_pages = 279 +const SYS_utimensat = 280 +const SYS_epoll_pwait = 281 +const SYS_signalfd = 282 +const SYS_timerfd_create = 283 +const SYS_eventfd = 284 +const SYS_fallocate = 285 +const SYS_timerfd_settime = 286 +const SYS_timerfd_gettime = 287 +const SYS_accept4 = 288 +const SYS_signalfd4 = 289 +const SYS_eventfd2 = 290 +const SYS_epoll_create1 = 291 +const SYS_dup3 = 292 +const SYS_pipe2 = 293 +const SYS_inotify_init1 = 294 +const SYS_preadv = 295 +const SYS_pwritev = 296 +const SYS_rt_tgsigqueueinfo = 297 +const SYS_perf_event_open = 298 +const SYS_recvmmsg = 299 +const SYS_fanotify_init = 300 +const SYS_fanotify_mark = 301 +const SYS_prlimit64 = 302 +const SYS_name_to_handle_at = 303 +const SYS_open_by_handle_at = 304 +const SYS_clock_adjtime = 305 +const SYS_syncfs = 306 +const SYS_sendmmsg = 307 +const SYS_setns = 308 +const SYS_getcpu = 309 +const SYS_process_vm_readv = 310 +const SYS_process_vm_writev = 311 +const SYS_kcmp = 312 +const SYS_finit_module = 313 +const SYS_sched_setattr = 314 +const SYS_sched_getattr = 315 +const SYS_renameat2 = 316 +const SYS_seccomp = 317 +const SYS_getrandom = 318 +const SYS_memfd_create = 319 +const SYS_kexec_file_load = 320 +const SYS_bpf = 321 +const SYS_execveat = 322 +const SYS_userfaultfd = 323 +const SYS_membarrier = 324 +const SYS_mlock2 = 325 +const SYS_copy_file_range = 326 +const SYS_preadv2 = 327 +const SYS_pwritev2 = 328 +const SYS_pkey_mprotect = 329 +const SYS_pkey_alloc = 330 +const SYS_pkey_free = 331 +const SYS_statx = 332 +const SYS_io_pgetevents = 333 +const SYS_rseq = 334 +const SYS_uretprobe = 335 +const SYS_pidfd_send_signal = 424 +const SYS_io_uring_setup = 425 +const SYS_io_uring_enter = 426 +const SYS_io_uring_register = 427 +const SYS_open_tree = 428 +const SYS_move_mount = 429 +const SYS_fsopen = 430 +const SYS_fsconfig = 431 +const SYS_fsmount = 432 +const SYS_fspick = 433 +const SYS_pidfd_open = 434 +const SYS_clone3 = 435 +const SYS_close_range = 436 +const SYS_openat2 = 437 +const SYS_pidfd_getfd = 438 +const SYS_faccessat2 = 439 +const SYS_process_madvise = 440 +const SYS_epoll_pwait2 = 441 +const SYS_mount_setattr = 442 +const SYS_quotactl_fd = 443 +const SYS_landlock_create_ruleset = 444 +const SYS_landlock_add_rule = 445 +const SYS_landlock_restrict_self = 446 +const SYS_memfd_secret = 447 +const SYS_process_mrelease = 448 +const SYS_futex_waitv = 449 +const SYS_set_mempolicy_home_node = 450 +const SYS_cachestat = 451 +const SYS_fchmodat2 = 452 +const SYS_map_shadow_stack = 453 +const SYS_futex_wake = 454 +const SYS_futex_wait = 455 +const SYS_futex_requeue = 456 +const SYS_statmount = 457 +const SYS_listmount = 458 +const SYS_lsm_get_self_attr = 459 +const SYS_lsm_set_self_attr = 460 +const SYS_lsm_list_modules = 461 +const SYS_mseal = 462 +const SYS_setxattrat = 463 +const SYS_getxattrat = 464 +const SYS_listxattrat = 465 +const SYS_removexattrat = 466 +const SYS_open_tree_attr = 467