Convert ErrorCode to a usize to match Tock 2.0 semantics and add constants for known error codes. Add ReturnType, a Tock 2.0 construct.
diff --git a/core/platform/src/error_code.rs b/core/platform/src/error_code.rs
index ca1c657..99fa474 100644
--- a/core/platform/src/error_code.rs
+++ b/core/platform/src/error_code.rs
@@ -1,25 +1,36 @@
-/// An error code returned by the kernel. Tock's system calls return errors as a
-/// negative `isize`. This wraps the isize, and is useful for adding type safety
-/// to APIs.
-
+/// A system call error code. This can either be an error code returned by the
+/// kernel or BADRVAL, which indicates the kernel returned the wrong type of
+/// response to a system call.
+// ErrorCode is not an enum so that conversion from the kernel's return value (a
+// `usize` in a register) is free.
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct ErrorCode {
- // Note: value *should* always be negative, but we do not *verify* that so
- // unsafe code cannot rely on value being negative.
- value: isize,
+ value: usize,
}
-impl ErrorCode {
- // Converts the given isize into an ErrorCode. Note that the isize should be
- // negative, although that is not verified to reduce code size. We don't
- // implement From because not every isize converts sensibly to an ErrorCode.
- pub fn new(value: isize) -> ErrorCode {
+impl From<usize> for ErrorCode {
+ fn from(value: usize) -> ErrorCode {
ErrorCode { value }
}
}
-impl Into<isize> for ErrorCode {
- fn into(self) -> isize {
- self.value
+impl From<ErrorCode> for usize {
+ fn from(error_code: ErrorCode) -> usize {
+ error_code.value
}
}
+
+pub const FAIL: ErrorCode = ErrorCode { value: 1 };
+pub const BUSY: ErrorCode = ErrorCode { value: 2 };
+pub const ALREADY: ErrorCode = ErrorCode { value: 3 };
+pub const OFF: ErrorCode = ErrorCode { value: 4 };
+pub const RESERVE: ErrorCode = ErrorCode { value: 5 };
+pub const INVALID: ErrorCode = ErrorCode { value: 6 };
+pub const SIZE: ErrorCode = ErrorCode { value: 7 };
+pub const CANCEL: ErrorCode = ErrorCode { value: 8 };
+pub const NOMEM: ErrorCode = ErrorCode { value: 9 };
+pub const NOSUPPORT: ErrorCode = ErrorCode { value: 10 };
+pub const NODEVICE: ErrorCode = ErrorCode { value: 11 };
+pub const UNINSTALLED: ErrorCode = ErrorCode { value: 12 };
+pub const NOACK: ErrorCode = ErrorCode { value: 13 };
+pub const BADRVAL: ErrorCode = ErrorCode { value: 1024 };
diff --git a/core/platform/src/lib.rs b/core/platform/src/lib.rs
index 0a9f936..9343145 100644
--- a/core/platform/src/lib.rs
+++ b/core/platform/src/lib.rs
@@ -1,12 +1,14 @@
#![no_std]
mod async_traits;
-mod error_code;
+pub mod error_code;
mod raw_syscalls;
+pub mod return_type;
mod syscalls;
mod syscalls_impl;
pub use async_traits::{CallbackContext, FreeCallback, Locator, MethodCallback};
pub use error_code::ErrorCode;
pub use raw_syscalls::{OneArgMemop, RawSyscalls, YieldType, ZeroArgMemop};
+pub use return_type::ReturnType;
pub use syscalls::Syscalls;
diff --git a/core/platform/src/return_type.rs b/core/platform/src/return_type.rs
new file mode 100644
index 0000000..5d491b2
--- /dev/null
+++ b/core/platform/src/return_type.rs
@@ -0,0 +1,29 @@
+/// `ReturnType` describes what value type the kernel has returned.
+// ReturnType is not an enum so that it can be converted from a u32 for free.
+#[derive(Clone, Copy, PartialEq, Eq)]
+pub struct ReturnType {
+ value: u32,
+}
+
+impl From<u32> for ReturnType {
+ fn from(value: u32) -> ReturnType {
+ ReturnType { value }
+ }
+}
+
+impl From<ReturnType> for u32 {
+ fn from(return_type: ReturnType) -> u32 {
+ return_type.value
+ }
+}
+
+pub const FAILURE: ReturnType = ReturnType { value: 0 };
+pub const FAILURE_U32: ReturnType = ReturnType { value: 1 };
+pub const FAILURE_2_U32: ReturnType = ReturnType { value: 2 };
+pub const FAILURE_U64: ReturnType = ReturnType { value: 3 };
+pub const SUCCESS: ReturnType = ReturnType { value: 128 };
+pub const SUCCESS_U32: ReturnType = ReturnType { value: 129 };
+pub const SUCCESS_2_U32: ReturnType = ReturnType { value: 130 };
+pub const SUCCESS_U64: ReturnType = ReturnType { value: 131 };
+pub const SUCCESS_3_U32: ReturnType = ReturnType { value: 132 };
+pub const SUCCESS_U32_U64: ReturnType = ReturnType { value: 133 };
diff --git a/core/platform/src/syscalls_impl.rs b/core/platform/src/syscalls_impl.rs
index 0af15c5..8f24467 100644
--- a/core/platform/src/syscalls_impl.rs
+++ b/core/platform/src/syscalls_impl.rs
@@ -1,6 +1,6 @@
//! Implements `Syscalls` for all types that implement `RawSyscalls`.
-use crate::{RawSyscalls, Syscalls, YieldType};
+use crate::{return_type, RawSyscalls, Syscalls, YieldType};
impl<S: RawSyscalls> Syscalls for S {
// -------------------------------------------------------------------------
@@ -12,7 +12,6 @@
}
fn yield_no_wait() -> bool {
- // TODO: Introduce a return type abstraction so this 0 isn't hardcoded.
- Self::raw_yield(YieldType::NoWait) != 0
+ Self::raw_yield(YieldType::NoWait) != return_type::FAILURE.into()
}
}