xref: /aosp_15_r20/external/crosvm/devices/src/virtio/vhost/mod.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2017 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker //! Implements vhost-based virtio devices.
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker use base::Error as SysError;
8*bb4ee6a4SAndroid Build Coastguard Worker use base::TubeError;
9*bb4ee6a4SAndroid Build Coastguard Worker use net_util::Error as TapError;
10*bb4ee6a4SAndroid Build Coastguard Worker use remain::sorted;
11*bb4ee6a4SAndroid Build Coastguard Worker use thiserror::Error;
12*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
13*bb4ee6a4SAndroid Build Coastguard Worker use vhost::Error as VhostError;
14*bb4ee6a4SAndroid Build Coastguard Worker 
15*bb4ee6a4SAndroid Build Coastguard Worker mod control_socket;
16*bb4ee6a4SAndroid Build Coastguard Worker pub mod user;
17*bb4ee6a4SAndroid Build Coastguard Worker 
18*bb4ee6a4SAndroid Build Coastguard Worker pub use self::control_socket::*;
19*bb4ee6a4SAndroid Build Coastguard Worker 
20*bb4ee6a4SAndroid Build Coastguard Worker cfg_if::cfg_if! {
21*bb4ee6a4SAndroid Build Coastguard Worker     if #[cfg(any(target_os = "android", target_os = "linux"))] {
22*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(feature = "net")]
23*bb4ee6a4SAndroid Build Coastguard Worker         mod net;
24*bb4ee6a4SAndroid Build Coastguard Worker         pub mod vsock;
25*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(any(target_arch = "arm", target_arch = "aarch64"))]
26*bb4ee6a4SAndroid Build Coastguard Worker         pub mod scmi;
27*bb4ee6a4SAndroid Build Coastguard Worker         mod worker;
28*bb4ee6a4SAndroid Build Coastguard Worker 
29*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(feature = "net")]
30*bb4ee6a4SAndroid Build Coastguard Worker         pub use self::net::Net;
31*bb4ee6a4SAndroid Build Coastguard Worker         pub use self::vsock::Vsock;
32*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(any(target_arch = "arm", target_arch = "aarch64"))]
33*bb4ee6a4SAndroid Build Coastguard Worker         pub use self::scmi::Scmi;
34*bb4ee6a4SAndroid Build Coastguard Worker     } else if #[cfg(windows)] {}
35*bb4ee6a4SAndroid Build Coastguard Worker }
36*bb4ee6a4SAndroid Build Coastguard Worker 
37*bb4ee6a4SAndroid Build Coastguard Worker #[sorted]
38*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Error, Debug)]
39*bb4ee6a4SAndroid Build Coastguard Worker pub enum Error {
40*bb4ee6a4SAndroid Build Coastguard Worker     /// Cloning kill event failed.
41*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to clone kill event: {0}")]
42*bb4ee6a4SAndroid Build Coastguard Worker     CloneKillEvent(SysError),
43*bb4ee6a4SAndroid Build Coastguard Worker     /// Creating kill event failed.
44*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to create kill event: {0}")]
45*bb4ee6a4SAndroid Build Coastguard Worker     CreateKillEvent(SysError),
46*bb4ee6a4SAndroid Build Coastguard Worker     /// Creating tube failed.
47*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to create tube: {0}")]
48*bb4ee6a4SAndroid Build Coastguard Worker     CreateTube(TubeError),
49*bb4ee6a4SAndroid Build Coastguard Worker     /// Creating wait context failed.
50*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to create poll context: {0}")]
51*bb4ee6a4SAndroid Build Coastguard Worker     CreateWaitContext(SysError),
52*bb4ee6a4SAndroid Build Coastguard Worker     /// Enabling tap interface failed.
53*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to enable tap interface: {0}")]
54*bb4ee6a4SAndroid Build Coastguard Worker     TapEnable(TapError),
55*bb4ee6a4SAndroid Build Coastguard Worker     /// Open tap device failed.
56*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to open tap device: {0}")]
57*bb4ee6a4SAndroid Build Coastguard Worker     TapOpen(TapError),
58*bb4ee6a4SAndroid Build Coastguard Worker     /// Setting tap IP failed.
59*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to set tap IP: {0}")]
60*bb4ee6a4SAndroid Build Coastguard Worker     TapSetIp(TapError),
61*bb4ee6a4SAndroid Build Coastguard Worker     /// Setting tap mac address failed.
62*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to set tap mac address: {0}")]
63*bb4ee6a4SAndroid Build Coastguard Worker     TapSetMacAddress(TapError),
64*bb4ee6a4SAndroid Build Coastguard Worker     /// Setting tap netmask failed.
65*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to set tap netmask: {0}")]
66*bb4ee6a4SAndroid Build Coastguard Worker     TapSetNetmask(TapError),
67*bb4ee6a4SAndroid Build Coastguard Worker     /// Setting tap interface offload flags failed.
68*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to set tap interface offload flags: {0}")]
69*bb4ee6a4SAndroid Build Coastguard Worker     TapSetOffload(TapError),
70*bb4ee6a4SAndroid Build Coastguard Worker     /// Setting vnet header size failed.
71*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to set vnet header size: {0}")]
72*bb4ee6a4SAndroid Build Coastguard Worker     TapSetVnetHdrSize(TapError),
73*bb4ee6a4SAndroid Build Coastguard Worker     /// Get features failed.
74*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
75*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to get features: {0}")]
76*bb4ee6a4SAndroid Build Coastguard Worker     VhostGetFeatures(VhostError),
77*bb4ee6a4SAndroid Build Coastguard Worker     /// Vhost IOTLB required but not supported.
78*bb4ee6a4SAndroid Build Coastguard Worker     #[error("Vhost IOTLB required but not supported")]
79*bb4ee6a4SAndroid Build Coastguard Worker     VhostIotlbUnsupported,
80*bb4ee6a4SAndroid Build Coastguard Worker     /// Failed to create vhost event.
81*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to create vhost event: {0}")]
82*bb4ee6a4SAndroid Build Coastguard Worker     VhostIrqCreate(SysError),
83*bb4ee6a4SAndroid Build Coastguard Worker     /// Failed to read vhost event.
84*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to read vhost event: {0}")]
85*bb4ee6a4SAndroid Build Coastguard Worker     VhostIrqRead(SysError),
86*bb4ee6a4SAndroid Build Coastguard Worker     /// Net set backend failed.
87*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
88*bb4ee6a4SAndroid Build Coastguard Worker     #[error("net set backend failed: {0}")]
89*bb4ee6a4SAndroid Build Coastguard Worker     VhostNetSetBackend(VhostError),
90*bb4ee6a4SAndroid Build Coastguard Worker     /// Failed to open vhost device.
91*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
92*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to open vhost device: {0}")]
93*bb4ee6a4SAndroid Build Coastguard Worker     VhostOpen(VhostError),
94*bb4ee6a4SAndroid Build Coastguard Worker     /// Set features failed.
95*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
96*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to set features: {0}")]
97*bb4ee6a4SAndroid Build Coastguard Worker     VhostSetFeatures(VhostError),
98*bb4ee6a4SAndroid Build Coastguard Worker     /// Set mem table failed.
99*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
100*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to set mem table: {0}")]
101*bb4ee6a4SAndroid Build Coastguard Worker     VhostSetMemTable(VhostError),
102*bb4ee6a4SAndroid Build Coastguard Worker     /// Set owner failed.
103*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
104*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to set owner: {0}")]
105*bb4ee6a4SAndroid Build Coastguard Worker     VhostSetOwner(VhostError),
106*bb4ee6a4SAndroid Build Coastguard Worker     /// Set vring addr failed.
107*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
108*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to set vring addr: {0}")]
109*bb4ee6a4SAndroid Build Coastguard Worker     VhostSetVringAddr(VhostError),
110*bb4ee6a4SAndroid Build Coastguard Worker     /// Set vring base failed.
111*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
112*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to set vring base: {0}")]
113*bb4ee6a4SAndroid Build Coastguard Worker     VhostSetVringBase(VhostError),
114*bb4ee6a4SAndroid Build Coastguard Worker     /// Set vring call failed.
115*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
116*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to set vring call: {0}")]
117*bb4ee6a4SAndroid Build Coastguard Worker     VhostSetVringCall(VhostError),
118*bb4ee6a4SAndroid Build Coastguard Worker     /// Set vring kick failed.
119*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
120*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to set vring kick: {0}")]
121*bb4ee6a4SAndroid Build Coastguard Worker     VhostSetVringKick(VhostError),
122*bb4ee6a4SAndroid Build Coastguard Worker     /// Set vring num failed.
123*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
124*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to set vring num: {0}")]
125*bb4ee6a4SAndroid Build Coastguard Worker     VhostSetVringNum(VhostError),
126*bb4ee6a4SAndroid Build Coastguard Worker     /// Failed to set CID for guest.
127*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
128*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to set CID for guest: {0}")]
129*bb4ee6a4SAndroid Build Coastguard Worker     VhostVsockSetCid(VhostError),
130*bb4ee6a4SAndroid Build Coastguard Worker     /// Failed to start vhost-vsock driver.
131*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
132*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed to start vhost-vsock driver: {0}")]
133*bb4ee6a4SAndroid Build Coastguard Worker     VhostVsockStart(VhostError),
134*bb4ee6a4SAndroid Build Coastguard Worker     #[error("queue missing vring base")]
135*bb4ee6a4SAndroid Build Coastguard Worker     VringBaseMissing,
136*bb4ee6a4SAndroid Build Coastguard Worker     /// Error while waiting for events.
137*bb4ee6a4SAndroid Build Coastguard Worker     #[error("failed waiting for events: {0}")]
138*bb4ee6a4SAndroid Build Coastguard Worker     WaitError(SysError),
139*bb4ee6a4SAndroid Build Coastguard Worker }
140*bb4ee6a4SAndroid Build Coastguard Worker 
141*bb4ee6a4SAndroid Build Coastguard Worker pub type Result<T> = std::result::Result<T, Error>;
142