more error handling

This commit is contained in:
nora 2023-10-03 21:48:54 +02:00
parent 3829dddcea
commit 862ef8dc22
4 changed files with 54 additions and 21 deletions

View file

@ -29,6 +29,42 @@ impl Debug for Error {
}
}
pub trait SyscallResultExt: Sized {
fn syscall_resultify<N: FromSyscall>(self) -> Result<N, Error>;
}
pub trait FromSyscall {
fn from_isize(n: isize) -> Self;
}
macro_rules! usize_int_impl {
($($ty:ty)*) => {
$(impl FromSyscall for $ty {
fn from_isize(n: isize) -> Self {
n as _
}
})*
};
}
usize_int_impl!(isize usize u64 i64 u32 i32);
impl FromSyscall for Fd {
fn from_isize(n: isize) -> Self {
Self(n as _)
}
}
impl SyscallResultExt for isize {
fn syscall_resultify<N: FromSyscall>(self) -> Result<N, Error> {
if (-4096..0).contains(&self) {
Err(Error(-self as i32))
} else {
Ok(N::from_isize(self))
}
}
}
pub trait IntoOkOrErrno {
type Int: ReturnInt;
fn into_ok_or_errno(self) -> Self::Int;

View file

@ -1,4 +1,7 @@
use crate::{utils::SharedThinCstr, println, error::Error};
use crate::{
error::{Error, SyscallResultExt},
utils::SharedThinCstr,
};
#[repr(transparent)]
pub struct Fd(pub i32);
@ -8,13 +11,9 @@ pub fn open(arg: SharedThinCstr<'_>, flags: i32) -> Result<Fd, Error> {
}
pub fn sys_open(arg: SharedThinCstr<'_>, flags: i32) -> Result<Fd, Error> {
let fd = unsafe { crate::syscall::syscall!(crate::syscall::SYS_OPEN, arg.as_raw(), flags) };
if fd < 0 {
println!("fd: {fd}");
unsafe {
crate::syscall::syscall!(crate::syscall::SYS_OPEN, arg.as_raw(), flags).syscall_resultify()
}
todo!()
}
pub const O_ACCMODE: i32 = 0o0003;

View file

@ -6,7 +6,10 @@ pub use traits::IoWrite;
use core::ffi::c_char;
use crate::{error::Error, sys::syscall};
use crate::{
error::{Error, SyscallResultExt},
sys::syscall,
};
pub const STDIN: i32 = 0;
pub const STDOUT: i32 = 1;
@ -35,12 +38,7 @@ macro_rules! println {
pub use println;
pub unsafe fn sys_write(fd: i32, buf: &[u8]) -> Result<usize, Error> {
let result = syscall::syscall!(syscall::SYS_WRITE, fd, buf.as_ptr(), buf.len()) as i64;
if result < 0 {
Err(Error(result as _))
} else {
Ok(result as _)
}
syscall::syscall!(syscall::SYS_WRITE, fd, buf.as_ptr(), buf.len()).syscall_resultify()
}
pub unsafe fn write_all(fd: i32, mut buf: &[u8]) -> Result<(), Error> {

View file

@ -7,7 +7,7 @@ pub use values::*;
#[macro_export]
macro_rules! syscall {
($number:expr) => {{
let out: i64;
let out: isize;
::core::arch::asm!(
"syscall",
in("rdi") $number,
@ -19,7 +19,7 @@ macro_rules! syscall {
out
}};
($number:expr, $arg1:expr) => {{
let out: i64;
let out: isize;
::core::arch::asm!(
"syscall",
in("rax") $number,
@ -32,7 +32,7 @@ macro_rules! syscall {
out
}};
($number:expr, $arg1:expr, $arg2:expr) => {{
let out: i64;
let out: isize;
::core::arch::asm!(
"syscall",
in("rax") $number,
@ -46,7 +46,7 @@ macro_rules! syscall {
out
}};
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr) => {{
let out: i64;
let out: isize;
::core::arch::asm!(
"syscall",
in("rax") $number,
@ -61,7 +61,7 @@ macro_rules! syscall {
out
}};
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr) => {{
let out: i64;
let out: isize;
::core::arch::asm!(
"syscall",
in("rax") $number,
@ -77,7 +77,7 @@ macro_rules! syscall {
out
}};
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr) => {{
let out: i64;
let out: isize;
::core::arch::asm!(
"syscall",
in("rax") $number,
@ -94,7 +94,7 @@ macro_rules! syscall {
out
}};
($number:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr, $arg6:expr) => {{
let out: i64;
let out: isize;
::core::arch::asm!(
"syscall",
in("rax") $number,