///|
fn syscall_x86_64(name : String) -> Int? {
  match name {
    "read" => Some(0)
    "write" => Some(1)
    "open" => Some(2)
    "close" => Some(3)
    "fstat" => Some(5)
    "poll" => Some(7)
    "lseek" => Some(8)
    "mmap" => Some(9)
    "mprotect" => Some(10)
    "munmap" => Some(11)
    "brk" => Some(12)
    "rt_sigaction" => Some(13)
    "rt_sigprocmask" => Some(14)
    "rt_sigreturn" => Some(15)
    "ioctl" => Some(16)
    "pread64" => Some(17)
    "sigaltstack" => Some(131)
    "statfs" => Some(137)
    "access" => Some(21)
    "pipe" => Some(22)
    "dup" => Some(32)
    "dup2" => Some(33)
    "socket" => Some(41)
    "connect" => Some(42)
    "accept" => Some(43)
    "sendto" => Some(44)
    "recvfrom" => Some(45)
    "bind" => Some(49)
    "listen" => Some(50)
    "clone" => Some(56)
    "execve" => Some(59)
    "exit" => Some(60)
    "wait4" => Some(61)
    "fcntl" => Some(72)
    "getcwd" => Some(79)
    "chdir" => Some(80)
    "readlink" => Some(89)
    "arch_prctl" => Some(158)
    "prctl" => Some(157)
    "gettid" => Some(186)
    "futex" => Some(202)
    "sched_getaffinity" => Some(204)
    "getpid" => Some(39)
    "set_tid_address" => Some(218)
    "set_robust_list" => Some(273)
    "clock_gettime" => Some(228)
    "exit_group" => Some(231)
    "openat" => Some(257)
    "splice" => Some(275)
    "mkdirat" => Some(258)
    "newfstatat" => Some(262)
    "unlinkat" => Some(263)
    "renameat2" => Some(316)
    "getrandom" => Some(318)
    "statx" => Some(332)
    "execveat" => Some(322)
    "accept4" => Some(288)
    "dup3" => Some(292)
    "pipe2" => Some(293)
    "prlimit64" => Some(302)
    "rseq" => Some(334)
    "clone3" => Some(435)
    _ => None
  }
}

///|
fn syscall_aarch64(name : String) -> Int? {
  match name {
    "read" => Some(63)
    "write" => Some(64)
    "close" => Some(57)
    "fstat" => Some(80)
    "lseek" => Some(62)
    "mmap" => Some(222)
    "mprotect" => Some(226)
    "munmap" => Some(215)
    "brk" => Some(214)
    "rt_sigaction" => Some(134)
    "rt_sigprocmask" => Some(135)
    "rt_sigreturn" => Some(139)
    "ioctl" => Some(29)
    "pread64" => Some(67)
    "splice" => Some(76)
    "faccessat" => Some(48)
    "faccessat2" => Some(439)
    "dup" => Some(23)
    "dup3" => Some(24)
    "socket" => Some(198)
    "connect" => Some(203)
    "accept" => Some(202)
    "accept4" => Some(242)
    "sendto" => Some(206)
    "recvfrom" => Some(207)
    "bind" => Some(200)
    "listen" => Some(201)
    "clone" => Some(220)
    "clone3" => Some(435)
    "execve" => Some(221)
    "execveat" => Some(281)
    "exit" => Some(93)
    "exit_group" => Some(94)
    "wait4" => Some(260)
    "fcntl" => Some(25)
    "getcwd" => Some(17)
    "chdir" => Some(49)
    "readlinkat" => Some(78)
    "prctl" => Some(167)
    "gettid" => Some(178)
    "futex" => Some(98)
    "getpid" => Some(172)
    "set_tid_address" => Some(96)
    "set_robust_list" => Some(99)
    "clock_gettime" => Some(113)
    "sched_getaffinity" => Some(123)
    "sigaltstack" => Some(132)
    "statfs" => Some(43)
    "openat" => Some(56)
    "mkdirat" => Some(34)
    "newfstatat" => Some(79)
    "unlinkat" => Some(35)
    "renameat2" => Some(276)
    "getrandom" => Some(278)
    "statx" => Some(291)
    "ppoll" => Some(73)
    "pipe2" => Some(59)
    "prlimit64" => Some(261)
    "rseq" => Some(293)
    _ => None
  }
}

///|
pub fn syscall_number(architecture : Architecture, name : String) -> Int? {
  match architecture {
    X86_64 => syscall_x86_64(name)
    AArch64 => syscall_aarch64(name)
  }
}

///|
pub fn Architecture::audit_value(self : Architecture) -> UInt {
  match self {
    X86_64 => 0xc000003eU
    AArch64 => 0xc00000b7U
  }
}