2024-01-10 22:42:26 -08:00
|
|
|
use crate::sys::{
|
|
|
|
MemoryReservation, MultiCallEntry, HYPERVISOR_MEMORY_OP, XEN_MEM_POPULATE_PHYSMAP,
|
|
|
|
};
|
2024-01-10 16:07:57 -08:00
|
|
|
use crate::{XenCall, XenCallError};
|
|
|
|
|
2024-01-12 14:57:02 -08:00
|
|
|
use log::{trace};
|
2024-01-10 16:07:57 -08:00
|
|
|
use std::ffi::c_ulong;
|
2024-01-11 12:21:33 -08:00
|
|
|
use std::os::fd::AsRawFd;
|
2024-01-10 19:18:48 -08:00
|
|
|
use std::ptr::addr_of_mut;
|
2024-01-10 16:07:57 -08:00
|
|
|
|
|
|
|
pub struct MemoryControl<'a> {
|
|
|
|
call: &'a XenCall,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl MemoryControl<'_> {
|
|
|
|
pub fn new(call: &XenCall) -> MemoryControl {
|
|
|
|
MemoryControl { call }
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn populate_physmap(
|
|
|
|
&self,
|
|
|
|
domid: u32,
|
|
|
|
nr_extents: u64,
|
|
|
|
extent_order: u32,
|
|
|
|
mem_flags: u32,
|
|
|
|
extent_starts: &[u64],
|
|
|
|
) -> Result<Vec<u64>, XenCallError> {
|
2024-01-11 12:21:33 -08:00
|
|
|
trace!("memory fd={} populate_physmap domid={} nr_extents={} extent_order={} mem_flags={} extent_starts={:?}", self.call.handle.as_raw_fd(), domid, nr_extents, extent_order, mem_flags, extent_starts);
|
2024-01-10 19:18:48 -08:00
|
|
|
let mut extent_starts = extent_starts.to_vec();
|
2024-01-12 14:57:02 -08:00
|
|
|
let ptr = extent_starts.as_mut_ptr();
|
|
|
|
|
2024-01-10 19:18:48 -08:00
|
|
|
let mut reservation = MemoryReservation {
|
2024-01-12 14:57:02 -08:00
|
|
|
extent_start: ptr as c_ulong,
|
2024-01-10 16:07:57 -08:00
|
|
|
nr_extents,
|
|
|
|
extent_order,
|
|
|
|
mem_flags,
|
|
|
|
domid: domid as u16,
|
|
|
|
};
|
2024-01-10 19:18:48 -08:00
|
|
|
|
2024-01-10 22:42:26 -08:00
|
|
|
let calls = &mut [MultiCallEntry {
|
|
|
|
op: HYPERVISOR_MEMORY_OP,
|
|
|
|
result: 0,
|
|
|
|
args: [
|
|
|
|
XEN_MEM_POPULATE_PHYSMAP as c_ulong,
|
|
|
|
addr_of_mut!(reservation) as c_ulong,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
],
|
|
|
|
}];
|
|
|
|
self.call.multicall(calls)?;
|
2024-01-12 14:57:02 -08:00
|
|
|
let code = calls[0].result;
|
|
|
|
if code > !0xfff {
|
2024-01-10 19:18:48 -08:00
|
|
|
return Err(XenCallError::new("failed to populate physmap"));
|
|
|
|
}
|
|
|
|
if code as usize > extent_starts.len() {
|
|
|
|
return Err(XenCallError::new("failed to populate physmap"));
|
|
|
|
}
|
|
|
|
Ok(extent_starts[0..code as usize].to_vec())
|
2024-01-10 16:07:57 -08:00
|
|
|
}
|
|
|
|
}
|