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#[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)]
17pub enum RuntimeError {
18 #[cfg(feature = "paging")]
20 #[error(transparent)]
21 Mm(#[from] MmError),
22 #[cfg(feature = "paging")]
24 #[error(transparent)]
25 TlbShootdown(#[from] TlbShootdownError),
26 #[cfg(feature = "irq")]
28 #[error(transparent)]
29 Irq(#[from] IrqError),
30 #[error(transparent)]
32 Allocation(#[from] AllocError),
33 #[cfg(feature = "fs")]
35 #[error(transparent)]
36 Vfs(#[from] VfsError),
37 #[cfg(all(feature = "irq", feature = "multitask"))]
39 #[error(transparent)]
40 SerialConfig(#[from] ConfigError),
41 #[cfg(all(feature = "irq", feature = "multitask"))]
43 #[error(transparent)]
44 ConsoleHandoff(#[from] ax_hal::console::ConsoleHandoffError),
45 #[cfg(all(feature = "irq", feature = "multitask"))]
47 #[error("another serial runtime already owns console routing")]
48 SerialConsoleBusy,
49 #[cfg(all(feature = "irq", feature = "multitask"))]
51 #[error("runtime console failed closed")]
52 ConsoleFailedClosed,
53 #[error("serial runtime is not started")]
55 SerialNotStarted,
56 #[error("serial control queue is busy")]
58 SerialControlBusy,
59 #[error("runtime operation would block")]
61 WouldBlock,
62 #[error("runtime operation is not supported")]
64 OperationNotSupported,
65 #[error("invalid runtime CPU index {cpu}")]
67 InvalidCpu { cpu: usize },
68}
69
70pub type RuntimeResult<T = ()> = Result<T, RuntimeError>;
72
73#[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}