From 2501a858743ba41fba5db967c925fe3eb6d966d3 Mon Sep 17 00:00:00 2001 From: Mark Poliakov Date: Wed, 16 Jul 2025 11:00:47 +0300 Subject: [PATCH] runtime: move pidfd support to yggdrasil-rt --- lib/runtime/src/io/mod.rs | 14 ++++++++++- userspace/lib/cross/src/sys/yggdrasil/pid.rs | 25 +++++++++++++------- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/lib/runtime/src/io/mod.rs b/lib/runtime/src/io/mod.rs index a254a341..5bef99d7 100644 --- a/lib/runtime/src/io/mod.rs +++ b/lib/runtime/src/io/mod.rs @@ -19,7 +19,19 @@ pub use paths::*; use core::mem::MaybeUninit; -use abi::{error::Error, option::OptionValue}; +use abi::{error::Error, option::OptionValue, process::ProcessId}; + +pub fn read_pid_fd(fd: RawFd) -> Result<(ProcessId, i32), Error> { + let mut buffer = [0; size_of::() + size_of::()]; + let len = unsafe { crate::sys::read(fd, &mut buffer) }?; + assert_eq!(len, buffer.len()); + let mut word = [0; size_of::()]; + word.copy_from_slice(&buffer[0..4]); + let pid = unsafe { ProcessId::from_raw(u32::from_ne_bytes(word)) }; + word.copy_from_slice(&buffer[4..8]); + let status = i32::from_ne_bytes(word); + Ok((pid, status)) +} pub fn remove_file(at: Option, path: &str) -> Result<(), Error> { unsafe { crate::sys::remove(at, path, RemoveFlags::empty()) } diff --git a/userspace/lib/cross/src/sys/yggdrasil/pid.rs b/userspace/lib/cross/src/sys/yggdrasil/pid.rs index d7ba2f2e..3a88ba24 100644 --- a/userspace/lib/cross/src/sys/yggdrasil/pid.rs +++ b/userspace/lib/cross/src/sys/yggdrasil/pid.rs @@ -1,28 +1,37 @@ use std::{ io, - os::{ - fd::{AsRawFd, RawFd}, - yggdrasil::io::pid::{PidFd as YggPidFd, ProcessId}, - }, + os::fd::{AsRawFd, FromRawFd, OwnedFd, RawFd}, +}; + +use runtime::rt::{ + process::{ProcessId, ProcessWait, WaitFlags}, + sys as syscall, }; use crate::sys::PidFd; -pub struct PidFdImpl(YggPidFd); +pub struct PidFdImpl { + fd: OwnedFd, +} impl PidFd for PidFdImpl { fn new(pid: u32) -> io::Result { let pid = unsafe { ProcessId::from_raw(pid) }; - YggPidFd::child(pid, false).map(Self) + let target = ProcessWait::Process(pid); + let fd = unsafe { syscall::create_pid(&target, WaitFlags::NON_BLOCKING) } + .map_err(io::Error::from)?; + let fd = unsafe { OwnedFd::from_raw_fd(fd) }; + Ok(Self { fd }) } fn exit_status(&self) -> io::Result { - self.0.status() + let (_, code) = runtime::rt::io::read_pid_fd(self.fd.as_raw_fd())?; + Ok(code) } } impl AsRawFd for PidFdImpl { fn as_raw_fd(&self) -> RawFd { - self.0.as_raw_fd() + self.fd.as_raw_fd() } }