hermit/drivers/virtio/
mod.rs

1//! A module containing virtios core infrastructure for hermit-rs.
2//!
3//! The module contains virtios transport mechanisms, virtqueues and virtio specific errors
4pub 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}