hardware 0.0.9

A no_std bare-metal hardware abstraction layer — all port I/O, memory and swap allocations are guarded at runtime. Do not consider this dependency stable before x.1.x
Documentation
use super::raw::raw_syscall;
use crate::arch::shim;

pub fn monotonic_ns() -> u64 {
    #[repr(C)]
    struct Timespec {
        tv_sec: i64,
        tv_nsec: i64,
    }
    let mut ts = Timespec {
        tv_sec: 0,
        tv_nsec: 0,
    };
    let ret = unsafe {
        raw_syscall(
            shim::nr_clock_gettime(),
            shim::os_clock_monotonic() as u64,
            &mut ts as *mut _ as u64,
            0,
            0,
            0,
            0,
        )
    };
    if ret == 0 {
        ts.tv_sec as u64 * 1_000_000_000 + ts.tv_nsec as u64
    } else {
        0
    }
}

pub fn sleep_ns(ns: u64) {
    #[repr(C)]
    struct Timespec {
        tv_sec: i64,
        tv_nsec: i64,
    }
    let req = Timespec {
        tv_sec: (ns / 1_000_000_000) as i64,
        tv_nsec: (ns % 1_000_000_000) as i64,
    };
    unsafe {
        raw_syscall(shim::nr_nanosleep(), &req as *const _ as u64, 0, 0, 0, 0, 0);
    }
}

pub fn sleep_secs(s: u64) {
    sleep_ns(s * 1_000_000_000);
}

pub fn sched_yield() {
    unsafe {
        raw_syscall(shim::nr_sched_yield(), 0, 0, 0, 0, 0, 0);
    }
}