feature: x86_64 all syscalls

This commit is contained in:
2022-03-22 18:36:45 +02:00
parent 07b62026fa
commit a318bf0c2c
2 changed files with 31 additions and 17 deletions
+13
View File
@@ -160,6 +160,19 @@ impl Process {
// thread.enter_signal(signal, table);
// }
/// Crates a new thread in the process
pub fn new_user_thread(&self, entry: usize, stack: usize, arg: usize) -> Result<Tid, Errno> {
let mut lock = self.inner.lock();
let table = Self::space_phys(&mut lock);
let thread = Thread::new_user(lock.id, entry, stack, arg, table)?;
let tid = thread.id();
lock.threads.push(tid);
SCHED.enqueue(tid);
Ok(tid)
}
/// Creates a new kernel process
pub fn new_kernel(entry: extern "C" fn(usize) -> !, arg: usize) -> Result<ProcessRef, Errno> {
let id = new_kernel_pid();
+18 -17
View File
@@ -2,7 +2,7 @@
use crate::arch::{machine, platform::ForkFrame};
use crate::debug::Level;
// use crate::dev::timer::TimestampSource;
use crate::dev::timer::TimestampSource;
use crate::fs::create_filesystem;
use crate::mem::{
phys::PageUsage,
@@ -249,16 +249,17 @@ fn _syscall(num: SystemCall, args: &[usize]) -> Result<usize, Errno> {
proc.manipulate_space(move |space| space.free(addr, len / 4096))?;
Ok(0)
}
// // Process
// SystemCall::Clone => {
// let entry = args[0];
// let stack = args[1];
// let arg = args[2];
// Process::current()
// .new_user_thread(entry, stack, arg)
// .map(|e| u32::from(e) as usize)
// }
// Process
SystemCall::Clone => {
let entry = args[0];
let stack = args[1];
let arg = args[2];
Process::current()
.new_user_thread(entry, stack, arg)
.map(|e| u32::from(e) as usize)
}
SystemCall::Exec => {
let filename = arg::str_ref(args[0], args[1])?;
let argv = arg::struct_buf_ref::<&str>(args[2], args[3])?;
@@ -412,11 +413,11 @@ fn _syscall(num: SystemCall, args: &[usize]) -> Result<usize, Errno> {
Ok(u32::from(proc.pgid()) as usize)
}
// // System
// SystemCall::GetCpuTime => {
// let time = machine::local_timer().timestamp()?;
// Ok(time.as_nanos() as usize)
// }
// System
SystemCall::GetCpuTime => {
let time = machine::local_timer().timestamp()?;
Ok(time.as_nanos() as usize)
}
SystemCall::Mount => {
let target = arg::str_ref(args[0], args[1])?;
let options = arg::struct_ref::<MountOptions>(args[2])?;
@@ -446,8 +447,8 @@ fn _syscall(num: SystemCall, args: &[usize]) -> Result<usize, Errno> {
Ok(args[1])
}
// // Handled elsewhere
// SystemCall::Fork => unreachable!(),
// Handled elsewhere
SystemCall::Fork => unreachable!(),
_ => panic!("Unimplemented: {:?}", num),
}
}