use moa_cpumask::CpuId;
use moa_uapi::{
commpage::{COMMPAGE_BASE, COMMPAGE_PERSPACE_BASE, CommGlobal, CommPerSpace},
sched::SchedLoad,
space::SpaceId,
timer::ClockId,
};
fn global() -> &'static CommGlobal {
unsafe { &*(COMMPAGE_BASE as *const CommGlobal) }
}
fn per_space() -> &'static CommPerSpace {
unsafe { &*(COMMPAGE_PERSPACE_BASE as *const CommPerSpace) }
}
pub fn clock_gettime(_clock: ClockId) -> u64 {
unsafe { core::ptr::read_volatile(core::ptr::addr_of!(global().time_ns)) }
}
pub fn space_self() -> SpaceId {
per_space().spaceid
}
pub fn sched_cpu_load(cpu: CpuId) -> SchedLoad {
let g = global();
let idx = cpu.raw();
if idx < g.nr_cpus && idx < g.cpu_load.len() {
g.cpu_load[idx]
} else {
SchedLoad { load_avg: 0, runnable_avg: 0, util_avg: 0 }
}
}