#![cfg_attr(not(test), no_std)]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![cfg_attr(feature = "nightly", feature(allocator_api))]
#[cfg(feature = "alloc")]
extern crate alloc;
#[macro_use]
mod bitflags;
#[macro_use]
pub mod volatile;
pub mod balloon;
pub mod blk;
pub mod console;
#[cfg(any(feature = "mmio", feature = "pci"))]
mod driver_notifications;
mod features;
pub mod fs;
#[cfg(feature = "mmio")]
pub mod mmio;
pub mod net;
#[cfg(feature = "pci")]
pub mod pci;
pub mod pvirtq;
pub mod virtq;
pub mod vsock;
mod sealed {
pub trait Sealed {}
}
pub use endian_num::{Be, Le, be16, be32, be64, be128, le16, le32, le64, le128};
use num_enum::{FromPrimitive, IntoPrimitive, TryFromPrimitive};
pub use self::features::{F, FeatureBits};
virtio_bitflags! {
pub struct DeviceStatus: u8 {
const ACKNOWLEDGE = 1;
const DRIVER = 2;
const DRIVER_OK = 4;
const FEATURES_OK = 8;
const SUSPEND = 16;
const DEVICE_NEEDS_RESET = 64;
const FAILED = 128;
}
}
#[derive(IntoPrimitive, FromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
#[non_exhaustive]
#[repr(u8)]
pub enum Id {
Reserved = 0,
#[doc(alias = "VIRTIO_ID_NET")]
Net = 1,
#[doc(alias = "VIRTIO_ID_BLOCK")]
Block = 2,
#[doc(alias = "VIRTIO_ID_CONSOLE")]
Console = 3,
#[doc(alias = "VIRTIO_ID_RNG")]
Rng = 4,
#[doc(alias = "VIRTIO_ID_BALLOON")]
Balloon = 5,
#[doc(alias = "VIRTIO_ID_IOMEM")]
Iomem = 6,
#[doc(alias = "VIRTIO_ID_RPMSG")]
Rpmsg = 7,
#[doc(alias = "VIRTIO_ID_SCSI")]
Scsi = 8,
#[doc(alias = "VIRTIO_ID_9P")]
NineP = 9,
#[doc(alias = "VIRTIO_ID_MAC80211_WLAN")]
Mac80211Wlan = 10,
#[doc(alias = "VIRTIO_ID_RPROC_SERIAL")]
RprocSerial = 11,
#[doc(alias = "VIRTIO_ID_CAIF")]
Caif = 12,
#[doc(alias = "VIRTIO_ID_MEMORY_BALLOON")]
MemoryBalloon = 13,
#[doc(alias = "VIRTIO_ID_GPU")]
Gpu = 16,
#[doc(alias = "VIRTIO_ID_CLOCK")]
Clock = 17,
#[doc(alias = "VIRTIO_ID_INPUT")]
Input = 18,
#[doc(alias = "VIRTIO_ID_VSOCK")]
Vsock = 19,
#[doc(alias = "VIRTIO_ID_CRYPTO")]
Crypto = 20,
#[doc(alias = "VIRTIO_ID_SIGNAL_DIST")]
SignalDist = 21,
#[doc(alias = "VIRTIO_ID_PSTORE")]
Pstore = 22,
#[doc(alias = "VIRTIO_ID_IOMMU")]
Iommu = 23,
#[doc(alias = "VIRTIO_ID_MEM")]
Mem = 24,
#[doc(alias = "VIRTIO_ID_SOUND")]
Sound = 25,
#[doc(alias = "VIRTIO_ID_FS")]
Fs = 26,
#[doc(alias = "VIRTIO_ID_PMEM")]
Pmem = 27,
#[doc(alias = "VIRTIO_ID_RPMB")]
Rpmb = 28,
#[doc(alias = "VIRTIO_ID_MAC80211_HWSIM")]
Mac80211Hwsim = 29,
#[doc(alias = "VIRTIO_ID_VIDEO_ENCODER")]
VideoEncoder = 30,
#[doc(alias = "VIRTIO_ID_VIDEO_DECODER")]
VideoDecoder = 31,
#[doc(alias = "VIRTIO_ID_SCMI")]
Scmi = 32,
#[doc(alias = "VIRTIO_ID_NITRO_SEC_MOD")]
NitroSecMod = 33,
#[doc(alias = "VIRTIO_ID_I2C_ADAPTER")]
I2cAdapter = 34,
#[doc(alias = "VIRTIO_ID_WATCHDOG")]
Watchdog = 35,
#[doc(alias = "VIRTIO_ID_CAN")]
Can = 36,
#[doc(alias = "VIRTIO_ID_PARAM_SERV")]
ParamServ = 38,
#[doc(alias = "VIRTIO_ID_AUDIO_POLICY")]
AudioPolicy = 39,
#[doc(alias = "VIRTIO_ID_BT")]
Bt = 40,
#[doc(alias = "VIRTIO_ID_GPIO")]
Gpio = 41,
#[doc(alias = "VIRTIO_ID_RDMA")]
Rdma = 42,
Camera = 43,
Ism = 44,
#[doc(alias = "VIRTIO_ID_SPI")]
Spi = 45,
Tee = 46,
CpuBalloon = 47,
#[doc(alias = "VIRTIO_ID_MEDIA")]
Media = 48,
Usb = 49,
#[num_enum(catch_all)]
Unknown(u8),
}
#[doc(alias = "RING_EVENT_FLAGS")]
#[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
#[non_exhaustive]
#[repr(u8)]
pub enum RingEventFlags {
#[doc(alias = "RING_EVENT_FLAGS_ENABLE")]
Enable = 0x0,
#[doc(alias = "RING_EVENT_FLAGS_DISABLE")]
Disable = 0x1,
#[doc(alias = "RING_EVENT_FLAGS_DESC")]
Desc = 0x2,
Reserved = 0x3,
}
impl RingEventFlags {
const fn from_bits(bits: u8) -> Self {
match bits {
0x0 => Self::Enable,
0x1 => Self::Disable,
0x2 => Self::Desc,
0x3 => Self::Reserved,
_ => unreachable!(),
}
}
const fn into_bits(self) -> u8 {
self as u8
}
}
pub trait DeviceConfigSpace: Sized {
fn read_config_with<F, T>(self, f: F) -> T
where
F: FnMut() -> T;
}