shadow_rs/host/syscall/handler/
sysinfo.rs1use linux_api::sysinfo::sysinfo;
2use shadow_shim_helper_rs::emulated_time::EmulatedTime;
3use shadow_shim_helper_rs::syscall_types::ForeignPtr;
4
5use crate::core::worker::Worker;
6use crate::host::syscall::handler::{SyscallContext, SyscallHandler};
7use crate::host::syscall::types::SyscallError;
8
9impl SyscallHandler {
10    log_syscall!(
11        sysinfo,
12        std::ffi::c_int,
13        *const linux_api::sysinfo::sysinfo,
14    );
15    pub fn sysinfo(
16        ctx: &mut SyscallContext,
17        info_ptr: ForeignPtr<linux_api::sysinfo::sysinfo>,
18    ) -> Result<(), SyscallError> {
19        let seconds = Worker::current_time()
21            .unwrap()
22            .duration_since(&EmulatedTime::SIMULATION_START)
23            .as_secs();
24
25        let mut info = shadow_pod::zeroed::<sysinfo>();
27
28        info.uptime = i64::try_from(seconds).unwrap_or(i64::MAX);
33        info.loads[0] = 1;
34        info.loads[1] = 1;
35        info.loads[2] = 1;
36        info.totalram = 32;
37        info.freeram = 24;
38        info.sharedram = 4;
39        info.bufferram = 4;
40        info.totalswap = 0;
41        info.freeswap = 0;
42        info.procs = 100;
43        info.totalhigh = 4;
44        info.freehigh = 3;
45        info.mem_unit = 1024 * 1024 * 1024; ctx.objs
49            .process
50            .memory_borrow_mut()
51            .write(info_ptr, &info)?;
52        Ok(())
53    }
54}