diff --git a/xencall/src/lib.rs b/xencall/src/lib.rs index 9db68f4..9c9362d 100644 --- a/xencall/src/lib.rs +++ b/xencall/src/lib.rs @@ -10,7 +10,7 @@ use crate::sys::{ XEN_DOMCTL_GETDOMAININFO, XEN_DOMCTL_GETPAGEFRAMEINFO3, XEN_DOMCTL_GETVCPUCONTEXT, XEN_DOMCTL_HYPERCALL_INIT, XEN_DOMCTL_INTERFACE_VERSION, XEN_DOMCTL_MAX_MEM, XEN_DOMCTL_MAX_VCPUS, XEN_DOMCTL_PAUSEDOMAIN, XEN_DOMCTL_SETVCPUCONTEXT, - XEN_DOMCTL_SET_ADDRESS_SIZE, XEN_DOMCTL_UNPAUSEDOMAIN, XEN_MEM_MEMORY_MAP, + XEN_DOMCTL_SET_ADDRESS_SIZE, XEN_DOMCTL_UNPAUSEDOMAIN, XEN_MEM_CLAIM_PAGES, XEN_MEM_MEMORY_MAP, XEN_MEM_POPULATE_PHYSMAP, }; use libc::{c_int, mmap, usleep, MAP_FAILED, MAP_SHARED, PROT_READ, PROT_WRITE}; @@ -644,6 +644,28 @@ impl XenCall { Ok(extents) } + pub fn claim_pages(&self, domid: u32, pages: u64) -> Result<(), XenCallError> { + trace!( + "memory fd={} claim_pages domid={} pages={}", + self.handle.as_raw_fd(), + domid, + pages + ); + let mut reservation = MemoryReservation { + extent_start: 0, + nr_extents: pages, + extent_order: 0, + mem_flags: 0, + domid: domid as u16, + }; + self.hypercall2( + HYPERVISOR_MEMORY_OP, + XEN_MEM_CLAIM_PAGES as c_ulong, + addr_of_mut!(reservation) as c_ulong, + )?; + Ok(()) + } + pub fn mmuext( &self, domid: u32, diff --git a/xencall/src/sys.rs b/xencall/src/sys.rs index 2b61a83..3af3ea0 100644 --- a/xencall/src/sys.rs +++ b/xencall/src/sys.rs @@ -365,6 +365,7 @@ pub struct MultiCallEntry { pub const XEN_MEM_POPULATE_PHYSMAP: u32 = 6; pub const XEN_MEM_MEMORY_MAP: u32 = 9; +pub const XEN_MEM_CLAIM_PAGES: u32 = 24; #[repr(C)] #[derive(Copy, Clone, Debug)] diff --git a/xenclient/src/x86.rs b/xenclient/src/x86.rs index 2b019f5..13d6313 100644 --- a/xenclient/src/x86.rs +++ b/xenclient/src/x86.rs @@ -478,6 +478,7 @@ impl ArchBootSetup for X86BootSetup { } fn meminit(&mut self, setup: &mut BootSetup, total_pages: u64) -> Result<(), XenClientError> { + setup.call.claim_pages(setup.domid, total_pages)?; let mut vmemranges: Vec = Vec::new(); let stub = VmemRange { start: 0, @@ -584,6 +585,7 @@ impl ArchBootSetup for X86BootSetup { } setup.phys.load_p2m(p2m); + setup.call.claim_pages(setup.domid, 0)?; Ok(()) }