2024-01-10 16:07:57 -08:00
|
|
|
use crate::sys::{MemoryReservation, HYPERVISOR_MEMORY_OP, XEN_MEM_POPULATE_PHYSMAP};
|
|
|
|
use crate::{XenCall, XenCallError};
|
|
|
|
|
|
|
|
use std::ffi::c_ulong;
|
|
|
|
|
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-10 19:18:48 -08:00
|
|
|
let mut extent_starts = extent_starts.to_vec();
|
|
|
|
let mut reservation = MemoryReservation {
|
|
|
|
extent_start: extent_starts.as_mut_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
|
|
|
let code = self.call.hypercall2(
|
2024-01-10 16:07:57 -08:00
|
|
|
HYPERVISOR_MEMORY_OP,
|
|
|
|
XEN_MEM_POPULATE_PHYSMAP as c_ulong,
|
2024-01-10 19:18:48 -08:00
|
|
|
addr_of_mut!(reservation) as c_ulong,
|
2024-01-10 16:07:57 -08:00
|
|
|
)?;
|
2024-01-10 19:18:48 -08:00
|
|
|
|
|
|
|
if code < 0 {
|
|
|
|
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
|
|
|
}
|
|
|
|
}
|