vmi_driver_xen_core_dump/
lib.rs1mod arch;
4mod driver;
5mod dump;
6mod error;
7
8use std::{path::Path, time::Duration};
9
10use vmi_core::{
11 Architecture, Gfn, MemoryAccess, MemoryAccessOptions, VcpuId, View, VmiDriver, VmiError,
12 VmiEvent, VmiEventResponse, VmiInfo, VmiMappedPage,
13};
14
15pub use self::error::Error;
16use self::{arch::ArchAdapter, driver::XenCoreDumpDriver};
17
18pub struct VmiXenCoreDumpDriver<Arch>
20where
21 Arch: Architecture + ArchAdapter,
22{
23 inner: XenCoreDumpDriver<Arch>,
24}
25
26impl<Arch> VmiXenCoreDumpDriver<Arch>
27where
28 Arch: Architecture + ArchAdapter,
29{
30 pub fn new(path: impl AsRef<Path>) -> Result<Self, VmiError> {
32 Ok(Self {
33 inner: XenCoreDumpDriver::new(path)?,
34 })
35 }
36}
37
38impl<Arch> VmiDriver for VmiXenCoreDumpDriver<Arch>
39where
40 Arch: Architecture + ArchAdapter,
41{
42 type Architecture = Arch;
43
44 fn info(&self) -> Result<VmiInfo, VmiError> {
45 Ok(self.inner.info()?)
46 }
47
48 fn pause(&self) -> Result<(), VmiError> {
49 Ok(self.inner.pause()?)
50 }
51
52 fn resume(&self) -> Result<(), VmiError> {
53 Ok(self.inner.resume()?)
54 }
55
56 fn registers(&self, vcpu: VcpuId) -> Result<Arch::Registers, VmiError> {
57 Ok(self.inner.registers(vcpu)?)
58 }
59
60 fn set_registers(&self, vcpu: VcpuId, registers: Arch::Registers) -> Result<(), VmiError> {
61 Ok(self.inner.set_registers(vcpu, registers)?)
62 }
63
64 fn memory_access(&self, gfn: Gfn, view: View) -> Result<MemoryAccess, VmiError> {
65 Ok(self.inner.memory_access(gfn, view)?)
66 }
67
68 fn set_memory_access(
69 &self,
70 gfn: Gfn,
71 view: View,
72 access: MemoryAccess,
73 ) -> Result<(), VmiError> {
74 Ok(self.inner.set_memory_access(gfn, view, access)?)
75 }
76
77 fn set_memory_access_with_options(
78 &self,
79 gfn: Gfn,
80 view: View,
81 access: MemoryAccess,
82 options: MemoryAccessOptions,
83 ) -> Result<(), VmiError> {
84 Ok(self
85 .inner
86 .set_memory_access_with_options(gfn, view, access, options)?)
87 }
88
89 fn read_page(&self, gfn: Gfn) -> Result<VmiMappedPage, VmiError> {
90 Ok(self.inner.read_page(gfn)?)
91 }
92
93 fn write_page(&self, gfn: Gfn, offset: u64, content: &[u8]) -> Result<VmiMappedPage, VmiError> {
94 Ok(self.inner.write_page(gfn, offset, content)?)
95 }
96
97 fn allocate_gfn(&self, gfn: Gfn) -> Result<(), VmiError> {
98 Ok(self.inner.allocate_gfn(gfn)?)
99 }
100
101 fn free_gfn(&self, gfn: Gfn) -> Result<(), VmiError> {
102 Ok(self.inner.free_gfn(gfn)?)
103 }
104
105 fn default_view(&self) -> View {
106 self.inner.default_view()
107 }
108
109 fn create_view(&self, default_access: MemoryAccess) -> Result<View, VmiError> {
110 Ok(self.inner.create_view(default_access)?)
111 }
112
113 fn destroy_view(&self, view: View) -> Result<(), VmiError> {
114 Ok(self.inner.destroy_view(view)?)
115 }
116
117 fn switch_to_view(&self, view: View) -> Result<(), VmiError> {
118 Ok(self.inner.switch_to_view(view)?)
119 }
120
121 fn change_view_gfn(&self, view: View, old_gfn: Gfn, new_gfn: Gfn) -> Result<(), VmiError> {
122 Ok(self.inner.change_view_gfn(view, old_gfn, new_gfn)?)
123 }
124
125 fn reset_view_gfn(&self, view: View, gfn: Gfn) -> Result<(), VmiError> {
126 Ok(self.inner.reset_view_gfn(view, gfn)?)
127 }
128
129 fn monitor_enable(&self, option: Arch::EventMonitor) -> Result<(), VmiError> {
130 Ok(self.inner.monitor_enable(option)?)
131 }
132
133 fn monitor_disable(&self, option: Arch::EventMonitor) -> Result<(), VmiError> {
134 Ok(self.inner.monitor_disable(option)?)
135 }
136
137 fn inject_interrupt(&self, vcpu: VcpuId, interrupt: Arch::Interrupt) -> Result<(), VmiError> {
138 Ok(self.inner.inject_interrupt(vcpu, interrupt)?)
139 }
140
141 fn events_pending(&self) -> usize {
142 self.inner.events_pending()
143 }
144
145 fn event_processing_overhead(&self) -> Duration {
146 self.inner.event_processing_overhead()
147 }
148
149 fn wait_for_event(
150 &self,
151 timeout: Duration,
152 handler: impl FnMut(&VmiEvent<Arch>) -> VmiEventResponse<Arch>,
153 ) -> Result<(), VmiError> {
154 Ok(self.inner.wait_for_event(timeout, handler)?)
155 }
156
157 fn reset_state(&self) -> Result<(), VmiError> {
158 Ok(self.inner.reset_state()?)
159 }
160}