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#[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)]
15pub enum RuntimeError {
16 #[cfg(feature = "paging")]
18 #[error(transparent)]
19 Mm(#[from] MmError),
20 #[cfg(feature = "paging")]
22 #[error(transparent)]
23 TlbShootdown(#[from] TlbShootdownError),
24 #[error(transparent)]
26 Irq(#[from] IrqError),
27 #[error(transparent)]
29 Allocation(#[from] AllocError),
30 #[cfg(feature = "fs")]
32 #[error(transparent)]
33 Vfs(#[from] VfsError),
34 #[error(transparent)]
36 SerialConfig(#[from] ConfigError),
37 #[error(transparent)]
39 ConsoleHandoff(#[from] ax_hal::console::ConsoleHandoffError),
40 #[error("another serial runtime already owns console routing")]
42 SerialConsoleBusy,
43 #[error("runtime console failed closed")]
45 ConsoleFailedClosed,
46 #[error("serial runtime is not started")]
48 SerialNotStarted,
49 #[error("serial control queue is busy")]
51 SerialControlBusy,
52 #[error("runtime operation would block")]
54 WouldBlock,
55 #[error("runtime operation is not supported")]
57 OperationNotSupported,
58 #[error("invalid runtime CPU index {cpu}")]
60 InvalidCpu { cpu: usize },
61}
62
63pub type RuntimeResult<T = ()> = Result<T, RuntimeError>;
65
66#[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}