use std::sync::Arc;
use squib_core::GuestMemory;
use thiserror::Error;
use crate::{device_id::VirtioDeviceType, interrupt::IrqLine, queue::Queue};
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ActivateError {
#[error("device backend unavailable: {0}")]
BackendUnavailable(String),
#[error("incompatible feature set: {0}")]
IncompatibleFeatures(&'static str),
#[error("device activation failed: {0}")]
Other(String),
}
pub trait VirtioDevice: Send + std::fmt::Debug {
fn device_type(&self) -> VirtioDeviceType;
fn avail_features(&self) -> u64;
fn acked_features(&self) -> u64;
fn set_acked_features(&mut self, value: u64);
fn queue_max_sizes(&self) -> &[u16];
fn queues(&self) -> &[Queue];
fn queues_mut(&mut self) -> &mut [Queue];
fn read_config(&self, offset: u64, data: &mut [u8]);
fn write_config(&mut self, offset: u64, data: &[u8]);
fn activate(&mut self, mem: Arc<dyn GuestMemory>, irq: IrqLine) -> Result<(), ActivateError>;
fn is_activated(&self) -> bool;
fn process_queue(&mut self, queue_index: u16);
}