Added shutdown system call

This commit is contained in:
Samy Solhi 2023-03-29 17:21:34 +02:00
parent e117ec2132
commit 2981925401
2 changed files with 70 additions and 26 deletions

View File

@ -1,7 +1,7 @@
use crate::simulator::machine::{ExceptionType, Machine};
use crate::simulator::{machine::{ExceptionType, Machine}, error::{MachineOk, MachineError}};
pub const SC_HALT: u8 = 0;
pub const SC_SHUTDOWN: u8 = 0;
pub const SC_EXIT: u8 = 1;
pub const SC_EXEC: u8 = 2;
pub const SC_JOIN: u8 = 3;
@ -38,7 +38,7 @@ pub const SC_MMAP: u8 = 33;
pub const SC_DEBUG: u8 = 34;
pub fn call(exception: ExceptionType, machine: &Machine) {
pub fn call(exception: ExceptionType, machine: &Machine) -> Result<MachineOk, MachineError> {
match exception {
ExceptionType::NoException => todo!(),
@ -53,8 +53,45 @@ pub fn call(exception: ExceptionType, machine: &Machine) {
}
}
fn syscall(machine: &Machine) {
let call_type = machine.read_int_register(17);
fn syscall(machine: &Machine) -> Result<MachineOk, MachineError> {
let call_type = machine.read_int_register(17) as u8;
todo!()
match call_type {
SC_SHUTDOWN => Ok(MachineOk::Shutdown),
SC_EXIT => todo!(),
SC_EXEC => todo!(),
SC_JOIN => todo!(),
SC_CREATE => todo!(),
SC_OPEN => todo!(),
SC_READ => todo!(),
SC_WRITE => todo!(),
SC_SEEK => todo!(),
SC_CLOSE => todo!(),
SC_NEW_THREAD => todo!(),
SC_YIELD => todo!(),
SC_PERROR => todo!(),
SC_P => todo!(),
SC_V => todo!(),
SC_SEM_CREATE => todo!(),
SC_SEM_DESTROY => todo!(),
SC_LOCK_CREATE => todo!(),
SC_LOCK_DESTROY => todo!(),
SC_LOCK_ACQUIRE => todo!(),
SC_LOCK_RELEASE => todo!(),
SC_COND_CREATE => todo!(),
SC_COND_DESTROY => todo!(),
SC_COND_WAIT => todo!(),
SC_COND_SIGNAL => todo!(),
SC_COND_BROADCAST => todo!(),
SC_TTY_SEND => todo!(),
SC_TTY_RECEIVE => todo!(),
SC_MKDIR => todo!(),
SC_RMDIR => todo!(),
SC_REMOVE => todo!(),
SC_FSLIST => todo!(),
SC_SYS_TIME => todo!(),
SC_MMAP => todo!(),
SC_DEBUG => todo!(),
_ => todo!()
}
}

View File

@ -230,7 +230,13 @@ impl Machine {
self.set_status(MachineStatus::SystemMode);
// Handle the interruption
exception::call(exception, self); // todo: return error if the syscall code is invalid
match exception::call(exception, self) {
Ok(MachineOk::Shutdown) => {
self.set_status(MachineStatus::UserMode);
return Ok(MachineOk::Shutdown);
}
_ => ()
} // todo: return error if the syscall code is invalid
self.set_status(MachineStatus::UserMode);
Ok(MachineOk::Ok)
}
@ -243,7 +249,8 @@ impl Machine {
pub fn run(&mut self) {
loop {
match self.one_instruction() {
Ok(_) => println!("hello"),
Ok(MachineOk::Ok) => println!("hello"),
Ok(MachineOk::Shutdown) => break,
Err(e) => { if e.to_string().contains("System") { break; } panic!("FATAL at pc {} -> {}", self.pc, e) }
}
}