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}