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, 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    let mut ts = TimeSpec {
30        tv_sec: 0,
31        tv_nsec: 0,
32    };
33    call::clock_gettime(1 /* CLOCK_MONOTONIC */, &mut ts)?;
34    Ok((ts.tv_sec as u64)
35        .saturating_mul(1_000_000_000)
36        .saturating_add(ts.tv_nsec as u64))
37}
38
39/// Implements nanosleep.
40pub fn nanosleep(req: &TimeSpec) -> Result<()> {
41    unsafe {
42        syscall2(number::SYS_NANOSLEEP, req as *const TimeSpec as usize, 0)?;
43        Ok(())
44    }
45}
46
47/// Implements proc yield.
48pub fn proc_yield() -> Result<()> {
49    call::sched_yield()?;
50    Ok(())
51}
52
53/// Implements ipc try recv.
54pub fn ipc_try_recv(port: u64, msg: &mut crate::IpcMessage) -> Result<()> {
55    call::ipc_try_recv(port as usize, msg)?;
56    Ok(())
57}
58
59/// Implements debug log.
60pub fn debug_log(msg: &str) {
61    let _ = call::debug_log(msg.as_bytes());
62}
63
64/// Implements exit.
65pub fn exit(code: usize) -> ! {
66    call::exit(code)
67}