use core::ffi::{c_char, CStr};
pub use kernel_user_link::process::{
process_metadata, PriorityLevel, ProcessMetadata, SpawnFileMapping,
};
use kernel_user_link::{
call_syscall,
syscalls::{SyscallError, SYS_EXIT, SYS_PRIORITY, SYS_SPAWN, SYS_WAIT_PID},
};
pub unsafe fn exit(code: i32) -> ! {
unsafe {
call_syscall!(
SYS_EXIT,
code as u64, )
.unwrap();
}
unreachable!("exit syscall should not return")
}
pub unsafe fn spawn(
path: &CStr,
argv: &[*const c_char],
file_mappings: &[SpawnFileMapping],
) -> Result<u64, SyscallError> {
unsafe {
call_syscall!(
SYS_SPAWN,
path.as_ptr() as u64, argv.as_ptr() as u64, file_mappings.as_ptr() as u64, file_mappings.len() as u64 )
}
}
pub unsafe fn wait_for_pid(pid: u64, block: bool) -> Result<i32, SyscallError> {
unsafe {
call_syscall!(
SYS_WAIT_PID,
pid, block as u64 )
.map(|x| x as i32)
}
}
pub unsafe fn priority(
pid: u64,
priority_level: Option<PriorityLevel>,
) -> Result<PriorityLevel, SyscallError> {
unsafe {
call_syscall!(
SYS_PRIORITY,
pid, priority_level.map_or(0, |x| x.to_u64()) )
.map(|x| PriorityLevel::from_u64(x).unwrap())
}
}