Skip to main content

strate_net/
syscalls.rs

1//! Domain-specific syscall wrappers for the network strate.
2use strat9_syscall::syscall1;
3
4pub use strat9_syscall::{
5    call,
6    data::TimeSpec,
7    error::{self, Error},
8    number, syscall2,
9};
10
11pub type Result<T> = error::Result<T>;
12
13/// Implements net recv.
14pub fn net_recv(buf: &mut [u8]) -> Result<usize> {
15    call::net_recv(buf)
16}
17
18/// Implements net send.
19pub fn net_send(buf: &[u8]) -> Result<usize> {
20    call::net_send(buf)
21}
22
23/// Implements net info.
24pub fn net_info(info_type: u64, buf: &mut [u8]) -> Result<usize> {
25    call::net_info(info_type as usize, buf.as_mut_ptr() as usize)
26}
27
28/// Implements clock gettime ns.
29pub fn clock_gettime_ns() -> Result<u64> {
30    let mut ts = TimeSpec {
31        tv_sec: 0,
32        tv_nsec: 0,
33    };
34    call::clock_gettime(1 /* CLOCK_MONOTONIC */, &mut ts)?;
35    Ok((ts.tv_sec as u64)
36        .saturating_mul(1_000_000_000)
37        .saturating_add(ts.tv_nsec as u64))
38}
39
40/// Implements nanosleep.
41pub fn nanosleep(req: &TimeSpec) -> Result<()> {
42    unsafe {
43        syscall2(number::SYS_NANOSLEEP, req as *const TimeSpec as usize, 0)?;
44        Ok(())
45    }
46}
47
48/// Implements proc yield.
49pub fn proc_yield() -> Result<()> {
50    call::sched_yield()?;
51    Ok(())
52}
53
54/// Implements ipc try recv.
55pub fn ipc_try_recv(port: u64, msg: &mut crate::IpcMessage) -> Result<()> {
56    call::ipc_try_recv(port as usize, msg)?;
57    Ok(())
58}
59
60/// Implements debug log.
61/// Register this task as the strate-net networking silo.
62/// Called once during startup so the NIC IRQ handler can wake us.
63pub fn net_register() -> Result<()> {
64    unsafe { syscall1(strat9_abi::syscall::SYS_NET_REGISTER, 0)? };
65    Ok(())
66}
67
68pub fn debug_log(msg: &str) {
69    let _ = call::debug_log(msg.as_bytes());
70}
71
72/// Implements exit.
73pub fn exit(code: usize) -> ! {
74    call::exit(code)
75}