diff --git a/context/context.rs b/context/context.rs index bb86bf1ec4f6575a0a6cee561bf6f75c311f4b50..6b4f7c7cfe33dbd14339157bb8ca8789e8bac267 100644 --- a/context/context.rs +++ b/context/context.rs @@ -11,7 +11,7 @@ use super::memory::{Memory, SharedMemory}; pub enum Status { Runnable, Blocked, - Exited + Exited(usize) } /// A context, which identifies either a process or a thread diff --git a/context/mod.rs b/context/mod.rs index 7c85c7f46b77c46650057f50a24dcc3531de9311..041eec60922895ebe30056b5300b659fd37fe9fc 100644 --- a/context/mod.rs +++ b/context/mod.rs @@ -57,3 +57,7 @@ pub fn contexts() -> RwLockReadGuard<'static, ContextList> { pub fn contexts_mut() -> RwLockWriteGuard<'static, ContextList> { CONTEXTS.call_once(init_contexts).write() } + +pub fn context_id() -> usize { + CONTEXT_ID.load(Ordering::SeqCst) +} diff --git a/syscall/process.rs b/syscall/process.rs index 4530297a7470ab014d4794bc5859815f2d7644ca..fb21a7097870ee2146ecda2317075d4224426e6d 100644 --- a/syscall/process.rs +++ b/syscall/process.rs @@ -52,10 +52,10 @@ pub const CLONE_FS: usize = 0x200; pub const CLONE_FILES: usize = 0x400; pub const CLONE_VFORK: usize = 0x4000; pub fn clone(flags: usize, stack_base: usize) -> Result<usize> { - //TODO: Implement flags //TODO: Copy on write? println!("Clone {:X}: {:X}", flags, stack_base); + let ppid; let pid; { let arch; @@ -71,6 +71,9 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> { let contexts = context::contexts(); let context_lock = contexts.current().ok_or(Error::NoProcess)?; let context = context_lock.read(); + + ppid = context.id; + arch = context.arch.clone(); if let Some(ref stack) = context.kstack { @@ -300,8 +303,6 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> { } pub fn exit(status: usize) -> ! { - println!("Exit {}", status); - { let contexts = context::contexts(); let context_lock = contexts.current().expect("tried to exit without context"); @@ -309,7 +310,7 @@ pub fn exit(status: usize) -> ! { context.image.clear(); drop(context.heap.take()); drop(context.stack.take()); - context.status = context::Status::Exited; + context.status = context::Status::Exited(status); } unsafe { context::switch(); } @@ -365,6 +366,7 @@ pub fn sched_yield() -> Result<usize> { } pub fn waitpid(pid: usize, _status_ptr: usize, _options: usize) -> Result<usize> { + //TODO: Implement status_ptr and options loop { { let mut exited = false; @@ -373,7 +375,8 @@ pub fn waitpid(pid: usize, _status_ptr: usize, _options: usize) -> Result<usize> let contexts = context::contexts(); let context_lock = contexts.get(pid).ok_or(Error::NoProcess)?; let context = context_lock.read(); - if context.status == context::Status::Exited { + if let context::Status::Exited(status) = context.status { + //TODO: set status_ptr exited = true; } }