diff --git a/hypervisor/src/kvm/mod.rs b/hypervisor/src/kvm/mod.rs index 6f2b92c13..e9ff2a752 100644 --- a/hypervisor/src/kvm/mod.rs +++ b/hypervisor/src/kvm/mod.rs @@ -92,9 +92,8 @@ pub use { kvm_bindings::kvm_clock_data as ClockData, kvm_bindings::kvm_create_device as CreateDevice, kvm_bindings::kvm_device_attr as DeviceAttr, kvm_bindings::kvm_irq_routing_entry as IrqRoutingEntry, kvm_bindings::kvm_mp_state as MpState, - kvm_bindings::kvm_run, kvm_bindings::kvm_userspace_memory_region as MemoryRegion, - kvm_bindings::kvm_vcpu_events as VcpuEvents, kvm_ioctls::DeviceFd, kvm_ioctls::IoEventAddress, - kvm_ioctls::VcpuExit, + kvm_bindings::kvm_run, kvm_bindings::kvm_vcpu_events as VcpuEvents, kvm_ioctls::DeviceFd, + kvm_ioctls::IoEventAddress, kvm_ioctls::VcpuExit, }; #[cfg(target_arch = "x86_64")] @@ -456,8 +455,8 @@ impl vm::Vm for KvmVm { userspace_addr: u64, readonly: bool, log_dirty_pages: bool, - ) -> MemoryRegion { - MemoryRegion { + ) -> UserMemoryRegion { + kvm_userspace_memory_region { slot, guest_phys_addr, memory_size, @@ -469,12 +468,13 @@ impl vm::Vm for KvmVm { 0 }, } + .into() } /// /// Creates a guest physical memory region. /// - fn create_user_memory_region(&self, user_memory_region: MemoryRegion) -> vm::Result<()> { - let mut region = user_memory_region; + fn create_user_memory_region(&self, user_memory_region: UserMemoryRegion) -> vm::Result<()> { + let mut region: kvm_userspace_memory_region = user_memory_region.into(); if (region.flags & KVM_MEM_LOG_DIRTY_PAGES) != 0 { if (region.flags & KVM_MEM_READONLY) != 0 { @@ -509,8 +509,8 @@ impl vm::Vm for KvmVm { /// /// Removes a guest physical memory region. /// - fn remove_user_memory_region(&self, user_memory_region: MemoryRegion) -> vm::Result<()> { - let mut region = user_memory_region; + fn remove_user_memory_region(&self, user_memory_region: UserMemoryRegion) -> vm::Result<()> { + let mut region: kvm_userspace_memory_region = user_memory_region.into(); // Remove the corresponding entry from "self.dirty_log_slots" if needed self.dirty_log_slots.write().unwrap().remove(®ion.slot); @@ -620,7 +620,7 @@ impl vm::Vm for KvmVm { fn start_dirty_log(&self) -> vm::Result<()> { let dirty_log_slots = self.dirty_log_slots.read().unwrap(); for (_, s) in dirty_log_slots.iter() { - let region = MemoryRegion { + let region = kvm_userspace_memory_region { slot: s.slot, guest_phys_addr: s.guest_phys_addr, memory_size: s.memory_size, @@ -644,7 +644,7 @@ impl vm::Vm for KvmVm { fn stop_dirty_log(&self) -> vm::Result<()> { let dirty_log_slots = self.dirty_log_slots.read().unwrap(); for (_, s) in dirty_log_slots.iter() { - let region = MemoryRegion { + let region = kvm_userspace_memory_region { slot: s.slot, guest_phys_addr: s.guest_phys_addr, memory_size: s.memory_size, diff --git a/hypervisor/src/lib.rs b/hypervisor/src/lib.rs index 93ff16452..9602fac20 100644 --- a/hypervisor/src/lib.rs +++ b/hypervisor/src/lib.rs @@ -61,15 +61,15 @@ pub use kvm::{aarch64, GicState}; #[cfg(feature = "kvm")] pub use kvm::{ ClockData, CpuState, CreateDevice, DeviceAttr, DeviceFd, IoEventAddress, IrqRoutingEntry, - MemoryRegion, MpState, VcpuEvents, VcpuExit, VmState, + MpState, VcpuEvents, VcpuExit, VmState, }; #[cfg(all(feature = "mshv", target_arch = "x86_64"))] pub use mshv::x86_64; // Aliased types exposed from both hypervisors #[cfg(all(feature = "mshv", target_arch = "x86_64"))] pub use mshv::{ - CpuState, CreateDevice, DeviceAttr, DeviceFd, IoEventAddress, IrqRoutingEntry, MemoryRegion, - MpState, VcpuEvents, VcpuExit, VmState, + CpuState, CreateDevice, DeviceAttr, DeviceFd, IoEventAddress, IrqRoutingEntry, MpState, + VcpuEvents, VcpuExit, VmState, }; use std::sync::Arc; pub use vm::{ diff --git a/hypervisor/src/mshv/mod.rs b/hypervisor/src/mshv/mod.rs index bc8246168..05cc1aab4 100644 --- a/hypervisor/src/mshv/mod.rs +++ b/hypervisor/src/mshv/mod.rs @@ -960,7 +960,8 @@ impl vm::Vm for MshvVm { } /// Creates a guest physical memory region. - fn create_user_memory_region(&self, user_memory_region: MemoryRegion) -> vm::Result<()> { + fn create_user_memory_region(&self, user_memory_region: UserMemoryRegion) -> vm::Result<()> { + let user_memory_region: mshv_user_mem_region = user_memory_region.into(); // No matter read only or not we keep track the slots. // For readonly hypervisor can enable the dirty bits, // but a VM exit happens before setting the dirty bits @@ -979,7 +980,8 @@ impl vm::Vm for MshvVm { } /// Removes a guest physical memory region. - fn remove_user_memory_region(&self, user_memory_region: MemoryRegion) -> vm::Result<()> { + fn remove_user_memory_region(&self, user_memory_region: UserMemoryRegion) -> vm::Result<()> { + let user_memory_region: mshv_user_mem_region = user_memory_region.into(); // Remove the corresponding entry from "self.dirty_log_slots" if needed self.dirty_log_slots .write() @@ -1000,7 +1002,7 @@ impl vm::Vm for MshvVm { userspace_addr: u64, readonly: bool, _log_dirty_pages: bool, - ) -> MemoryRegion { + ) -> UserMemoryRegion { let mut flags = HV_MAP_GPA_READABLE | HV_MAP_GPA_EXECUTABLE; if !readonly { flags |= HV_MAP_GPA_WRITABLE; @@ -1012,6 +1014,7 @@ impl vm::Vm for MshvVm { size: memory_size, userspace_addr: userspace_addr as u64, } + .into() } /// diff --git a/hypervisor/src/vm.rs b/hypervisor/src/vm.rs index 0c0457188..bba759136 100644 --- a/hypervisor/src/vm.rs +++ b/hypervisor/src/vm.rs @@ -23,7 +23,8 @@ use crate::x86_64::CpuId; #[cfg(all(feature = "kvm", target_arch = "x86_64"))] use crate::ClockData; use crate::CreateDevice; -use crate::{IoEventAddress, IrqRoutingEntry, MemoryRegion}; +use crate::UserMemoryRegion; +use crate::{IoEventAddress, IrqRoutingEntry}; #[cfg(feature = "kvm")] use kvm_ioctls::Cap; #[cfg(target_arch = "x86_64")] @@ -311,11 +312,11 @@ pub trait Vm: Send + Sync { userspace_addr: u64, readonly: bool, log_dirty_pages: bool, - ) -> MemoryRegion; + ) -> UserMemoryRegion; /// Creates a guest physical memory slot. - fn create_user_memory_region(&self, user_memory_region: MemoryRegion) -> Result<()>; + fn create_user_memory_region(&self, user_memory_region: UserMemoryRegion) -> Result<()>; /// Removes a guest physical memory slot. - fn remove_user_memory_region(&self, user_memory_region: MemoryRegion) -> Result<()>; + fn remove_user_memory_region(&self, user_memory_region: UserMemoryRegion) -> Result<()>; /// Creates an emulated device in the kernel. fn create_device(&self, device: &mut CreateDevice) -> Result>; /// Returns the preferred CPU target type which can be emulated by KVM on underlying host.