diff --git a/src/scheme/proc.rs b/src/scheme/proc.rs index 81c97b47..f0e27c71 100644 --- a/src/scheme/proc.rs +++ b/src/scheme/proc.rs @@ -11,12 +11,11 @@ use crate::{ ptrace, scheme::{self, FileHandle, KernelScheme}, syscall::{ - self, - data::{GrantDesc, Map, PtraceEvent, SenderInfo, SetSighandlerData, Stat}, + data::{GrantDesc, Map, SetSighandlerData, Stat}, error::*, flag::*, - usercopy::{UserSliceRo, UserSliceWo}, - EnvRegisters, FloatRegisters, IntRegisters, KillMode, + usercopy::{UserSliceRo, UserSliceRw, UserSliceWo}, + EnvRegisters, FloatRegisters, IntRegisters, }, }; @@ -25,7 +24,7 @@ use ::syscall::{ProcSchemeAttrs, SigProcControl, Sigcontrol}; use alloc::{ boxed::Box, collections::{btree_map::Entry, BTreeMap}, - string::{String, ToString}, + string::String, sync::{Arc, Weak}, vec::Vec, }; @@ -145,12 +144,6 @@ struct Handle { context: Arc>, kind: ContextHandle, } -#[derive(Clone, Copy, PartialEq, Eq)] -enum Attr { - Uid, - Gid, - // TODO: namespace, tid, etc. -} pub struct ProcScheme; static NEXT_ID: AtomicUsize = AtomicUsize::new(1); @@ -507,6 +500,34 @@ impl KernelScheme for ProcScheme { Handle { context, kind } => kind.kreadoff(id, context, buf, offset), } } + fn kcall( + &self, + id: usize, + _payload: UserSliceRw, + _flags: CallFlags, + metadata: &[u64], + ) -> Result { + // TODO: simplify + let handle = { + let mut handles = HANDLES.write(); + let handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; + handle.clone() + }; + + let ContextHandle::OpenViaDup = handle.kind else { + return Err(Error::new(EBADF)); + }; + + let verb: u8 = (*metadata.get(0).ok_or(Error::new(EINVAL))?) + .try_into() + .map_err(|_| Error::new(EINVAL))?; + let verb = ProcSchemeVerb::try_from_raw(verb).ok_or(Error::new(EINVAL))?; + + match verb { + ProcSchemeVerb::Iopl => context::current().write().set_userspace_io_allowed(true), + } + Ok(0) + } fn kwriteoff( &self, id: usize,