Skip to main content

ax_runtime/
error.rs

1use ax_alloc::AllocError;
2#[cfg(feature = "paging")]
3use ax_hal::cache::TlbShootdownError;
4#[cfg(feature = "irq")]
5use ax_hal::irq::IrqError;
6#[cfg(feature = "paging")]
7use ax_mm::MmError;
8#[cfg(feature = "fs")]
9use axfs_ng_vfs::VfsError;
10#[cfg(feature = "paging")]
11use axklib::KlibError;
12#[cfg(all(feature = "irq", feature = "multitask"))]
13use rdif_serial::ConfigError;
14
15/// Errors owned by the ArceOS runtime layer.
16#[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)]
17pub enum RuntimeError {
18    /// Address-space management failed while updating runtime mappings.
19    #[cfg(feature = "paging")]
20    #[error(transparent)]
21    Mm(#[from] MmError),
22    /// A cross-CPU TLB invalidation failed after a mapping update.
23    #[cfg(feature = "paging")]
24    #[error(transparent)]
25    TlbShootdown(#[from] TlbShootdownError),
26    /// Interrupt discovery or registration failed.
27    #[cfg(feature = "irq")]
28    #[error(transparent)]
29    Irq(#[from] IrqError),
30    /// Runtime-owned storage allocation failed.
31    #[error(transparent)]
32    Allocation(#[from] AllocError),
33    /// A filesystem operation used by a runtime adapter failed.
34    #[cfg(feature = "fs")]
35    #[error(transparent)]
36    Vfs(#[from] VfsError),
37    /// A UART rejected its requested configuration.
38    #[cfg(all(feature = "irq", feature = "multitask"))]
39    #[error(transparent)]
40    SerialConfig(#[from] ConfigError),
41    /// A platform console ownership transition was requested out of order.
42    #[cfg(all(feature = "irq", feature = "multitask"))]
43    #[error(transparent)]
44    ConsoleHandoff(#[from] ax_hal::console::ConsoleHandoffError),
45    /// Another serial runtime already owns console log routing.
46    #[cfg(all(feature = "irq", feature = "multitask"))]
47    #[error("another serial runtime already owns console routing")]
48    SerialConsoleBusy,
49    /// The runtime console handoff failed after early ownership was revoked.
50    #[cfg(all(feature = "irq", feature = "multitask"))]
51    #[error("runtime console failed closed")]
52    ConsoleFailedClosed,
53    /// A serial operation requires a running port.
54    #[error("serial runtime is not started")]
55    SerialNotStarted,
56    /// The bounded serial control queue is full.
57    #[error("serial control queue is busy")]
58    SerialControlBusy,
59    /// A bounded runtime queue has no capacity without waiting.
60    #[error("runtime operation would block")]
61    WouldBlock,
62    /// The selected runtime capability does not support the operation.
63    #[error("runtime operation is not supported")]
64    OperationNotSupported,
65    /// A CPU index is outside the runtime's online CPU set.
66    #[error("invalid runtime CPU index {cpu}")]
67    InvalidCpu { cpu: usize },
68}
69
70/// A result returned by an ArceOS runtime-owned operation.
71pub type RuntimeResult<T = ()> = Result<T, RuntimeError>;
72
73/// Adapt a runtime-domain error at the external kernel capability boundary.
74#[cfg(feature = "paging")]
75pub(crate) fn runtime_error_to_klib_error(error: RuntimeError) -> KlibError {
76    match error {
77        #[cfg(feature = "paging")]
78        RuntimeError::Mm(error) => match error {
79            MmError::InvalidInput(_) => KlibError::InvalidInput,
80            MmError::NoMemory => KlibError::NoMemory,
81            MmError::AlreadyExists => KlibError::AlreadyExists,
82            MmError::BadAddress => KlibError::BadAddress,
83            MmError::BadState(_) => KlibError::BadState,
84            MmError::Unsupported => KlibError::Unsupported,
85        },
86        #[cfg(feature = "paging")]
87        RuntimeError::TlbShootdown(error) => match error {
88            TlbShootdownError::CpuOffline | TlbShootdownError::Unsupported => {
89                KlibError::Unsupported
90            }
91            TlbShootdownError::Timeout => KlibError::TimedOut,
92            TlbShootdownError::Platform => KlibError::Io,
93        },
94        #[cfg(feature = "irq")]
95        RuntimeError::Irq(error) => match error {
96            IrqError::InvalidIrq | IrqError::InvalidCpu => KlibError::InvalidInput,
97            IrqError::CpuOffline | IrqError::Unsupported => KlibError::Unsupported,
98            IrqError::Timeout => KlibError::TimedOut,
99            IrqError::Busy | IrqError::InIrqContext => KlibError::ResourceBusy,
100            IrqError::NoMemory => KlibError::NoMemory,
101            IrqError::NotFound => KlibError::NotFound,
102            IrqError::Controller => KlibError::Io,
103        },
104        RuntimeError::Allocation(_) => KlibError::NoMemory,
105        #[cfg(feature = "fs")]
106        RuntimeError::Vfs(error) => match error {
107            VfsError::AlreadyExists => KlibError::AlreadyExists,
108            VfsError::BadAddress => KlibError::BadAddress,
109            VfsError::NoMemory => KlibError::NoMemory,
110            VfsError::ResourceBusy => KlibError::ResourceBusy,
111            VfsError::TimedOut => KlibError::TimedOut,
112            VfsError::Unsupported | VfsError::OperationNotSupported => KlibError::Unsupported,
113            _ => KlibError::Io,
114        },
115        #[cfg(all(feature = "irq", feature = "multitask"))]
116        RuntimeError::SerialConfig(error) => match error {
117            ConfigError::InvalidBaudrate
118            | ConfigError::UnsupportedDataBits
119            | ConfigError::UnsupportedStopBits
120            | ConfigError::UnsupportedParity => KlibError::InvalidInput,
121            ConfigError::Timeout => KlibError::TimedOut,
122            ConfigError::RegisterError => KlibError::Io,
123        },
124        #[cfg(all(feature = "irq", feature = "multitask"))]
125        RuntimeError::ConsoleHandoff(_) => KlibError::BadState,
126        #[cfg(all(feature = "irq", feature = "multitask"))]
127        RuntimeError::SerialConsoleBusy => KlibError::ResourceBusy,
128        #[cfg(all(feature = "irq", feature = "multitask"))]
129        RuntimeError::ConsoleFailedClosed => KlibError::BadState,
130        RuntimeError::SerialNotStarted => KlibError::BadState,
131        RuntimeError::SerialControlBusy => KlibError::ResourceBusy,
132        RuntimeError::WouldBlock => KlibError::ResourceBusy,
133        RuntimeError::OperationNotSupported => KlibError::Unsupported,
134        RuntimeError::InvalidCpu { .. } => KlibError::InvalidInput,
135    }
136}