From 862ef8dc224e868e4f3e35e46142ffa448762f30 Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Tue, 3 Oct 2023 21:48:54 +0200 Subject: [PATCH] more error handling --- libuwuc/src/error/mod.rs | 36 +++++++++++++++++++++++++++ libuwuc/src/io/fd.rs | 13 +++++----- libuwuc/src/io/mod.rs | 12 ++++----- libuwuc/src/sys/x86_64/syscall/mod.rs | 14 +++++------ 4 files changed, 54 insertions(+), 21 deletions(-) diff --git a/libuwuc/src/error/mod.rs b/libuwuc/src/error/mod.rs index aaa6190..08cfcc1 100644 --- a/libuwuc/src/error/mod.rs +++ b/libuwuc/src/error/mod.rs @@ -29,6 +29,42 @@ impl Debug for Error { } } +pub trait SyscallResultExt: Sized { + fn syscall_resultify(self) -> Result; +} + +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(self) -> Result { + 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; diff --git a/libuwuc/src/io/fd.rs b/libuwuc/src/io/fd.rs index 11c25b6..be7d9cd 100644 --- a/libuwuc/src/io/fd.rs +++ b/libuwuc/src/io/fd.rs @@ -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 { } pub fn sys_open(arg: SharedThinCstr<'_>, flags: i32) -> Result { - 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; diff --git a/libuwuc/src/io/mod.rs b/libuwuc/src/io/mod.rs index a5a90a4..1a45752 100644 --- a/libuwuc/src/io/mod.rs +++ b/libuwuc/src/io/mod.rs @@ -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 { - 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> { diff --git a/libuwuc/src/sys/x86_64/syscall/mod.rs b/libuwuc/src/sys/x86_64/syscall/mod.rs index ac7003f..c0480b2 100644 --- a/libuwuc/src/sys/x86_64/syscall/mod.rs +++ b/libuwuc/src/sys/x86_64/syscall/mod.rs @@ -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,