Skip to main content

ax_runtime/
error.rs

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