Skip to main content

vmi_driver_xen_core_dump/
lib.rs

1//! VMI driver for Xen core dump.
2
3mod 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
18/// VMI driver for Xen core dump.
19pub 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    /// Creates a new VMI driver for Xen core dump.
31    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}