moana_std 0.1.2

moana 用户标准库
Documentation
//! rlimit 系列 syscall 用户态接口

use core::mem::MaybeUninit;

use moa_uapi::{
    error::{ERR_FAULT, ERR_NOT_FOUND, ERR_PERM},
    rlimit::{RlimitInfo, Rlimits},
    space::SpaceId,
    sysnr::{SYSNR_RLIMIT_QUERY, SYSNR_RLIMIT_SET},
};

/// rlimit 系列 syscall 返回类型
pub type Result<T> = core::result::Result<T, RlimitError>;

define_syscall_error! {
    /// rlimit 系列 syscall 错误
    pub enum RlimitError {
        /// 权限不足(调用者不是进程 0)
        Perm = ERR_PERM,
        /// 目标地址空间不存在
        NotFound = ERR_NOT_FOUND,
        /// 无效指针
        Fault = ERR_FAULT,
    }
}

/// 设置地址空间的资源配额
///
/// 仅进程 0 可调用。
pub fn rlimit_set(spaceid: SpaceId, limits: &Rlimits) -> Result<()> {
    let ret = unsafe {
        super::arch::syscall2(SYSNR_RLIMIT_SET, spaceid.raw(), limits as *const Rlimits as usize)
    };
    if ret < 0 { Err(RlimitError::from_raw(ret)) } else { Ok(()) }
}

/// 查询地址空间的资源配额使用情况
///
/// `SpaceId::SELF` 查询自身(任何空间可调用),
/// 指定 `spaceid` 查询目标空间(仅进程 0 可调用)。
pub fn rlimit_query(spaceid: SpaceId) -> Result<RlimitInfo> {
    let mut info = MaybeUninit::<RlimitInfo>::uninit();
    let ret = unsafe {
        super::arch::syscall2(SYSNR_RLIMIT_QUERY, spaceid.raw(), info.as_mut_ptr() as usize)
    };
    if ret < 0 { Err(RlimitError::from_raw(ret)) } else { Ok(unsafe { info.assume_init() }) }
}