use crate::{
StarryError, StarryResult,
task::{PidView, UserTaskRef},
};
#[inline(never)]
pub fn sys_getpid(current: &UserTaskRef) -> StarryResult<isize> {
Ok(current
.as_thread()
.proc_data
.identity()
.active_number()
.get() as isize)
}
pub fn sys_getppid(current: &crate::task::UserTaskRef) -> crate::StarryResult<isize> {
let parent = current
.as_thread()
.proc_data
.proc
.parent()
.ok_or(StarryError::NoSuchProcess)?;
Ok(PidView::new(current.as_thread().active_pid_namespace())
.visible_process_number(&parent.identity())
.map_or(0, |pid| pid.get() as isize))
}
pub fn sys_gettid(current: &crate::task::UserTaskRef) -> crate::StarryResult<isize> {
Ok(current.as_thread().user_tid().get() as _)
}
pub fn sys_getcpu(
current: &crate::task::UserTaskRef,
cpu: *mut u32,
node: *mut u32,
_tcache: usize,
) -> crate::StarryResult<isize> {
use ax_runtime::hal::percpu::this_cpu_id;
use crate::mm::VmMutPtr;
if !cpu.is_null() {
cpu.vm_write(current, this_cpu_id() as u32)?;
}
if !node.is_null() {
node.vm_write(current, 0)?;
}
Ok(0)
}
#[cfg(target_arch = "x86_64")]
#[derive(Debug, Eq, PartialEq, num_enum::TryFromPrimitive)]
#[repr(i32)]
enum ArchPrctlCode {
SetGs = 0x1001,
SetFs = 0x1002,
GetFs = 0x1003,
GetGs = 0x1004,
GetCpuid = 0x1011,
SetCpuid = 0x1012,
}
pub fn sys_set_tid_address(
current: &crate::task::UserTaskRef,
clear_child_tid: usize,
) -> crate::StarryResult<isize> {
let curr = current;
let thr = curr.as_thread();
thr.set_clear_child_tid(clear_child_tid);
Ok(thr.user_tid().get() as isize)
}
#[cfg(target_arch = "x86_64")]
pub fn sys_arch_prctl(
current: &crate::task::UserTaskRef,
uctx: &mut ax_runtime::hal::cpu::uspace::UserContext,
code: i32,
addr: usize,
) -> crate::StarryResult<isize> {
use crate::mm::VmMutPtr;
let code = ArchPrctlCode::try_from(code).map_err(|_| StarryError::InvalidInput)?;
debug!("sys_arch_prctl: code = {code:?}, addr = {addr:#x}");
match code {
ArchPrctlCode::GetFs => {
(addr as *mut usize).vm_write(current, uctx.tls())?;
Ok(0)
}
ArchPrctlCode::SetFs => {
uctx.set_tls(addr);
Ok(0)
}
ArchPrctlCode::GetGs => {
(addr as *mut usize).vm_write(current, uctx.gs_base as _)?;
Ok(0)
}
ArchPrctlCode::SetGs => {
uctx.gs_base = addr as _;
Ok(0)
}
ArchPrctlCode::GetCpuid => Ok(1),
ArchPrctlCode::SetCpuid => Err(crate::StarryError::NoSuchDevice),
}
}