use crate::errno::Errno;
use crate::syscall_1;
pub const SYSCALL_SYSINFO: u64 = 99;
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, Eq, PartialEq)]
pub struct SysInfo {
pub uptime: i64,
pub loads: [u64; 3],
pub total_ram: u64,
pub free_ram: u64,
pub shared_ram: u64,
pub buffer_ram: u64,
pub total_swap: u64,
pub free_swap: u64,
pub num_procs: u16,
pub _pad: u16,
pub total_high_mem: u64,
pub free_high_mem: u64,
pub mem_unit: u32,
}
pub fn sysinfo() -> Result<SysInfo, Errno> {
let mut sysinfo = SysInfo::default();
let ret = unsafe {
let ptr = core::ptr::from_mut(&mut sysinfo);
syscall_1!(SYSCALL_SYSINFO, ptr)
};
if ret < 0 {
return Err(ret.into());
}
Ok(sysinfo)
}
#[cfg(test)]
mod tests {
use crate::errno::Errno;
use crate::sys::sysinfo;
#[test]
pub fn test_sysinfo() -> Result<(), Errno> {
let res = sysinfo()?;
println!("{res:#?}");
Ok(())
}
}