use std::time::Duration;
use crate::{
Architecture, Gfn, MemoryAccess, VcpuId, View, VmiError, VmiEventCallback, VmiInfo,
VmiMappedPage,
};
pub trait VmiDriver {
type Architecture: Architecture + ?Sized;
fn info(&self) -> Result<VmiInfo, VmiError>;
fn pause(&self) -> Result<(), VmiError>;
fn resume(&self) -> Result<(), VmiError>;
fn registers(
&self,
vcpu: VcpuId,
) -> Result<<Self::Architecture as Architecture>::Registers, VmiError>;
fn set_registers(
&self,
vcpu: VcpuId,
registers: <Self::Architecture as Architecture>::Registers,
) -> Result<(), VmiError>;
fn memory_access(&self, gfn: Gfn, view: View) -> Result<MemoryAccess, VmiError>;
fn set_memory_access(&self, gfn: Gfn, view: View, access: MemoryAccess)
-> Result<(), VmiError>;
fn read_page(&self, gfn: Gfn) -> Result<VmiMappedPage, VmiError>;
fn write_page(&self, gfn: Gfn, offset: u64, content: &[u8]) -> Result<VmiMappedPage, VmiError>;
fn allocate_gfn(&self, gfn: Gfn) -> Result<(), VmiError>;
fn free_gfn(&self, gfn: Gfn) -> Result<(), VmiError>;
fn default_view(&self) -> View;
fn create_view(&self, default_access: MemoryAccess) -> Result<View, VmiError>;
fn destroy_view(&self, view: View) -> Result<(), VmiError>;
fn switch_to_view(&self, view: View) -> Result<(), VmiError>;
fn change_view_gfn(&self, view: View, old_gfn: Gfn, new_gfn: Gfn) -> Result<(), VmiError>;
fn reset_view_gfn(&self, view: View, gfn: Gfn) -> Result<(), VmiError>;
fn monitor_enable(
&self,
option: <Self::Architecture as Architecture>::EventMonitor,
) -> Result<(), VmiError>;
fn monitor_disable(
&self,
option: <Self::Architecture as Architecture>::EventMonitor,
) -> Result<(), VmiError>;
fn inject_interrupt(
&self,
vcpu: VcpuId,
interrupt: <Self::Architecture as Architecture>::Interrupt,
) -> Result<(), VmiError>;
fn events_pending(&self) -> usize;
fn event_processing_overhead(&self) -> Duration;
fn wait_for_event<'a>(
&'a self,
timeout: Duration,
handler: Box<VmiEventCallback<'a, Self::Architecture>>,
) -> Result<(), VmiError>;
fn reset_state(&self) -> Result<(), VmiError>;
}