Skip to main content

xen/ctrl/altp2m/
mod.rs

1mod view;
2use xen_sys::{xc_altp2m_set_domain_state, xc_altp2m_switch_to_view};
3
4pub use self::view::XenAltP2MView;
5use crate::{MemoryAccess, XenDomainId, XenError, ctrl::XenInterface, xc_check_error};
6pub struct XenAltP2M {
7    interface: XenInterface,
8    domain_id: XenDomainId,
9}
10
11impl XenAltP2M {
12    pub(crate) fn new(interface: XenInterface, domain_id: XenDomainId) -> Result<Self, XenError> {
13        let rc = unsafe { xc_altp2m_set_domain_state(interface.handle.0, domain_id.0, true) };
14        xc_check_error!(interface.handle.0, rc);
15        Ok(Self {
16            interface,
17            domain_id,
18        })
19    }
20
21    pub fn create_view(&self, default_access: MemoryAccess) -> Result<XenAltP2MView, XenError> {
22        XenAltP2MView::new(self.interface.clone(), self.domain_id, default_access)
23    }
24
25    pub fn reset_view(&self) -> Result<(), XenError> {
26        let rc = unsafe { xc_altp2m_switch_to_view(self.interface.handle.0, self.domain_id.0, 0) };
27        xc_check_error!(self.interface.handle.0, rc);
28        Ok(())
29    }
30}
31
32impl Drop for XenAltP2M {
33    fn drop(&mut self) {
34        tracing::trace!(?self.domain_id, "disabling altp2m");
35        let _ = self.reset_view();
36        unsafe {
37            xc_altp2m_set_domain_state(self.interface.handle.0, self.domain_id.0, false);
38        }
39    }
40}