diff --git a/redox-rt/src/protocol.rs b/redox-rt/src/protocol.rs index 74ba35fc49..05672aa3b8 100644 --- a/redox-rt/src/protocol.rs +++ b/redox-rt/src/protocol.rs @@ -11,3 +11,18 @@ pub struct ProcMeta { pub rns: u32, } unsafe impl plain::Plain for ProcMeta {} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +#[repr(usize)] +pub enum ProcCall { + Waitpid = 0, +} + +impl ProcCall { + pub fn try_from_raw(raw: usize) -> Option { + Some(match raw { + 0 => Self::Waitpid, + _ => return None, + }) + } +} diff --git a/redox-rt/src/sys.rs b/redox-rt/src/sys.rs index ef06097190..e2355f04de 100644 --- a/redox-rt/src/sys.rs +++ b/redox-rt/src/sys.rs @@ -1,16 +1,17 @@ use core::{ + mem::size_of, ptr::addr_of, sync::atomic::{AtomicU32, Ordering}, }; use syscall::{ error::{Error, Result, EINTR}, - RtSigInfo, TimeSpec, + CallFlags, RtSigInfo, TimeSpec, }; use crate::{ - arch::manually_enter_trampoline, proc::FdGuard, signal::tmp_disable_signals, Tcb, - DYNAMIC_PROC_INFO, + arch::manually_enter_trampoline, proc::FdGuard, protocol::ProcCall, + signal::tmp_disable_signals, Tcb, DYNAMIC_PROC_INFO, }; #[inline] @@ -114,13 +115,16 @@ pub unsafe fn sys_futex_wake(addr: *mut u32, num: u32) -> Result { .map(|awoken| awoken as u32) } pub fn sys_waitpid(pid: usize, status: &mut usize, flags: usize) -> Result { - wrapper(true, || { - /*syscall::waitpid( - pid, - status, - syscall::WaitFlags::from_bits(flags).expect("waitpid: invalid bit pattern"), - )*/ - todo!("waitpid") + wrapper(true, || unsafe { + let metadata = [ProcCall::Waitpid as usize, pid, flags]; + syscall::syscall5( + syscall::SYS_CALL, + **crate::current_proc_fd(), + status as *mut usize as usize, + size_of::(), + metadata.len() | CallFlags::empty().bits(), + metadata.as_ptr() as usize, + ) }) } pub fn posix_kill_thread(thread_fd: usize, signal: u32) -> Result<()> {