1use std::time::Duration;
2
3use crate::{
4 Architecture, Gfn, MemoryAccess, MemoryAccessOptions, VcpuId, View, VmiError, VmiEvent,
5 VmiEventResponse, VmiInfo, VmiMappedPage,
6};
7
8pub trait VmiDriver: 'static {
13 type Architecture: Architecture + ?Sized;
15
16 fn info(&self) -> Result<VmiInfo, VmiError>;
18
19 fn pause(&self) -> Result<(), VmiError>;
21
22 fn resume(&self) -> Result<(), VmiError>;
24
25 fn registers(
27 &self,
28 vcpu: VcpuId,
29 ) -> Result<<Self::Architecture as Architecture>::Registers, VmiError>;
30
31 fn set_registers(
33 &self,
34 vcpu: VcpuId,
35 registers: <Self::Architecture as Architecture>::Registers,
36 ) -> Result<(), VmiError>;
37
38 fn memory_access(&self, gfn: Gfn, view: View) -> Result<MemoryAccess, VmiError>;
40
41 fn set_memory_access(&self, gfn: Gfn, view: View, access: MemoryAccess)
43 -> Result<(), VmiError>;
44
45 fn set_memory_access_with_options(
48 &self,
49 gfn: Gfn,
50 view: View,
51 access: MemoryAccess,
52 options: MemoryAccessOptions,
53 ) -> Result<(), VmiError>;
54
55 fn read_page(&self, gfn: Gfn) -> Result<VmiMappedPage, VmiError>;
57
58 fn write_page(&self, gfn: Gfn, offset: u64, content: &[u8]) -> Result<VmiMappedPage, VmiError>;
60
61 fn allocate_gfn(&self, gfn: Gfn) -> Result<(), VmiError>;
63
64 fn free_gfn(&self, gfn: Gfn) -> Result<(), VmiError>;
66
67 fn default_view(&self) -> View;
69
70 fn create_view(&self, default_access: MemoryAccess) -> Result<View, VmiError>;
72
73 fn destroy_view(&self, view: View) -> Result<(), VmiError>;
75
76 fn switch_to_view(&self, view: View) -> Result<(), VmiError>;
78
79 fn change_view_gfn(&self, view: View, old_gfn: Gfn, new_gfn: Gfn) -> Result<(), VmiError>;
81
82 fn reset_view_gfn(&self, view: View, gfn: Gfn) -> Result<(), VmiError>;
84
85 fn monitor_enable(
87 &self,
88 option: <Self::Architecture as Architecture>::EventMonitor,
89 ) -> Result<(), VmiError>;
90
91 fn monitor_disable(
93 &self,
94 option: <Self::Architecture as Architecture>::EventMonitor,
95 ) -> Result<(), VmiError>;
96
97 fn inject_interrupt(
99 &self,
100 vcpu: VcpuId,
101 interrupt: <Self::Architecture as Architecture>::Interrupt,
102 ) -> Result<(), VmiError>;
103
104 fn events_pending(&self) -> usize;
106
107 fn event_processing_overhead(&self) -> Duration;
109
110 fn wait_for_event(
112 &self,
113 timeout: Duration,
114 handler: impl FnMut(&VmiEvent<Self::Architecture>) -> VmiEventResponse<Self::Architecture>,
115 ) -> Result<(), VmiError>;
116
117 fn reset_state(&self) -> Result<(), VmiError>;
119}