#![no_std]
#[cfg(target_arch = "riscv32")]
pub type SyscallWord = u32;
#[cfg(not(target_arch = "riscv32"))]
pub type SyscallWord = u64;
#[cfg(target_arch = "riscv32")]
const _: () = assert!(core::mem::size_of::<SyscallWord>() == 4);
#[cfg(any(target_arch = "riscv32", feature = "syscalls_mock"))]
pub use dispatch::syscall_wrapper;
#[cfg(any(target_arch = "riscv32", feature = "syscalls_mock"))]
mod dispatch {
use super::SyscallWord;
#[cfg(feature = "syscalls_mock")]
unsafe extern "C-unwind" {
fn syscall_wrapper_impl(
syscall_no: u64,
arg1: u64,
arg2: u64,
arg3: u64,
arg4: u64,
arg5: u64,
arg6: u64,
arg7: u64,
) -> i32;
}
#[cfg(all(not(feature = "syscalls_mock"), target_arch = "riscv32"))]
#[inline]
unsafe fn syscall_wrapper_impl(
syscall_no: u32,
arg1: u32,
arg2: u32,
arg3: u32,
arg4: u32,
arg5: u32,
arg6: u32,
arg7: u32,
) -> i32 {
let result: i32;
unsafe {
core::arch::asm!(
"ecall",
inlateout("a0") syscall_no => result,
inlateout("a1") arg1 => _,
inlateout("a2") arg2 => _,
inlateout("a3") arg3 => _,
inlateout("a4") arg4 => _,
inlateout("a5") arg5 => _,
inlateout("a6") arg6 => _,
inlateout("a7") arg7 => _,
options(nostack),
);
}
result
}
#[inline(always)]
pub fn syscall_wrapper(
syscall_no: SyscallWord,
arg1: SyscallWord,
arg2: SyscallWord,
arg3: SyscallWord,
arg4: SyscallWord,
arg5: SyscallWord,
arg6: SyscallWord,
arg7: SyscallWord,
) -> i32 {
unsafe {
syscall_wrapper_impl(
syscall_no, arg1, arg2, arg3, arg4, arg5, arg6, arg7,
)
}
}
}