arceos_posix_api/imp/
sys.rs

1use core::ffi::{c_int, c_long};
2
3use crate::ctypes;
4
5const PAGE_SIZE_4K: usize = 4096;
6
7/// Return system configuration infomation
8///
9/// Notice: currently only support what unikraft covers
10pub fn sys_sysconf(name: c_int) -> c_long {
11    debug!("sys_sysconf <= {}", name);
12
13    #[cfg(feature = "alloc")]
14    let (phys_pages, avail_pages) = {
15        let alloc = axalloc::global_allocator();
16        let avail_pages = alloc.available_pages();
17        (alloc.used_pages() + avail_pages, avail_pages)
18    };
19
20    #[cfg(not(feature = "alloc"))]
21    let (phys_pages, avail_pages) = {
22        let mem_size = axconfig::plat::PHYS_MEMORY_SIZE;
23        (mem_size / PAGE_SIZE_4K, mem_size / PAGE_SIZE_4K) // TODO
24    };
25
26    syscall_body!(sys_sysconf, {
27        match name as u32 {
28            // Page size
29            ctypes::_SC_PAGE_SIZE => Ok(PAGE_SIZE_4K),
30            // Number of processors in use
31            ctypes::_SC_NPROCESSORS_ONLN => Ok(axconfig::SMP),
32            // Total physical pages
33            ctypes::_SC_PHYS_PAGES => Ok(phys_pages),
34            // Avaliable physical pages
35            ctypes::_SC_AVPHYS_PAGES => Ok(avail_pages),
36            // Maximum number of files per process
37            #[cfg(feature = "fd")]
38            ctypes::_SC_OPEN_MAX => Ok(super::fd_ops::AX_FILE_LIMIT),
39            _ => Ok(0),
40        }
41    })
42}