Skip to main content

strat9_kernel/hardware/virtio/
mod.rs

1//! VirtIO driver framework
2//!
3//! VirtIO provides a standard interface for virtual devices (disk, network, etc.)
4//! in QEMU/KVM environments.
5//!
6//! References:
7//! - VirtIO spec: https://docs.oasis-open.org/virtio/virtio/v1.2/virtio-v1.2.html
8//! - RedoxOS drivers: https://gitlab.redox-os.org/redox-os/drivers
9
10use endian_num::Le;
11
12pub mod common;
13pub mod console;
14pub mod gpu;
15pub mod rng;
16
17/// VirtIO device status flags
18#[allow(dead_code)]
19pub mod status {
20    pub const ACKNOWLEDGE: u32 = 1;
21    pub const DRIVER: u32 = 2;
22    pub const DRIVER_OK: u32 = 4;
23    pub const FEATURES_OK: u32 = 8;
24    pub const DEVICE_NEEDS_RESET: u32 = 64;
25    pub const FAILED: u32 = 128;
26}
27
28/// VirtIO device types (subsystem IDs)
29#[allow(dead_code)]
30#[derive(Debug, Clone, Copy, PartialEq)]
31#[repr(u16)]
32pub enum DeviceType {
33    Network = 1,
34    Block = 2,
35    Console = 3,
36    Entropy = 4,
37    Gpu = 16,
38    Input = 18,
39}
40
41/// VirtIO MMIO register offsets
42#[allow(dead_code)]
43pub mod mmio {
44    pub const MAGIC_VALUE: usize = 0x000;
45    pub const VERSION: usize = 0x004;
46    pub const DEVICE_ID: usize = 0x008;
47    pub const VENDOR_ID: usize = 0x00C;
48    pub const DEVICE_FEATURES: usize = 0x010;
49    pub const DEVICE_FEATURES_SEL: usize = 0x014;
50    pub const DRIVER_FEATURES: usize = 0x020;
51    pub const DRIVER_FEATURES_SEL: usize = 0x024;
52    pub const QUEUE_SEL: usize = 0x030;
53    pub const QUEUE_NUM_MAX: usize = 0x034;
54    pub const QUEUE_NUM: usize = 0x038;
55    pub const QUEUE_READY: usize = 0x044;
56    pub const QUEUE_NOTIFY: usize = 0x050;
57    pub const INTERRUPT_STATUS: usize = 0x060;
58    pub const INTERRUPT_ACK: usize = 0x064;
59    pub const STATUS: usize = 0x070;
60}
61
62/// A VirtIO virtqueue descriptor
63///
64/// All fields are little-endian as mandated by the VirtIO specification.
65#[repr(C)]
66#[derive(Debug, Clone, Copy, Default)]
67pub struct VirtqDesc {
68    /// Physical address of the buffer
69    pub addr: Le<u64>,
70    /// Length of the buffer
71    pub len: Le<u32>,
72    /// Flags (NEXT, WRITE, INDIRECT)
73    pub flags: Le<u16>,
74    /// Next descriptor index (if NEXT flag set)
75    pub next: Le<u16>,
76}
77
78/// Virtqueue descriptor flags
79#[allow(dead_code)]
80pub mod vring_flags {
81    pub const NEXT: u16 = 1;
82    pub const WRITE: u16 = 2;
83    pub const INDIRECT: u16 = 4;
84}