1pub mod transport;
5pub mod virtqueue;
6
7pub mod error {
8 use core::fmt;
9
10 #[cfg(feature = "console")]
11 pub use crate::drivers::console::error::VirtioConsoleError;
12 #[cfg(feature = "fuse")]
13 pub use crate::drivers::fs::virtio_fs::error::VirtioFsError;
14 #[cfg(all(
15 not(all(target_arch = "riscv64", feature = "gem-net", not(feature = "pci"))),
16 not(all(target_arch = "x86_64", feature = "rtl8139")),
17 feature = "virtio-net",
18 ))]
19 pub use crate::drivers::net::virtio::error::VirtioNetError;
20 #[cfg(feature = "pci")]
21 use crate::drivers::pci::error::PciError;
22 #[cfg(feature = "vsock")]
23 pub use crate::drivers::vsock::error::VirtioVsockError;
24
25 #[allow(dead_code)]
26 #[derive(Debug)]
27 pub enum VirtioError {
28 #[cfg(feature = "pci")]
29 FromPci(PciError),
30 #[cfg(feature = "pci")]
31 NoComCfg(u16),
32 #[cfg(feature = "pci")]
33 NoIsrCfg(u16),
34 #[cfg(feature = "pci")]
35 NoNotifCfg(u16),
36 DevNotSupported(u16),
37 #[cfg(all(
38 not(all(target_arch = "riscv64", feature = "gem-net", not(feature = "pci"))),
39 not(all(target_arch = "x86_64", feature = "rtl8139")),
40 feature = "virtio-net",
41 ))]
42 NetDriver(VirtioNetError),
43 #[cfg(feature = "fuse")]
44 FsDriver(VirtioFsError),
45 #[cfg(feature = "vsock")]
46 VsockDriver(VirtioVsockError),
47 #[cfg(feature = "console")]
48 ConsoleDriver(VirtioConsoleError),
49 #[cfg(not(feature = "pci"))]
50 Unknown,
51 }
52
53 impl fmt::Display for VirtioError {
54 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
55 match self {
56 #[cfg(not(feature = "pci"))]
57 VirtioError::Unknown => write!(f, "Driver failure"),
58 #[cfg(feature = "pci")]
59 VirtioError::FromPci(pci_error) => match pci_error {
60 PciError::General(id) => write!(
61 f,
62 "Driver failed to initialize device with id: {id:#x}. Due to unknown reasosn!"
63 ),
64 PciError::NoBar(id) => write!(
65 f,
66 "Driver failed to initialize device with id: {id:#x}. Reason: No BAR's found."
67 ),
68 PciError::NoCapPtr(id) => write!(
69 f,
70 "Driver failed to initialize device with id: {id:#x}. Reason: No Capabilities pointer found."
71 ),
72 PciError::NoVirtioCaps(id) => write!(
73 f,
74 "Driver failed to initialize device with id: {id:#x}. Reason: No Virtio capabilities were found."
75 ),
76 },
77 #[cfg(feature = "pci")]
78 VirtioError::NoComCfg(id) => write!(
79 f,
80 "Virtio driver failed, for device {id:x}, due to a missing or malformed common config!"
81 ),
82 #[cfg(feature = "pci")]
83 VirtioError::NoIsrCfg(id) => write!(
84 f,
85 "Virtio driver failed, for device {id:x}, due to a missing or malformed ISR status config!"
86 ),
87 #[cfg(feature = "pci")]
88 VirtioError::NoNotifCfg(id) => write!(
89 f,
90 "Virtio driver failed, for device {id:x}, due to a missing or malformed notification config!"
91 ),
92 VirtioError::DevNotSupported(id) => {
93 write!(f, "Device with id {id:#x} not supported.")
94 }
95 #[cfg(all(
96 not(all(target_arch = "riscv64", feature = "gem-net", not(feature = "pci"))),
97 not(all(target_arch = "x86_64", feature = "rtl8139")),
98 feature = "virtio-net",
99 ))]
100 VirtioError::NetDriver(net_error) => match net_error {
101 #[cfg(feature = "pci")]
102 VirtioNetError::NoDevCfg(id) => write!(
103 f,
104 "Virtio network driver failed, for device {id:x}, due to a missing or malformed device config!"
105 ),
106 VirtioNetError::FailFeatureNeg(id) => write!(
107 f,
108 "Virtio network driver failed, for device {id:x}, device did not acknowledge negotiated feature set!"
109 ),
110 VirtioNetError::FeatureRequirementsNotMet(features) => write!(
111 f,
112 "Virtio network driver tried to set feature bit without setting dependency feature. Feat set: {features:?}"
113 ),
114 VirtioNetError::IncompatibleFeatureSets(driver_features, device_features) => {
115 write!(
116 f,
117 "Feature set: {driver_features:?} , is incompatible with the device features: {device_features:?}"
118 )
119 }
120 },
121 #[cfg(feature = "fuse")]
122 VirtioError::FsDriver(fs_error) => match fs_error {
123 #[cfg(feature = "pci")]
124 VirtioFsError::NoDevCfg(id) => write!(
125 f,
126 "Virtio filesystem driver failed, for device {id:x}, due to a missing or malformed device config!"
127 ),
128 VirtioFsError::FailFeatureNeg(id) => write!(
129 f,
130 "Virtio filesystem driver failed, for device {id:x}, device did not acknowledge negotiated feature set!"
131 ),
132 VirtioFsError::FeatureRequirementsNotMet(features) => write!(
133 f,
134 "Virtio filesystem driver tried to set feature bit without setting dependency feature. Feat set: {features:?}"
135 ),
136 VirtioFsError::IncompatibleFeatureSets(driver_features, device_features) => {
137 write!(
138 f,
139 "Feature set: {driver_features:?} , is incompatible with the device features: {device_features:?}",
140 )
141 }
142 VirtioFsError::Unknown => write!(
143 f,
144 "Virtio filesystem failed, driver failed due unknown reason!"
145 ),
146 },
147 #[cfg(feature = "console")]
148 VirtioError::ConsoleDriver(console_error) => match console_error {
149 #[cfg(feature = "pci")]
150 VirtioConsoleError::NoDevCfg(id) => write!(
151 f,
152 "Virtio console device driver failed, for device {id:x}, due to a missing or malformed device config!"
153 ),
154 VirtioConsoleError::FailFeatureNeg(id) => write!(
155 f,
156 "Virtio console device driver failed, for device {id:x}, device did not acknowledge negotiated feature set!"
157 ),
158 VirtioConsoleError::FeatureRequirementsNotMet(features) => write!(
159 f,
160 "Virtio console driver tried to set feature bit without setting dependency feature. Feat set: {features:?}"
161 ),
162 VirtioConsoleError::IncompatibleFeatureSets(
163 driver_features,
164 device_features,
165 ) => {
166 write!(
167 f,
168 "Feature set: {driver_features:?} , is incompatible with the device features: {device_features:?}"
169 )
170 }
171 },
172 #[cfg(feature = "vsock")]
173 VirtioError::VsockDriver(vsock_error) => match vsock_error {
174 #[cfg(feature = "pci")]
175 VirtioVsockError::NoDevCfg(id) => write!(
176 f,
177 "Virtio socket device driver failed, for device {id:x}, due to a missing or malformed device config!"
178 ),
179 #[cfg(feature = "pci")]
180 VirtioVsockError::NoComCfg(id) => write!(
181 f,
182 "Virtio socket device driver failed, for device {id:x}, due to a missing or malformed common config!"
183 ),
184 #[cfg(feature = "pci")]
185 VirtioVsockError::NoIsrCfg(id) => write!(
186 f,
187 "Virtio socket device driver failed, for device {id:x}, due to a missing or malformed ISR status config!"
188 ),
189 #[cfg(feature = "pci")]
190 VirtioVsockError::NoNotifCfg(id) => write!(
191 f,
192 "Virtio socket device driver failed, for device {id:x}, due to a missing or malformed notification config!"
193 ),
194 VirtioVsockError::FailFeatureNeg(id) => write!(
195 f,
196 "Virtio socket device driver failed, for device {id:x}, device did not acknowledge negotiated feature set!"
197 ),
198 VirtioVsockError::FeatureRequirementsNotMet(features) => write!(
199 f,
200 "Virtio socket driver tried to set feature bit without setting dependency feature. Feat set: {features:?}"
201 ),
202 VirtioVsockError::IncompatibleFeatureSets(driver_features, device_features) => {
203 write!(
204 f,
205 "Feature set: {driver_features:?} , is incompatible with the device features: {device_features:?}"
206 )
207 }
208 },
209 }
210 }
211 }
212}