libxen 0.5.0

Safe bindings for Xen libraries
Documentation
mod view;
use xen_sys::{xc_altp2m_set_domain_state, xc_altp2m_switch_to_view};

pub use self::view::XenAltP2MView;
use crate::{MemoryAccess, XenDomainId, XenError, ctrl::XenInterface, xc_check_error};
pub struct XenAltP2M {
    interface: XenInterface,
    domain_id: XenDomainId,
}

impl XenAltP2M {
    pub(crate) fn new(interface: XenInterface, domain_id: XenDomainId) -> Result<Self, XenError> {
        let rc = unsafe { xc_altp2m_set_domain_state(interface.handle.0, domain_id.0, true) };
        xc_check_error!(interface.handle.0, rc);
        Ok(Self {
            interface,
            domain_id,
        })
    }

    pub fn create_view(&self, default_access: MemoryAccess) -> Result<XenAltP2MView, XenError> {
        XenAltP2MView::new(self.interface.clone(), self.domain_id, default_access)
    }

    pub fn reset_view(&self) -> Result<(), XenError> {
        let rc = unsafe { xc_altp2m_switch_to_view(self.interface.handle.0, self.domain_id.0, 0) };
        xc_check_error!(self.interface.handle.0, rc);
        Ok(())
    }
}

impl Drop for XenAltP2M {
    fn drop(&mut self) {
        tracing::trace!(?self.domain_id, "disabling altp2m");
        let _ = self.reset_view();
        unsafe {
            xc_altp2m_set_domain_state(self.interface.handle.0, self.domain_id.0, false);
        }
    }
}