linux-syscalls 0.4.0

A library to easily invoke linux system calls.
Documentation
use crate::{Errno, Sysno};

use core::ffi::c_void as void;
extern "fastcall" {
    fn linux_syscalls_rs_syscall0(sysno: usize) -> usize;
    fn linux_syscalls_rs_syscall1(arg0: usize, sysno: usize) -> usize;
    fn linux_syscalls_rs_syscall1_noreturn(arg0: usize, sysno: usize) -> !;
    fn linux_syscalls_rs_syscall2(arg1: usize, arg0: usize, sysno: usize) -> usize;
    fn linux_syscalls_rs_syscall3(arg1: usize, arg2: usize, arg0: usize, sysno: usize) -> usize;
    fn linux_syscalls_rs_syscall4(
        arg1: usize,
        arg2: usize,
        arg0: usize,
        arg3: usize,
        sysno: usize,
    ) -> usize;
    fn linux_syscalls_rs_syscall5(
        arg1: usize,
        arg2: usize,
        arg0: usize,
        arg3: usize,
        arg4: usize,
        sysno: usize,
    ) -> usize;
    fn linux_syscalls_rs_syscall6(
        arg1: usize,
        arg2: usize,
        arg0: usize,
        arg3: usize,
        arg4: usize,
        arg5: usize,
        sysno: usize,
    ) -> usize;

    fn linux_syscalls_rs_vsyscall0(sysno: usize, callee: *const void) -> usize;
    fn linux_syscalls_rs_vsyscall1(arg0: usize, sysno: usize, callee: *const void) -> usize;
    fn linux_syscalls_rs_vsyscall2(
        arg1: usize,
        arg0: usize,
        sysno: usize,
        callee: *const void,
    ) -> usize;
    fn linux_syscalls_rs_vsyscall3(
        arg1: usize,
        arg2: usize,
        arg0: usize,
        sysno: usize,
        callee: *const void,
    ) -> usize;
    fn linux_syscalls_rs_vsyscall4(
        arg1: usize,
        arg2: usize,
        arg0: usize,
        arg3: usize,
        sysno: usize,
        callee: *const void,
    ) -> usize;
    fn linux_syscalls_rs_vsyscall5(
        arg1: usize,
        arg2: usize,
        arg0: usize,
        arg3: usize,
        arg4: usize,
        sysno: usize,
        callee: *const void,
    ) -> usize;
    fn linux_syscalls_rs_vsyscall6(
        arg1: usize,
        arg2: usize,
        arg0: usize,
        arg3: usize,
        arg4: usize,
        arg5: usize,
        sysno: usize,
        callee: *const void,
    ) -> usize;
}

#[inline(always)]
unsafe fn callee() -> *const void {
    (*crate::env::vdso::VDSO.get()).0.vsyscall
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn raw_syscall0(sysno: Sysno) -> usize {
    let callee = callee();
    if callee.is_null() {
        linux_syscalls_rs_syscall0(sysno as usize)
    } else {
        linux_syscalls_rs_vsyscall0(sysno as usize, callee)
    }
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn raw_syscall1(sysno: Sysno, arg0: usize) -> usize {
    let callee = callee();
    if callee.is_null() {
        linux_syscalls_rs_syscall1(arg0, sysno as usize)
    } else {
        linux_syscalls_rs_vsyscall1(arg0, sysno as usize, callee)
    }
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn raw_syscall2(sysno: Sysno, arg0: usize, arg1: usize) -> usize {
    let callee = callee();
    if callee.is_null() {
        linux_syscalls_rs_syscall2(arg1, arg0, sysno as usize)
    } else {
        linux_syscalls_rs_vsyscall2(arg1, arg0, sysno as usize, callee)
    }
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn raw_syscall3(sysno: Sysno, arg0: usize, arg1: usize, arg2: usize) -> usize {
    let callee = callee();
    if callee.is_null() {
        linux_syscalls_rs_syscall3(arg1, arg2, arg0, sysno as usize)
    } else {
        linux_syscalls_rs_vsyscall3(arg1, arg2, arg0, sysno as usize, callee)
    }
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn raw_syscall4(
    sysno: Sysno,
    arg0: usize,
    arg1: usize,
    arg2: usize,
    arg3: usize,
) -> usize {
    let callee = callee();
    if callee.is_null() {
        linux_syscalls_rs_syscall4(arg1, arg2, arg0, arg3, sysno as usize)
    } else {
        linux_syscalls_rs_vsyscall4(arg1, arg2, arg0, arg3, sysno as usize, callee)
    }
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn raw_syscall5(
    sysno: Sysno,
    arg0: usize,
    arg1: usize,
    arg2: usize,
    arg3: usize,
    arg4: usize,
) -> usize {
    let callee = callee();
    if callee.is_null() {
        linux_syscalls_rs_syscall5(arg1, arg2, arg0, arg3, arg4, sysno as usize)
    } else {
        linux_syscalls_rs_vsyscall5(arg1, arg2, arg0, arg3, arg4, sysno as usize, callee)
    }
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn raw_syscall6(
    sysno: Sysno,
    arg0: usize,
    arg1: usize,
    arg2: usize,
    arg3: usize,
    arg4: usize,
    arg5: usize,
) -> usize {
    let callee = callee();
    if callee.is_null() {
        linux_syscalls_rs_syscall6(arg1, arg2, arg0, arg3, arg4, arg5, sysno as usize)
    } else {
        linux_syscalls_rs_vsyscall6(arg1, arg2, arg0, arg3, arg4, arg5, sysno as usize, callee)
    }
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn syscall0(sysno: Sysno) -> Result<usize, Errno> {
    Errno::from_ret(raw_syscall0(sysno))
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn syscall1(sysno: Sysno, arg0: usize) -> Result<usize, Errno> {
    Errno::from_ret(raw_syscall1(sysno, arg0))
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn syscall1_noreturn(sysno: Sysno, arg0: usize) -> ! {
    linux_syscalls_rs_syscall1_noreturn(arg0, sysno as usize)
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn syscall2(sysno: Sysno, arg0: usize, arg1: usize) -> Result<usize, Errno> {
    Errno::from_ret(raw_syscall2(sysno, arg0, arg1))
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn syscall3(
    sysno: Sysno,
    arg0: usize,
    arg1: usize,
    arg2: usize,
) -> Result<usize, Errno> {
    Errno::from_ret(raw_syscall3(sysno, arg0, arg1, arg2))
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn syscall4(
    sysno: Sysno,
    arg0: usize,
    arg1: usize,
    arg2: usize,
    arg3: usize,
) -> Result<usize, Errno> {
    Errno::from_ret(raw_syscall4(sysno, arg0, arg1, arg2, arg3))
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn syscall5(
    sysno: Sysno,
    arg0: usize,
    arg1: usize,
    arg2: usize,
    arg3: usize,
    arg4: usize,
) -> Result<usize, Errno> {
    Errno::from_ret(raw_syscall5(sysno, arg0, arg1, arg2, arg3, arg4))
}

#[allow(clippy::missing_safety_doc)]
#[inline(always)]
pub unsafe fn syscall6(
    sysno: Sysno,
    arg0: usize,
    arg1: usize,
    arg2: usize,
    arg3: usize,
    arg4: usize,
    arg5: usize,
) -> Result<usize, Errno> {
    Errno::from_ret(raw_syscall6(sysno, arg0, arg1, arg2, arg3, arg4, arg5))
}

pub use {
    raw_syscall0 as raw_syscall0_readonly, raw_syscall1 as raw_syscall1_readonly,
    raw_syscall2 as raw_syscall2_readonly, raw_syscall3 as raw_syscall3_readonly,
    raw_syscall4 as raw_syscall4_readonly, raw_syscall5 as raw_syscall5_readonly,
    raw_syscall6 as raw_syscall6_readonly, syscall0 as syscall0_readonly,
    syscall1 as syscall1_readonly, syscall2 as syscall2_readonly, syscall3 as syscall3_readonly,
    syscall4 as syscall4_readonly, syscall5 as syscall5_readonly, syscall6 as syscall6_readonly,
};

#[inline(always)]
pub(crate) fn init() {}