1mod altp2m;
2pub use self::altp2m::{XenAltP2M, XenAltP2MView};
3
4mod domain;
5pub use self::domain::{XenDomain, XenDomainInfo};
6
7mod event;
8pub use self::event::{
9 VmEvent, VmEventCpuid, VmEventCtrlReg, VmEventData, VmEventDebug, VmEventDescriptorAccess,
10 VmEventEmulInsnData, VmEventEmulReadData, VmEventFastSinglestep, VmEventFlag,
11 VmEventFlagOptions, VmEventInterrupt, VmEventIo, VmEventMemAccess, VmEventMovToMsr,
12 VmEventPaging, VmEventReason, VmEventRegs, VmEventRegsX86, VmEventSelectorReg, VmEventSharing,
13 VmEventSinglestep, VmEventVmExit, VmEventWriteCtrlReg,
14};
15
16mod handle;
17pub use self::handle::XenInterfaceHandle;
18
19mod interface;
20pub use self::interface::XenInterface;
21
22mod monitor;
23pub use self::monitor::{VmEventRing, XenMonitor};
24use crate::{Architecture, XenDomainId, XenError};
25
26pub struct XenControl {
27 interface: XenInterface,
28}
29
30impl XenControl {
31 pub fn new() -> Result<Self, XenError> {
32 Ok(Self {
33 interface: XenInterface::new()?,
34 })
35 }
36
37 pub fn attach(interface: XenInterface) -> Result<Self, XenError> {
38 Ok(Self { interface })
39 }
40
41 pub fn domain<Arch>(&self, id: XenDomainId) -> Result<XenDomain<Arch>, XenError>
42 where
43 Arch: Architecture,
44 {
45 XenDomain::new(self.interface.clone(), id)
46 }
47}