VirtIO Core Abstraction
Relevant source files
This document covers the core abstraction layer that bridges the external virtio-drivers
crate with the axdriver ecosystem. It focuses on device probing mechanisms, type conversion, error handling, and the fundamental infrastructure that enables VirtIO device integration. For information about specific VirtIO device implementations (block, network, GPU), see VirtIO Device Implementations.
Overview
The VirtIO core abstraction in axdriver_virtio
serves as an adapter layer that translates between the virtio-drivers
crate's interfaces and the standardized axdriver trait system. This layer handles device discovery, type mapping, and error conversion while maintaining compatibility with both MMIO and PCI transport mechanisms.
Sources: axdriver_virtio/src/lib.rs(L1 - L98)
Device Probing Architecture
The VirtIO subsystem provides two primary device probing mechanisms that support different hardware configurations and virtualization environments.
MMIO Device Probing
flowchart TD A["probe_mmio_device()"] B["reg_base: *mut u8"] C["VirtIOHeader"] D["MmioTransport::new()"] E["Transport Valid?"] F["transport.device_type()"] G["Return None"] H["as_dev_type()"] I["Type Supported?"] J["Return (DeviceType, MmioTransport)"] A --> B B --> C C --> D D --> E E --> F E --> G F --> H H --> I I --> G I --> J
The probe_mmio_device
function creates a VirtIO MMIO transport from a memory-mapped region and identifies the device type. It validates the VirtIO header structure and extracts device type information for compatibility checking.
Sources: axdriver_virtio/src/lib.rs(L38 - L53)
PCI Device Probing
flowchart TD A["probe_pci_device()"] B["PciRoot, DeviceFunction, DeviceFunctionInfo"] C["virtio_device_type()"] D["as_dev_type()"] E["Type Supported?"] F["PciTransport::new()"] G["Return None"] H["Transport Created?"] I["Return (DeviceType, PciTransport)"] A --> B B --> C C --> D D --> E E --> F E --> G F --> H H --> G H --> I
The probe_pci_device
function handles PCI-based VirtIO devices using the PCI bus infrastructure. It requires a HAL implementation for DMA operations and device access.
Sources: axdriver_virtio/src/lib.rs(L55 - L69)
Type Conversion System
The core abstraction implements bidirectional type mapping between the virtio-drivers
crate and the axdriver ecosystem.
Device Type Mapping
VirtIO Device Type | axdriver Device Type | Support Status |
---|---|---|
VirtIoDevType::Block | DeviceType::Block | ✓ Supported |
VirtIoDevType::Network | DeviceType::Net | ✓ Supported |
VirtIoDevType::GPU | DeviceType::Display | ✓ Supported |
Other types | None | Not supported |
flowchart TD subgraph axdriver_base["axdriver_base"] AB["DeviceType::Block"] AN["DeviceType::Net"] AD["DeviceType::Display"] NONE["None"] end subgraph as_dev_type()["as_dev_type()"] CONV["Type Conversion"] end subgraph virtio_drivers["virtio_drivers"] VB["VirtIoDevType::Block"] VN["VirtIoDevType::Network"] VG["VirtIoDevType::GPU"] VO["Other Types"] end CONV --> AB CONV --> AD CONV --> AN CONV --> NONE VB --> CONV VG --> CONV VN --> CONV VO --> CONV
The as_dev_type
function provides compile-time type conversion that filters supported VirtIO device types and maps them to corresponding axdriver types.
Sources: axdriver_virtio/src/lib.rs(L71 - L79)
Error Handling Bridge
The abstraction layer provides comprehensive error conversion between VirtIO-specific errors and the standardized axdriver error types.
Error Mapping Table
VirtIO Error | axdriver DevError | Description |
---|---|---|
QueueFull | BadState | Device queue at capacity |
NotReady | Again | Device not ready, retry later |
WrongToken | BadState | Invalid operation token |
AlreadyUsed | AlreadyExists | Resource already in use |
InvalidParam | InvalidParam | Invalid parameter provided |
DmaError | NoMemory | DMA allocation failure |
IoError | Io | I/O operation failure |
Unsupported | Unsupported | Unsupported operation |
ConfigSpaceTooSmall | BadState | Insufficient config space |
ConfigSpaceMissing | BadState | Missing config space |
Default | BadState | Generic error state |
flowchart TD subgraph axdriver_base::DevError["axdriver_base::DevError"] DE1["BadState"] DE2["Again"] DE3["NoMemory"] DE4["Io"] DE5["Unsupported"] end subgraph as_dev_err()["as_dev_err()"] ECONVERT["Error Conversion"] end subgraph virtio_drivers::Error["virtio_drivers::Error"] VE1["QueueFull"] VE2["NotReady"] VE3["DmaError"] VE4["IoError"] VE5["Unsupported"] VEX["Others..."] end ECONVERT --> DE1 ECONVERT --> DE2 ECONVERT --> DE3 ECONVERT --> DE4 ECONVERT --> DE5 VE1 --> ECONVERT VE2 --> ECONVERT VE3 --> ECONVERT VE4 --> ECONVERT VE5 --> ECONVERT VEX --> ECONVERT
The as_dev_err
function provides semantic mapping of VirtIO errors to axdriver error categories, enabling consistent error handling across the driver ecosystem.
Sources: axdriver_virtio/src/lib.rs(L81 - L97)
Transport Abstraction Layer
The VirtIO core abstraction re-exports key transport components from the virtio-drivers
crate, providing a unified interface for different VirtIO transport mechanisms.
Core Transport Types
flowchart TD subgraph subGraph2["PCI Infrastructure"] PCIBUS["pci::bus module"] DEVFUNC["DeviceFunction"] DEVINFO["DeviceFunctionInfo"] PCIROOT["PciRoot"] end subgraph subGraph1["Supporting Types"] HAL["VirtIoHal Trait"] PADDR["PhysAddr"] BDIR["BufferDirection"] end subgraph subGraph0["Transport Layer"] TRANS["Transport Trait"] MMIO["MmioTransport"] PCI["PciTransport"] end HAL --> BDIR HAL --> PADDR MMIO --> HAL PCI --> HAL PCI --> PCIBUS PCIBUS --> DEVFUNC PCIBUS --> DEVINFO PCIBUS --> PCIROOT TRANS --> MMIO TRANS --> PCI
The transport abstraction provides:
- Transport Trait: Common interface for device communication
- MmioTransport: Memory-mapped I/O transport for embedded systems
- PciTransport: PCI bus transport for conventional systems
- VirtIoHal: Hardware abstraction layer for memory management
- PCI Infrastructure: Bus enumeration and device management
Sources: axdriver_virtio/src/lib.rs(L30 - L36)
HAL Requirements
The VirtIO integration requires implementation of the VirtIoHal
trait for hardware-specific operations:
flowchart TD subgraph subGraph1["axdriver Integration"] PROBE["Device Probing"] TRANSPORT["Transport Creation"] DEVOPS["Device Operations"] end subgraph subGraph0["VirtIoHal Requirements"] DMA["DMA Memory Allocation"] ADDR["Physical Address Translation"] CACHE["Cache Coherency"] SYNC["Memory Synchronization"] end ADDR --> TRANSPORT CACHE --> DEVOPS DMA --> PROBE SYNC --> DEVOPS
The HAL implementation must provide memory management capabilities that bridge between the host system's memory management and VirtIO device requirements.
Sources: axdriver_virtio/src/lib.rs(L4 - L7)
Conditional Compilation Support
The VirtIO core abstraction supports selective compilation through feature flags:
Feature | Purpose |
---|---|
block | Enable VirtIO block device support |
net | Enable VirtIO network device support |
gpu | Enable VirtIO GPU device support |
This design allows minimal binary size by including only required device types while maintaining the same core probing and abstraction infrastructure.