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
10pub mod common;
11pub mod console;
12pub mod gpu;
13pub mod rng;
14
15/// VirtIO device status flags
16#[allow(dead_code)]
17pub mod status {
18    pub const ACKNOWLEDGE: u32 = 1;
19    pub const DRIVER: u32 = 2;
20    pub const DRIVER_OK: u32 = 4;
21    pub const FEATURES_OK: u32 = 8;
22    pub const DEVICE_NEEDS_RESET: u32 = 64;
23    pub const FAILED: u32 = 128;
24}
25
26/// VirtIO device types (subsystem IDs)
27#[allow(dead_code)]
28#[derive(Debug, Clone, Copy, PartialEq)]
29#[repr(u16)]
30pub enum DeviceType {
31    Network = 1,
32    Block = 2,
33    Console = 3,
34    Entropy = 4,
35    Gpu = 16,
36    Input = 18,
37}
38
39/// VirtIO MMIO register offsets
40#[allow(dead_code)]
41pub mod mmio {
42    pub const MAGIC_VALUE: usize = 0x000;
43    pub const VERSION: usize = 0x004;
44    pub const DEVICE_ID: usize = 0x008;
45    pub const VENDOR_ID: usize = 0x00C;
46    pub const DEVICE_FEATURES: usize = 0x010;
47    pub const DEVICE_FEATURES_SEL: usize = 0x014;
48    pub const DRIVER_FEATURES: usize = 0x020;
49    pub const DRIVER_FEATURES_SEL: usize = 0x024;
50    pub const QUEUE_SEL: usize = 0x030;
51    pub const QUEUE_NUM_MAX: usize = 0x034;
52    pub const QUEUE_NUM: usize = 0x038;
53    pub const QUEUE_READY: usize = 0x044;
54    pub const QUEUE_NOTIFY: usize = 0x050;
55    pub const INTERRUPT_STATUS: usize = 0x060;
56    pub const INTERRUPT_ACK: usize = 0x064;
57    pub const STATUS: usize = 0x070;
58}
59
60/// A VirtIO virtqueue descriptor
61#[repr(C)]
62#[derive(Debug, Clone, Copy, Default)]
63pub struct VirtqDesc {
64    /// Physical address of the buffer
65    pub addr: u64,
66    /// Length of the buffer
67    pub len: u32,
68    /// Flags (NEXT, WRITE, INDIRECT)
69    pub flags: u16,
70    /// Next descriptor index (if NEXT flag set)
71    pub next: u16,
72}
73
74/// Virtqueue descriptor flags
75#[allow(dead_code)]
76pub mod vring_flags {
77    pub const NEXT: u16 = 1;
78    pub const WRITE: u16 = 2;
79    pub const INDIRECT: u16 = 4;
80}