use ax_alloc::AllocError;
#[cfg(feature = "paging")]
use ax_hal::cache::TlbShootdownError;
#[cfg(feature = "irq")]
use ax_hal::irq::IrqError;
#[cfg(feature = "paging")]
use ax_mm::MmError;
#[cfg(feature = "fs")]
use axfs_ng_vfs::VfsError;
#[cfg(feature = "paging")]
use axklib::KlibError;
#[cfg(all(feature = "irq", feature = "multitask"))]
use rdif_serial::ConfigError;
#[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)]
pub enum RuntimeError {
#[cfg(feature = "paging")]
#[error(transparent)]
Mm(#[from] MmError),
#[cfg(feature = "paging")]
#[error(transparent)]
TlbShootdown(#[from] TlbShootdownError),
#[cfg(feature = "irq")]
#[error(transparent)]
Irq(#[from] IrqError),
#[error(transparent)]
Allocation(#[from] AllocError),
#[cfg(feature = "fs")]
#[error(transparent)]
Vfs(#[from] VfsError),
#[cfg(all(feature = "irq", feature = "multitask"))]
#[error(transparent)]
SerialConfig(#[from] ConfigError),
#[cfg(all(feature = "irq", feature = "multitask"))]
#[error(transparent)]
ConsoleHandoff(#[from] ax_hal::console::ConsoleHandoffError),
#[cfg(all(feature = "irq", feature = "multitask"))]
#[error("another serial runtime already owns console routing")]
SerialConsoleBusy,
#[cfg(all(feature = "irq", feature = "multitask"))]
#[error("runtime console failed closed")]
ConsoleFailedClosed,
#[error("serial runtime is not started")]
SerialNotStarted,
#[error("serial control queue is busy")]
SerialControlBusy,
#[error("runtime operation would block")]
WouldBlock,
#[error("runtime operation is not supported")]
OperationNotSupported,
#[error("invalid runtime CPU index {cpu}")]
InvalidCpu { cpu: usize },
}
pub type RuntimeResult<T = ()> = Result<T, RuntimeError>;
#[cfg(feature = "paging")]
pub(crate) fn runtime_error_to_klib_error(error: RuntimeError) -> KlibError {
match error {
#[cfg(feature = "paging")]
RuntimeError::Mm(error) => match error {
MmError::InvalidInput(_) => KlibError::InvalidInput,
MmError::NoMemory => KlibError::NoMemory,
MmError::AlreadyExists => KlibError::AlreadyExists,
MmError::BadAddress => KlibError::BadAddress,
MmError::BadState(_) => KlibError::BadState,
MmError::Unsupported => KlibError::Unsupported,
},
#[cfg(feature = "paging")]
RuntimeError::TlbShootdown(error) => match error {
TlbShootdownError::CpuOffline | TlbShootdownError::Unsupported => {
KlibError::Unsupported
}
TlbShootdownError::Timeout => KlibError::TimedOut,
TlbShootdownError::Platform => KlibError::Io,
},
#[cfg(feature = "irq")]
RuntimeError::Irq(error) => match error {
IrqError::InvalidIrq | IrqError::InvalidCpu => KlibError::InvalidInput,
IrqError::CpuOffline | IrqError::Unsupported => KlibError::Unsupported,
IrqError::Timeout => KlibError::TimedOut,
IrqError::Busy | IrqError::InIrqContext => KlibError::ResourceBusy,
IrqError::NoMemory => KlibError::NoMemory,
IrqError::NotFound => KlibError::NotFound,
IrqError::Controller => KlibError::Io,
},
RuntimeError::Allocation(_) => KlibError::NoMemory,
#[cfg(feature = "fs")]
RuntimeError::Vfs(error) => match error {
VfsError::AlreadyExists => KlibError::AlreadyExists,
VfsError::BadAddress => KlibError::BadAddress,
VfsError::NoMemory => KlibError::NoMemory,
VfsError::ResourceBusy => KlibError::ResourceBusy,
VfsError::TimedOut => KlibError::TimedOut,
VfsError::Unsupported | VfsError::OperationNotSupported => KlibError::Unsupported,
_ => KlibError::Io,
},
#[cfg(all(feature = "irq", feature = "multitask"))]
RuntimeError::SerialConfig(error) => match error {
ConfigError::InvalidBaudrate
| ConfigError::UnsupportedDataBits
| ConfigError::UnsupportedStopBits
| ConfigError::UnsupportedParity => KlibError::InvalidInput,
ConfigError::Timeout => KlibError::TimedOut,
ConfigError::RegisterError => KlibError::Io,
},
#[cfg(all(feature = "irq", feature = "multitask"))]
RuntimeError::ConsoleHandoff(_) => KlibError::BadState,
#[cfg(all(feature = "irq", feature = "multitask"))]
RuntimeError::SerialConsoleBusy => KlibError::ResourceBusy,
#[cfg(all(feature = "irq", feature = "multitask"))]
RuntimeError::ConsoleFailedClosed => KlibError::BadState,
RuntimeError::SerialNotStarted => KlibError::BadState,
RuntimeError::SerialControlBusy => KlibError::ResourceBusy,
RuntimeError::WouldBlock => KlibError::ResourceBusy,
RuntimeError::OperationNotSupported => KlibError::Unsupported,
RuntimeError::InvalidCpu { .. } => KlibError::InvalidInput,
}
}