BizHawk/waterbox/waterboxhost/src/syscall_defs.rs

774 lines
17 KiB
Rust

// linux syscall related things, for use in the waterbox
// There are various crates that contain these, but they're #[cfg]'ed to the HOST system.
// We want exactly the ones that waterbox guest MUSL uses, exactly the way they're defined there
use std::{ops::Try, fmt};
/// the result of a syscall in Rust-friendly form; OK or errno
pub type SyscallResult = Result<(), SyscallError>;
/// map a syscall result as the kernel would return it
pub fn syscall_ret(result: SyscallResult) -> SyscallReturn {
match result {
Ok(()) => SyscallReturn::from_ok(0),
Err(e) => SyscallReturn::from_error(e)
}
}
/// map a syscall result as the kernel would return it
pub fn syscall_ret_val(result: Result<usize, SyscallError>) -> SyscallReturn {
match result {
Ok(v) => SyscallReturn::from_ok(v),
Err(e) => SyscallReturn::from_error(e)
}
}
pub fn syscall_ret_i64(result: Result<i64, SyscallError>) -> SyscallReturn {
match result {
Ok(v) => SyscallReturn::from_ok(v as usize),
Err(e) => SyscallReturn::from_error(e)
}
}
/// map a syscall result as the kernel would return it
pub fn syscall_err(result: SyscallError) -> SyscallReturn {
SyscallReturn::from_error(result)
}
/// map a syscall result as the kernel would return it
pub fn syscall_ok(result: usize) -> SyscallReturn {
SyscallReturn::from_ok(result)
}
#[repr(transparent)]
#[derive(Copy, Clone)]
pub struct SyscallReturn(pub usize);
impl SyscallReturn {
pub const ERROR_THRESH: usize = -4096 as isize as usize;
}
impl Try for SyscallReturn {
type Ok = usize;
type Error = SyscallError;
fn into_result(self) -> Result<Self::Ok, Self::Error> {
if self.0 <= SyscallReturn::ERROR_THRESH {
Ok(self.0)
} else {
Err(SyscallError(-(self.0 as i32)))
}
}
fn from_error(v: Self::Error) -> Self {
SyscallReturn(-v.0 as isize as usize)
}
fn from_ok(v: Self::Ok) -> Self {
assert!(v <= SyscallReturn::ERROR_THRESH);
SyscallReturn(v)
}
}
macro_rules! lookup {
($P:ident: $T:ident { $($N:ident = $E:expr; )+ }) => (
$(pub const $N: $T = $T($E);)+
pub fn $P(val: &$T) -> &'static str {
match val {
$($T($E) => stringify!($N),)+
_ => "????"
}
}
);
}
#[derive(Debug, Eq, PartialEq)]
#[repr(transparent)]
pub struct SyscallError(pub i32);
impl From<i32> for SyscallError {
fn from(err: i32) -> SyscallError {
SyscallError(err)
}
}
impl fmt::Display for SyscallError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "errno {}", lookup_errno(self))
}
}
impl std::error::Error for SyscallError {}
lookup! { lookup_errno: SyscallError {
EPERM = 1;
ENOENT = 2;
ESRCH = 3;
EINTR = 4;
EIO = 5;
ENXIO = 6;
E2BIG = 7;
ENOEXEC = 8;
EBADF = 9;
ECHILD = 10;
EAGAIN = 11;
ENOMEM = 12;
EACCES = 13;
EFAULT = 14;
ENOTBLK = 15;
EBUSY = 16;
EEXIST = 17;
EXDEV = 18;
ENODEV = 19;
ENOTDIR = 20;
EISDIR = 21;
EINVAL = 22;
ENFILE = 23;
EMFILE = 24;
ENOTTY = 25;
ETXTBSY = 26;
EFBIG = 27;
ENOSPC = 28;
ESPIPE = 29;
EROFS = 30;
EMLINK = 31;
EPIPE = 32;
EDOM = 33;
ERANGE = 34;
EDEADLK = 35;
ENAMETOOLONG = 36;
ENOLCK = 37;
ENOSYS = 38;
ENOTEMPTY = 39;
ELOOP = 40;
// EWOULDBLOCK = EAGAIN;
ENOMSG = 42;
EIDRM = 43;
ECHRNG = 44;
EL2NSYNC = 45;
EL3HLT = 46;
EL3RST = 47;
ELNRNG = 48;
EUNATCH = 49;
ENOCSI = 50;
EL2HLT = 51;
EBADE = 52;
EBADR = 53;
EXFULL = 54;
ENOANO = 55;
EBADRQC = 56;
EBADSLT = 57;
// EDEADLOCK = EDEADLK;
EBFONT = 59;
ENOSTR = 60;
ENODATA = 61;
ETIME = 62;
ENOSR = 63;
ENONET = 64;
ENOPKG = 65;
EREMOTE = 66;
ENOLINK = 67;
EADV = 68;
ESRMNT = 69;
ECOMM = 70;
EPROTO = 71;
EMULTIHOP = 72;
EDOTDOT = 73;
EBADMSG = 74;
EOVERFLOW = 75;
ENOTUNIQ = 76;
EBADFD = 77;
EREMCHG = 78;
ELIBACC = 79;
ELIBBAD = 80;
ELIBSCN = 81;
ELIBMAX = 82;
ELIBEXEC = 83;
EILSEQ = 84;
ERESTART = 85;
ESTRPIPE = 86;
EUSERS = 87;
ENOTSOCK = 88;
EDESTADDRREQ = 89;
EMSGSIZE = 90;
EPROTOTYPE = 91;
ENOPROTOOPT = 92;
EPROTONOSUPPORT = 93;
ESOCKTNOSUPPORT = 94;
EOPNOTSUPP = 95;
// ENOTSUP = EOPNOTSUPP;
EPFNOSUPPORT = 96;
EAFNOSUPPORT = 97;
EADDRINUSE = 98;
EADDRNOTAVAIL = 99;
ENETDOWN = 100;
ENETUNREACH = 101;
ENETRESET = 102;
ECONNABORTED = 103;
ECONNRESET = 104;
ENOBUFS = 105;
EISCONN = 106;
ENOTCONN = 107;
ESHUTDOWN = 108;
ETOOMANYREFS = 109;
ETIMEDOUT = 110;
ECONNREFUSED = 111;
EHOSTDOWN = 112;
EHOSTUNREACH = 113;
EALREADY = 114;
EINPROGRESS = 115;
ESTALE = 116;
EUCLEAN = 117;
ENOTNAM = 118;
ENAVAIL = 119;
EISNAM = 120;
EREMOTEIO = 121;
EDQUOT = 122;
ENOMEDIUM = 123;
EMEDIUMTYPE = 124;
ECANCELED = 125;
ENOKEY = 126;
EKEYEXPIRED = 127;
EKEYREVOKED = 128;
EKEYREJECTED = 129;
EOWNERDEAD = 130;
ENOTRECOVERABLE = 131;
ERFKILL = 132;
EHWPOISON = 133;
}}
pub const S_IFMT: u32 = 0o0170000;
pub const S_IFDIR: u32 = 0o0040000;
pub const S_IFCHR: u32 = 0o0020000;
pub const S_IFBLK: u32 = 0o0060000;
pub const S_IFREG: u32 = 0o0100000;
pub const S_IFIFO: u32 = 0o0010000;
pub const S_IFLNK: u32 = 0o0120000;
pub const S_IFSOCK: u32 = 0o0140000;
pub const S_ISUID: u32 = 0o04000;
pub const S_ISGID: u32 = 0o02000;
pub const S_ISVTX: u32 = 0o01000;
pub const S_IRUSR: u32 = 0o0400;
pub const S_IWUSR: u32 = 0o0200;
pub const S_IXUSR: u32 = 0o0100;
pub const S_IRWXU: u32 = 0o0700;
pub const S_IRGRP: u32 = 0o0040;
pub const S_IWGRP: u32 = 0o0020;
pub const S_IXGRP: u32 = 0o0010;
pub const S_IRWXG: u32 = 0o0070;
pub const S_IROTH: u32 = 0o0004;
pub const S_IWOTH: u32 = 0o0002;
pub const S_IXOTH: u32 = 0o0001;
pub const S_IRWXO: u32 = 0o0007;
/// Kernel stat object
#[repr(C)]
#[derive(Default)]
pub struct KStat {
pub st_dev: u64,
pub st_ino: u64,
pub st_nlink: u64,
pub st_mode: u32,
pub st_uid: u32,
pub st_gid: u32,
pub __pad0: u32,
pub st_rdev: u64,
pub st_size: i64,
pub st_blksize: i64,
pub st_blocks: i64,
pub st_atime_sec: i64,
pub st_atime_nsec: i64,
pub st_mtime_sec: i64,
pub st_mtime_nsec: i64,
pub st_ctime_sec: i64,
pub st_ctime_nsec: i64,
pub __unused0: i64,
pub __unused1: i64,
pub __unused2: i64,
}
pub const SEEK_SET: i32 = 0;
pub const SEEK_CUR: i32 = 1;
pub const SEEK_END: i32 = 2;
pub const O_ACCMODE: i32 = O_PATH | O_RDONLY | O_WRONLY | O_RDWR;
pub const O_PATH: i32 = 0o010000000;
pub const O_RDONLY: i32 = 0;
pub const O_WRONLY: i32 = 1;
pub const O_RDWR: i32 = 2;
#[repr(C)]
pub struct Iovec {
pub iov_base: usize,
pub iov_len: usize,
}
impl Iovec {
pub unsafe fn slice(&self) -> &[u8] {
std::slice::from_raw_parts(self.iov_base as *const u8, self.iov_len)
}
pub unsafe fn slice_mut(&self) -> &mut [u8] {
std::slice::from_raw_parts_mut(self.iov_base as *mut u8, self.iov_len)
}
}
#[derive(Debug, Eq, PartialEq)]
#[repr(transparent)]
pub struct SyscallNumber(pub usize);
lookup! { lookup_syscall: SyscallNumber {
NR_READ = 0;
NR_WRITE = 1;
NR_OPEN = 2;
NR_CLOSE = 3;
NR_STAT = 4;
NR_FSTAT = 5;
NR_LSTAT = 6;
NR_POLL = 7;
NR_LSEEK = 8;
NR_MMAP = 9;
NR_MPROTECT = 10;
NR_MUNMAP = 11;
NR_BRK = 12;
NR_RT_SIGACTION = 13;
NR_RT_SIGPROCMASK = 14;
NR_RT_SIGRETURN = 15;
NR_IOCTL = 16;
NR_PREAD64 = 17;
NR_PWRITE64 = 18;
NR_READV = 19;
NR_WRITEV = 20;
NR_ACCESS = 21;
NR_PIPE = 22;
NR_SELECT = 23;
NR_SCHED_YIELD = 24;
NR_MREMAP = 25;
NR_MSYNC = 26;
NR_MINCORE = 27;
NR_MADVISE = 28;
NR_SHMGET = 29;
NR_SHMAT = 30;
NR_SHMCTL = 31;
NR_DUP = 32;
NR_DUP2 = 33;
NR_PAUSE = 34;
NR_NANOSLEEP = 35;
NR_GETITIMER = 36;
NR_ALARM = 37;
NR_SETITIMER = 38;
NR_GETPID = 39;
NR_SENDFILE = 40;
NR_SOCKET = 41;
NR_CONNECT = 42;
NR_ACCEPT = 43;
NR_SENDTO = 44;
NR_RECVFROM = 45;
NR_SENDMSG = 46;
NR_RECVMSG = 47;
NR_SHUTDOWN = 48;
NR_BIND = 49;
NR_LISTEN = 50;
NR_GETSOCKNAME = 51;
NR_GETPEERNAME = 52;
NR_SOCKETPAIR = 53;
NR_SETSOCKOPT = 54;
NR_GETSOCKOPT = 55;
NR_CLONE = 56;
NR_FORK = 57;
NR_VFORK = 58;
NR_EXECVE = 59;
NR_EXIT = 60;
NR_WAIT4 = 61;
NR_KILL = 62;
NR_UNAME = 63;
NR_SEMGET = 64;
NR_SEMOP = 65;
NR_SEMCTL = 66;
NR_SHMDT = 67;
NR_MSGGET = 68;
NR_MSGSND = 69;
NR_MSGRCV = 70;
NR_MSGCTL = 71;
NR_FCNTL = 72;
NR_FLOCK = 73;
NR_FSYNC = 74;
NR_FDATASYNC = 75;
NR_TRUNCATE = 76;
NR_FTRUNCATE = 77;
NR_GETDENTS = 78;
NR_GETCWD = 79;
NR_CHDIR = 80;
NR_FCHDIR = 81;
NR_RENAME = 82;
NR_MKDIR = 83;
NR_RMDIR = 84;
NR_CREAT = 85;
NR_LINK = 86;
NR_UNLINK = 87;
NR_SYMLINK = 88;
NR_READLINK = 89;
NR_CHMOD = 90;
NR_FCHMOD = 91;
NR_CHOWN = 92;
NR_FCHOWN = 93;
NR_LCHOWN = 94;
NR_UMASK = 95;
NR_GETTIMEOFDAY = 96;
NR_GETRLIMIT = 97;
NR_GETRUSAGE = 98;
NR_SYSINFO = 99;
NR_TIMES = 100;
NR_PTRACE = 101;
NR_GETUID = 102;
NR_SYSLOG = 103;
NR_GETGID = 104;
NR_SETUID = 105;
NR_SETGID = 106;
NR_GETEUID = 107;
NR_GETEGID = 108;
NR_SETPGID = 109;
NR_GETPPID = 110;
NR_GETPGRP = 111;
NR_SETSID = 112;
NR_SETREUID = 113;
NR_SETREGID = 114;
NR_GETGROUPS = 115;
NR_SETGROUPS = 116;
NR_SETRESUID = 117;
NR_GETRESUID = 118;
NR_SETRESGID = 119;
NR_GETRESGID = 120;
NR_GETPGID = 121;
NR_SETFSUID = 122;
NR_SETFSGID = 123;
NR_GETSID = 124;
NR_CAPGET = 125;
NR_CAPSET = 126;
NR_RT_SIGPENDING = 127;
NR_RT_SIGTIMEDWAIT = 128;
NR_RT_SIGQUEUEINFO = 129;
NR_RT_SIGSUSPEND = 130;
NR_SIGALTSTACK = 131;
NR_UTIME = 132;
NR_MKNOD = 133;
NR_USELIB = 134;
NR_PERSONALITY = 135;
NR_USTAT = 136;
NR_STATFS = 137;
NR_FSTATFS = 138;
NR_SYSFS = 139;
NR_GETPRIORITY = 140;
NR_SETPRIORITY = 141;
NR_SCHED_SETPARAM = 142;
NR_SCHED_GETPARAM = 143;
NR_SCHED_SETSCHEDULER = 144;
NR_SCHED_GETSCHEDULER = 145;
NR_SCHED_GET_PRIORITY_MAX = 146;
NR_SCHED_GET_PRIORITY_MIN = 147;
NR_SCHED_RR_GET_INTERVAL = 148;
NR_MLOCK = 149;
NR_MUNLOCK = 150;
NR_MLOCKALL = 151;
NR_MUNLOCKALL = 152;
NR_VHANGUP = 153;
NR_MODIFY_LDT = 154;
NR_PIVOT_ROOT = 155;
NR__SYSCTL = 156;
NR_PRCTL = 157;
NR_ARCH_PRCTL = 158;
NR_ADJTIMEX = 159;
NR_SETRLIMIT = 160;
NR_CHROOT = 161;
NR_SYNC = 162;
NR_ACCT = 163;
NR_SETTIMEOFDAY = 164;
NR_MOUNT = 165;
NR_UMOUNT2 = 166;
NR_SWAPON = 167;
NR_SWAPOFF = 168;
NR_REBOOT = 169;
NR_SETHOSTNAME = 170;
NR_SETDOMAINNAME = 171;
NR_IOPL = 172;
NR_IOPERM = 173;
NR_CREATE_MODULE = 174;
NR_INIT_MODULE = 175;
NR_DELETE_MODULE = 176;
NR_GET_KERNEL_SYMS = 177;
NR_QUERY_MODULE = 178;
NR_QUOTACTL = 179;
NR_NFSSERVCTL = 180;
NR_GETPMSG = 181;
NR_PUTPMSG = 182;
NR_AFS_SYSCALL = 183;
NR_TUXCALL = 184;
NR_SECURITY = 185;
NR_GETTID = 186;
NR_READAHEAD = 187;
NR_SETXATTR = 188;
NR_LSETXATTR = 189;
NR_FSETXATTR = 190;
NR_GETXATTR = 191;
NR_LGETXATTR = 192;
NR_FGETXATTR = 193;
NR_LISTXATTR = 194;
NR_LLISTXATTR = 195;
NR_FLISTXATTR = 196;
NR_REMOVEXATTR = 197;
NR_LREMOVEXATTR = 198;
NR_FREMOVEXATTR = 199;
NR_TKILL = 200;
NR_TIME = 201;
NR_FUTEX = 202;
NR_SCHED_SETAFFINITY = 203;
NR_SCHED_GETAFFINITY = 204;
NR_SET_THREAD_AREA = 205;
NR_IO_SETUP = 206;
NR_IO_DESTROY = 207;
NR_IO_GETEVENTS = 208;
NR_IO_SUBMIT = 209;
NR_IO_CANCEL = 210;
NR_GET_THREAD_AREA = 211;
NR_LOOKUP_DCOOKIE = 212;
NR_EPOLL_CREATE = 213;
NR_EPOLL_CTL_OLD = 214;
NR_EPOLL_WAIT_OLD = 215;
NR_REMAP_FILE_PAGES = 216;
NR_GETDENTS64 = 217;
NR_SET_TID_ADDRESS = 218;
NR_RESTART_SYSCALL = 219;
NR_SEMTIMEDOP = 220;
NR_FADVISE64 = 221;
NR_TIMER_CREATE = 222;
NR_TIMER_SETTIME = 223;
NR_TIMER_GETTIME = 224;
NR_TIMER_GETOVERRUN = 225;
NR_TIMER_DELETE = 226;
NR_CLOCK_SETTIME = 227;
NR_CLOCK_GETTIME = 228;
NR_CLOCK_GETRES = 229;
NR_CLOCK_NANOSLEEP = 230;
NR_EXIT_GROUP = 231;
NR_EPOLL_WAIT = 232;
NR_EPOLL_CTL = 233;
NR_TGKILL = 234;
NR_UTIMES = 235;
NR_VSERVER = 236;
NR_MBIND = 237;
NR_SET_MEMPOLICY = 238;
NR_GET_MEMPOLICY = 239;
NR_MQ_OPEN = 240;
NR_MQ_UNLINK = 241;
NR_MQ_TIMEDSEND = 242;
NR_MQ_TIMEDRECEIVE = 243;
NR_MQ_NOTIFY = 244;
NR_MQ_GETSETATTR = 245;
NR_KEXEC_LOAD = 246;
NR_WAITID = 247;
NR_ADD_KEY = 248;
NR_REQUEST_KEY = 249;
NR_KEYCTL = 250;
NR_IOPRIO_SET = 251;
NR_IOPRIO_GET = 252;
NR_INOTIFY_INIT = 253;
NR_INOTIFY_ADD_WATCH = 254;
NR_INOTIFY_RM_WATCH = 255;
NR_MIGRATE_PAGES = 256;
NR_OPENAT = 257;
NR_MKDIRAT = 258;
NR_MKNODAT = 259;
NR_FCHOWNAT = 260;
NR_FUTIMESAT = 261;
NR_NEWFSTATAT = 262;
NR_UNLINKAT = 263;
NR_RENAMEAT = 264;
NR_LINKAT = 265;
NR_SYMLINKAT = 266;
NR_READLINKAT = 267;
NR_FCHMODAT = 268;
NR_FACCESSAT = 269;
NR_PSELECT6 = 270;
NR_PPOLL = 271;
NR_UNSHARE = 272;
NR_SET_ROBUST_LIST = 273;
NR_GET_ROBUST_LIST = 274;
NR_SPLICE = 275;
NR_TEE = 276;
NR_SYNC_FILE_RANGE = 277;
NR_VMSPLICE = 278;
NR_MOVE_PAGES = 279;
NR_UTIMENSAT = 280;
NR_EPOLL_PWAIT = 281;
NR_SIGNALFD = 282;
NR_TIMERFD_CREATE = 283;
NR_EVENTFD = 284;
NR_FALLOCATE = 285;
NR_TIMERFD_SETTIME = 286;
NR_TIMERFD_GETTIME = 287;
NR_ACCEPT4 = 288;
NR_SIGNALFD4 = 289;
NR_EVENTFD2 = 290;
NR_EPOLL_CREATE1 = 291;
NR_DUP3 = 292;
NR_PIPE2 = 293;
NR_INOTIFY_INIT1 = 294;
NR_PREADV = 295;
NR_PWRITEV = 296;
NR_RT_TGSIGQUEUEINFO = 297;
NR_PERF_EVENT_OPEN = 298;
NR_RECVMMSG = 299;
NR_FANOTIFY_INIT = 300;
NR_FANOTIFY_MARK = 301;
NR_PRLIMIT64 = 302;
NR_NAME_TO_HANDLE_AT = 303;
NR_OPEN_BY_HANDLE_AT = 304;
NR_CLOCK_ADJTIME = 305;
NR_SYNCFS = 306;
NR_SENDMMSG = 307;
NR_SETNS = 308;
NR_GETCPU = 309;
NR_PROCESS_VM_READV = 310;
NR_PROCESS_VM_WRITEV = 311;
NR_KCMP = 312;
NR_FINIT_MODULE = 313;
NR_SCHED_SETATTR = 314;
NR_SCHED_GETATTR = 315;
NR_RENAMEAT2 = 316;
NR_SECCOMP = 317;
NR_GETRANDOM = 318;
NR_MEMFD_CREATE = 319;
NR_KEXEC_FILE_LOAD = 320;
NR_BPF = 321;
NR_EXECVEAT = 322;
NR_USERFAULTFD = 323;
NR_MEMBARRIER = 324;
NR_MLOCK2 = 325;
NR_COPY_FILE_RANGE = 326;
NR_PREADV2 = 327;
NR_PWRITEV2 = 328;
NR_PKEY_MPROTECT = 329;
NR_PKEY_ALLOC = 330;
NR_PKEY_FREE = 331;
NR_STATX = 332;
NR_IO_PGETEVENTS = 333;
NR_RSEQ = 334;
NR_PIDFD_SEND_SIGNAL = 424;
NR_IO_URING_SETUP = 425;
NR_IO_URING_ENTER = 426;
NR_IO_URING_REGISTER = 427;
NR_OPEN_TREE = 428;
NR_MOVE_MOUNT = 429;
NR_FSOPEN = 430;
NR_FSCONFIG = 431;
NR_FSMOUNT = 432;
NR_FSPICK = 433;
NR_PIDFD_OPEN = 434;
NR_CLONE3 = 435;
NR_WBX_CLONE = 2000;
}}
pub const MAP_FAILED: usize = !0;
pub const MAP_SHARED: usize = 0x01;
pub const MAP_PRIVATE: usize = 0x02;
pub const MAP_SHARED_VALIDATE: usize = 0x03;
pub const MAP_TYPE: usize = 0x0f;
pub const MAP_FIXED: usize = 0x10;
pub const MAP_ANON: usize = 0x20;
pub const MAP_32BIT: usize = 0x40;
pub const MAP_ANONYMOUS: usize = MAP_ANON;
pub const MAP_NORESERVE: usize = 0x4000;
pub const MAP_GROWSDOWN: usize = 0x0100;
pub const MAP_DENYWRITE: usize = 0x0800;
pub const MAP_EXECUTABLE: usize = 0x1000;
pub const MAP_LOCKED: usize = 0x2000;
pub const MAP_POPULATE: usize = 0x8000;
pub const MAP_NONBLOCK: usize = 0x10000;
pub const MAP_STACK: usize = 0x20000;
pub const MAP_HUGETLB: usize = 0x40000;
pub const MAP_SYNC: usize = 0x80000;
pub const MAP_FIXED_NOREPLACE: usize = 0x100000;
pub const MAP_FILE: usize = 0;
pub const MAP_HUGE_SHIFT: usize = 26;
pub const MAP_HUGE_MASK: usize = 0x3f;
pub const MAP_HUGE_64KB: usize = 16 << 26;
pub const MAP_HUGE_512KB: usize = 19 << 26;
pub const MAP_HUGE_1MB: usize = 20 << 26;
pub const MAP_HUGE_2MB: usize = 21 << 26;
pub const MAP_HUGE_8MB: usize = 23 << 26;
pub const MAP_HUGE_16MB: usize = 24 << 26;
pub const MAP_HUGE_32MB: usize = 25 << 26;
pub const MAP_HUGE_256MB: usize = 28 << 26;
pub const MAP_HUGE_512MB: usize = 29 << 26;
pub const MAP_HUGE_1GB: usize = 30 << 26;
pub const MAP_HUGE_2GB: usize = 31 << 26;
pub const MAP_HUGE_16GB: usize = 34 << 26;
pub const PROT_NONE: usize = 0;
pub const PROT_READ: usize = 1;
pub const PROT_WRITE: usize = 2;
pub const PROT_EXEC: usize = 4;
pub const PROT_GROWSDOWN: usize = 0x01000000;
pub const PROT_GROWSUP: usize = 0x02000000;
pub const MS_ASYNC: usize = 1;
pub const MS_INVALIDATE: usize = 2;
pub const MS_SYNC: usize = 4;
pub const MCL_CURRENT: usize = 1;
pub const MCL_FUTURE: usize = 2;
pub const MCL_ONFAULT: usize = 4;
pub const POSIX_MADV_NORMAL: usize = 0;
pub const POSIX_MADV_RANDOM: usize = 1;
pub const POSIX_MADV_SEQUENTIAL: usize = 2;
pub const POSIX_MADV_WILLNEED: usize = 3;
pub const POSIX_MADV_DONTNEED: usize = 4;
pub const MADV_NORMAL: usize = 0;
pub const MADV_RANDOM: usize = 1;
pub const MADV_SEQUENTIAL: usize = 2;
pub const MADV_WILLNEED: usize = 3;
pub const MADV_DONTNEED: usize = 4;
pub const MADV_FREE: usize = 8;
pub const MADV_REMOVE: usize = 9;
pub const MADV_DONTFORK: usize = 10;
pub const MADV_DOFORK: usize = 11;
pub const MADV_MERGEABLE: usize = 12;
pub const MADV_UNMERGEABLE: usize = 13;
pub const MADV_HUGEPAGE: usize = 14;
pub const MADV_NOHUGEPAGE: usize = 15;
pub const MADV_DONTDUMP: usize = 16;
pub const MADV_DODUMP: usize = 17;
pub const MADV_WIPEONFORK: usize = 18;
pub const MADV_KEEPONFORK: usize = 19;
pub const MADV_COLD: usize = 20;
pub const MADV_PAGEOUT: usize = 21;
pub const MADV_HWPOISON: usize = 100;
pub const MADV_SOFT_OFFLINE: usize = 101;
pub const MREMAP_MAYMOVE: usize = 1;
pub const MREMAP_FIXED: usize = 2;
pub const MLOCK_ONFAULT: usize = 0x01;
pub const MFD_CLOEXEC: usize = 0x0001;
pub const MFD_ALLOW_SEALING: usize = 0x0002;
pub const MFD_HUGETLB: usize = 0x0004;
#[repr(C)]
pub struct TimeSpec {
pub tv_sec: i64,
pub tv_nsec: i64,
}
pub const FUTEX_WAITERS: u32 = 0x80000000;
pub const FUTEX_OWNER_DIED: u32 = 0x40000000;
pub const FUTEX_TID_MASK: u32 = 0x3fffffff;
pub const FUTEX_WAIT: i32 = 0;
pub const FUTEX_WAKE: i32 = 1;
pub const FUTEX_FD: i32 = 2;
pub const FUTEX_REQUEUE: i32 = 3;
pub const FUTEX_CMP_REQUEUE: i32 = 4;
pub const FUTEX_WAKE_OP: i32 = 5;
pub const FUTEX_LOCK_PI: i32 = 6;
pub const FUTEX_UNLOCK_PI: i32 = 7;
pub const FUTEX_TRYLOCK_PI: i32 = 8;
pub const FUTEX_WAIT_BITSET: i32 = 9;
pub const FUTEX_PRIVATE: i32 = 128;
pub const FUTEX_CLOCK_REALTIME: i32 = 256;