1use crate::errno::Errno;
9use crate::syscall_1;
10
11pub const SYSCALL_SYSINFO: u64 = 99;
12
13#[repr(C)]
15#[derive(Debug, Default, Copy, Clone, Eq, PartialEq)]
16pub struct SysInfo {
17 pub uptime: i64,
19 pub loads: [u64; 3],
21 pub total_ram: u64,
23 pub free_ram: u64,
25 pub shared_ram: u64,
27 pub buffer_ram: u64,
29 pub total_swap: u64,
31 pub free_swap: u64,
33 pub num_procs: u16,
35 pub _pad: u16,
36 pub total_high_mem: u64,
38 pub free_high_mem: u64,
40 pub mem_unit: u32,
42}
43
44pub fn sysinfo() -> Result<SysInfo, Errno> {
47 let mut sysinfo = SysInfo::default();
48 let ret = unsafe {
49 let ptr = core::ptr::from_mut(&mut sysinfo);
50 syscall_1!(SYSCALL_SYSINFO, ptr)
51 };
52
53 if ret < 0 {
54 return Err(ret.into());
55 }
56
57 Ok(sysinfo)
58}
59
60#[cfg(test)]
61mod tests {
62 use crate::errno::Errno;
63 use crate::sys::sysinfo;
64
65 #[test]
66 pub fn test_sysinfo() -> Result<(), Errno> {
67 let res = sysinfo()?;
68 println!("{res:#?}");
69 Ok(())
70 }
71}