Skip to main content

strate_net/
syscalls.rs

1//! Domain-specific syscall wrappers for the network strate.
2
3pub use strat9_syscall::{
4    call,
5    data::TimeSpec,
6    error::{self, Error},
7    number, syscall0, syscall2,
8};
9
10pub type Result<T> = error::Result<T>;
11
12/// Implements net recv.
13pub fn net_recv(buf: &mut [u8]) -> Result<usize> {
14    call::net_recv(buf)
15}
16
17/// Implements net send.
18pub fn net_send(buf: &[u8]) -> Result<usize> {
19    call::net_send(buf)
20}
21
22/// Implements net info.
23pub fn net_info(info_type: u64, buf: &mut [u8]) -> Result<usize> {
24    call::net_info(info_type as usize, buf.as_mut_ptr() as usize)
25}
26
27/// Implements clock gettime ns.
28pub fn clock_gettime_ns() -> Result<u64> {
29    unsafe { syscall0(number::SYS_CLOCK_GETTIME).map(|v| v as u64) }
30}
31
32/// Implements nanosleep.
33pub fn nanosleep(req: &TimeSpec) -> Result<()> {
34    unsafe {
35        syscall2(number::SYS_NANOSLEEP, req as *const TimeSpec as usize, 0)?;
36        Ok(())
37    }
38}
39
40/// Implements proc yield.
41pub fn proc_yield() -> Result<()> {
42    call::sched_yield()?;
43    Ok(())
44}
45
46/// Implements ipc try recv.
47pub fn ipc_try_recv(port: u64, msg: &mut crate::IpcMessage) -> Result<()> {
48    call::ipc_try_recv(port as usize, msg)?;
49    Ok(())
50}
51
52/// Implements debug log.
53pub fn debug_log(msg: &str) {
54    let _ = call::debug_log(msg.as_bytes());
55}
56
57/// Implements exit.
58pub fn exit(code: usize) -> ! {
59    call::exit(code)
60}