WIP: User scheme
This commit is contained in:
parent
abdbadfea3
commit
c512d04378
5 changed files with 143 additions and 208 deletions
|
@ -1,5 +1,3 @@
|
|||
use super::{Error, Result};
|
||||
|
||||
/// System call list
|
||||
/// See http://syscalls.kernelgrok.com/ for numbers
|
||||
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
|
||||
|
@ -42,26 +40,25 @@ pub enum Call {
|
|||
/// Convert numbers to calls
|
||||
/// See http://syscalls.kernelgrok.com/
|
||||
impl Call {
|
||||
//TODO: Return Option<Call>
|
||||
pub fn from(number: usize) -> Result<Call> {
|
||||
pub fn from(number: usize) -> Option<Call> {
|
||||
match number {
|
||||
1 => Ok(Call::Exit),
|
||||
3 => Ok(Call::Read),
|
||||
4 => Ok(Call::Write),
|
||||
5 => Ok(Call::Open),
|
||||
6 => Ok(Call::Close),
|
||||
7 => Ok(Call::WaitPid),
|
||||
11 => Ok(Call::Exec),
|
||||
12 => Ok(Call::ChDir),
|
||||
20 => Ok(Call::GetPid),
|
||||
41 => Ok(Call::Dup),
|
||||
45 => Ok(Call::Brk),
|
||||
110 => Ok(Call::Iopl),
|
||||
118 => Ok(Call::FSync),
|
||||
120 => Ok(Call::Clone),
|
||||
158 => Ok(Call::SchedYield),
|
||||
183 => Ok(Call::GetCwd),
|
||||
_ => Err(Error::NoCall)
|
||||
1 => Some(Call::Exit),
|
||||
3 => Some(Call::Read),
|
||||
4 => Some(Call::Write),
|
||||
5 => Some(Call::Open),
|
||||
6 => Some(Call::Close),
|
||||
7 => Some(Call::WaitPid),
|
||||
11 => Some(Call::Exec),
|
||||
12 => Some(Call::ChDir),
|
||||
20 => Some(Call::GetPid),
|
||||
41 => Some(Call::Dup),
|
||||
45 => Some(Call::Brk),
|
||||
110 => Some(Call::Iopl),
|
||||
118 => Some(Call::FSync),
|
||||
120 => Some(Call::Clone),
|
||||
158 => Some(Call::SchedYield),
|
||||
183 => Some(Call::GetCwd),
|
||||
_ => None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,4 +31,33 @@ pub enum Error {
|
|||
NoCall = 38
|
||||
}
|
||||
|
||||
impl Error {
|
||||
pub fn from(number: usize) -> Option<Error> {
|
||||
match number {
|
||||
1 => Some(Error::NotPermitted),
|
||||
2 => Some(Error::NoEntry),
|
||||
3 => Some(Error::NoProcess),
|
||||
8 => Some(Error::NoExec),
|
||||
9 => Some(Error::BadFile),
|
||||
11 => Some(Error::TryAgain),
|
||||
14 => Some(Error::Fault),
|
||||
17 => Some(Error::FileExists),
|
||||
19 => Some(Error::NoDevice),
|
||||
22 => Some(Error::InvalidValue),
|
||||
24 => Some(Error::TooManyFiles),
|
||||
29 => Some(Error::IllegalSeek),
|
||||
38 => Some(Error::NoCall),
|
||||
_ => None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub type Result<T> = ::core::result::Result<T, Error>;
|
||||
|
||||
pub fn convert_to_result(number: usize) -> Result<usize> {
|
||||
if let Some(err) = Error::from((-(number as isize)) as usize) {
|
||||
Err(err)
|
||||
} else {
|
||||
Ok(number)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ pub extern fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize
|
|||
#[inline(always)]
|
||||
fn inner(a: usize, b: usize, c: usize, d: usize, e: usize, _f: usize, stack: usize) -> Result<usize> {
|
||||
match Call::from(a) {
|
||||
Ok(call) => match call {
|
||||
Some(call) => match call {
|
||||
Call::Exit => exit(b),
|
||||
Call::Read => read(b, validate_slice_mut(c as *mut u8, d)?),
|
||||
Call::Write => write(b, validate_slice(c as *const u8, d)?),
|
||||
|
@ -44,9 +44,9 @@ pub extern fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize
|
|||
Call::SchedYield => sched_yield(),
|
||||
Call::GetCwd => getcwd(validate_slice_mut(b as *mut u8, c)?)
|
||||
},
|
||||
Err(err) => {
|
||||
None => {
|
||||
println!("Unknown syscall {}", a);
|
||||
Err(err)
|
||||
Err(Error::NoCall)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue