From 07a48a9c718d53329c7150322ca01a63c439ec48 Mon Sep 17 00:00:00 2001 From: Zhang Junyu Date: Thu, 12 Mar 2026 01:56:44 +0800 Subject: [PATCH] refine: Minor refine vm-mm --- .../src/boot_loader/arch/aarch64.rs | 4 +- crates/vm-bootloader/src/initrd_loader.rs | 4 +- .../src/kernel_loader/linux/bzimage.rs | 2 +- .../src/kernel_loader/linux/image.rs | 4 +- crates/vm-core/src/virt.rs | 2 +- crates/vm-core/src/virt/hvp.rs | 2 +- crates/vm-core/src/virt/hvp/mm.rs | 8 +- .../virtio/virtio_balloon_traditional.rs | 2 +- .../vm-device/src/device/virtio/virtio_blk.rs | 2 +- .../src/device/virtio/virtio_mmio_kbd.rs | 2 +- crates/vm-machine/src/device.rs | 2 +- crates/vm-machine/src/firmware/bios.rs | 2 +- crates/vm-mm/src/allocator.rs | 5 +- crates/vm-mm/src/allocator/mmap_allocator.rs | 19 +- crates/vm-mm/src/error.rs | 6 - crates/vm-mm/src/lib.rs | 3 + crates/vm-mm/src/manager.rs | 215 +++++++++++++----- crates/vm-mm/src/memory_container.rs | 5 + crates/vm-mm/src/region.rs | 16 +- crates/vm-virtio/src/device/virtqueue.rs | 2 +- crates/vm-virtio/src/transport.rs | 2 +- crates/vm-virtio/src/transport/mmio.rs | 2 +- .../src/transport/mmio/mmio_handler.rs | 2 +- crates/vm-virtio/src/transport/pci.rs | 2 +- .../transport/pci/common_config_handler.rs | 2 +- .../src/transport/pci/device_handler.rs | 2 +- .../src/transport/pci/isr_handler.rs | 2 +- .../src/transport/pci/notify_handler.rs | 2 +- crates/vm-virtio/src/virtqueue.rs | 2 +- .../src/virtqueue/virtq_desc_table.rs | 2 +- 30 files changed, 220 insertions(+), 107 deletions(-) create mode 100644 crates/vm-mm/src/memory_container.rs diff --git a/crates/vm-bootloader/src/boot_loader/arch/aarch64.rs b/crates/vm-bootloader/src/boot_loader/arch/aarch64.rs index 6a979f3..456c5ca 100644 --- a/crates/vm-bootloader/src/boot_loader/arch/aarch64.rs +++ b/crates/vm-bootloader/src/boot_loader/arch/aarch64.rs @@ -9,8 +9,8 @@ use vm_core::arch::layout::MemoryLayout; use vm_core::device::mmio::mmio_device::MmioDevice; use vm_core::virt::Virt; use vm_fdt::FdtWriter; -use vm_mm::allocator::MemoryContainer; use vm_mm::manager::MemoryAddressSpace; +use vm_mm::memory_container::MemoryContainer; use crate::boot_loader::BootLoader; use crate::boot_loader::BootLoaderBuilder; @@ -107,7 +107,7 @@ impl AArch64BootLoader { } memory - .copy_from_slice(dtb_start, &dtb, dtb.len()) + .copy_from_slice(dtb_start, &dtb) .map_err(|_| Error::LoadDtbFailed("failed to copy".to_string()))?; layout.set_dtb_len(dtb.len())?; diff --git a/crates/vm-bootloader/src/initrd_loader.rs b/crates/vm-bootloader/src/initrd_loader.rs index c517650..5ec6389 100644 --- a/crates/vm-bootloader/src/initrd_loader.rs +++ b/crates/vm-bootloader/src/initrd_loader.rs @@ -1,8 +1,8 @@ use std::fs; use std::path::Path; -use vm_mm::allocator::MemoryContainer; use vm_mm::manager::MemoryAddressSpace; +use vm_mm::memory_container::MemoryContainer; #[derive(thiserror::Error, Debug)] pub enum Error { @@ -35,7 +35,7 @@ impl InitrdLoader { C: MemoryContainer, { memory - .copy_from_slice(addr, &self.initrd, self.initrd.len()) + .copy_from_slice(addr, &self.initrd) .map_err(|_| Error::CopyFailed)?; Ok(LoadResult { diff --git a/crates/vm-bootloader/src/kernel_loader/linux/bzimage.rs b/crates/vm-bootloader/src/kernel_loader/linux/bzimage.rs index 98bf4ab..6ab61a8 100644 --- a/crates/vm-bootloader/src/kernel_loader/linux/bzimage.rs +++ b/crates/vm-bootloader/src/kernel_loader/linux/bzimage.rs @@ -2,8 +2,8 @@ use std::fs; use std::path::Path; use header::*; -use vm_mm::allocator::MemoryContainer; use vm_mm::manager::MemoryAddressSpace; +use vm_mm::memory_container::MemoryContainer; use crate::kernel_loader::Error; use crate::kernel_loader::KernelLoader; diff --git a/crates/vm-bootloader/src/kernel_loader/linux/image.rs b/crates/vm-bootloader/src/kernel_loader/linux/image.rs index 1c07d16..bd52936 100644 --- a/crates/vm-bootloader/src/kernel_loader/linux/image.rs +++ b/crates/vm-bootloader/src/kernel_loader/linux/image.rs @@ -6,8 +6,8 @@ use std::fs; use std::path::Path; use tracing::debug; -use vm_mm::allocator::MemoryContainer; use vm_mm::manager::MemoryAddressSpace; +use vm_mm::memory_container::MemoryContainer; use zerocopy::FromBytes; use crate::kernel_loader::Error; @@ -128,7 +128,7 @@ where } memory - .copy_from_slice(kernel_start, &self.kernel, self.kernel.len()) + .copy_from_slice(kernel_start, &self.kernel) .map_err(|err| Error::CopyKernelFailed(err.to_string()))?; Ok(LoadResult { diff --git a/crates/vm-core/src/virt.rs b/crates/vm-core/src/virt.rs index 8c25864..77a5cca 100644 --- a/crates/vm-core/src/virt.rs +++ b/crates/vm-core/src/virt.rs @@ -1,7 +1,7 @@ use std::sync::Arc; -use vm_mm::allocator::MemoryContainer; use vm_mm::manager::MemoryAddressSpace; +use vm_mm::memory_container::MemoryContainer; use crate::arch::Arch; use crate::arch::irq::InterruptController; diff --git a/crates/vm-core/src/virt/hvp.rs b/crates/vm-core/src/virt/hvp.rs index c45f5c2..ba2a3b5 100644 --- a/crates/vm-core/src/virt/hvp.rs +++ b/crates/vm-core/src/virt/hvp.rs @@ -282,7 +282,7 @@ impl Virt for Hvp { let mut memory = allocator.alloc(memory_size, None)?; memory.0.map(ram_base, MemPerms::ReadWriteExec)?; memory_address_space - .try_insert(MemoryRegion::new(ram_base, memory_size, memory)) + .try_insert(MemoryRegion::new(ram_base, memory)) .map_err(|_| Error::FailedInitialize("Failed to initialize memory".to_string()))?; self.get_layout_mut().set_ram_size(memory_size as u64)?; diff --git a/crates/vm-core/src/virt/hvp/mm.rs b/crates/vm-core/src/virt/hvp/mm.rs index e86425f..bc421f6 100644 --- a/crates/vm-core/src/virt/hvp/mm.rs +++ b/crates/vm-core/src/virt/hvp/mm.rs @@ -1,8 +1,8 @@ use applevisor::memory::Memory; use applevisor::vm::VirtualMachineInstance; use vm_mm::allocator::Allocator; -use vm_mm::allocator::MemoryContainer; use vm_mm::error::Error; +use vm_mm::memory_container::MemoryContainer; pub struct MemoryWrapper(pub Memory); @@ -10,9 +10,13 @@ unsafe impl Send for MemoryWrapper {} unsafe impl Sync for MemoryWrapper {} impl MemoryContainer for MemoryWrapper { - fn to_hva(&self) -> *mut u8 { + fn hva(&self) -> *mut u8 { self.0.host_addr() } + + fn length(&self) -> usize { + self.0.size() + } } pub struct HvpAllocator<'a, Gic> { diff --git a/crates/vm-device/src/device/virtio/virtio_balloon_traditional.rs b/crates/vm-device/src/device/virtio/virtio_balloon_traditional.rs index cd4040c..1ea301e 100644 --- a/crates/vm-device/src/device/virtio/virtio_balloon_traditional.rs +++ b/crates/vm-device/src/device/virtio/virtio_balloon_traditional.rs @@ -4,8 +4,8 @@ use std::sync::Mutex; use tokio::sync::Notify; use vm_core::arch::irq::InterruptController; -use vm_mm::allocator::MemoryContainer; use vm_mm::manager::MemoryAddressSpace; +use vm_mm::memory_container::MemoryContainer; use vm_virtio::device::VirtioDevice; use vm_virtio::device::transport::TransportContext; use vm_virtio::device::virtqueue::VirtqueueHandler; diff --git a/crates/vm-device/src/device/virtio/virtio_blk.rs b/crates/vm-device/src/device/virtio/virtio_blk.rs index ebb14a0..1d470cf 100644 --- a/crates/vm-device/src/device/virtio/virtio_blk.rs +++ b/crates/vm-device/src/device/virtio/virtio_blk.rs @@ -3,8 +3,8 @@ use std::sync::Mutex; use tokio::sync::Notify; use vm_core::arch::irq::InterruptController; -use vm_mm::allocator::MemoryContainer; use vm_mm::manager::MemoryAddressSpace; +use vm_mm::memory_container::MemoryContainer; use vm_pci::device::interrupt::legacy::InterruptPin; use vm_virtio::device::VirtioDevice; use vm_virtio::device::transport::TransportContext; diff --git a/crates/vm-device/src/device/virtio/virtio_mmio_kbd.rs b/crates/vm-device/src/device/virtio/virtio_mmio_kbd.rs index baba78c..286103c 100644 --- a/crates/vm-device/src/device/virtio/virtio_mmio_kbd.rs +++ b/crates/vm-device/src/device/virtio/virtio_mmio_kbd.rs @@ -9,7 +9,7 @@ use vm_core::device::Device; use vm_core::device::mmio::MmioDevice; use vm_core::device::mmio::MmioRange; use vm_core::arch::irq::InterruptController; -use vm_mm::allocator::MemoryContainer; +use vm_mm::memory_container::MemoryContainer; use vm_mm::manager::MemoryAddressSpace; use vm_virtio::transport::Virtio; use vm_virtio::transport::mmio::VirtioMmio; diff --git a/crates/vm-machine/src/device.rs b/crates/vm-machine/src/device.rs index b607c86..27e3058 100644 --- a/crates/vm-machine/src/device.rs +++ b/crates/vm-machine/src/device.rs @@ -11,8 +11,8 @@ use vm_device::device::virtio::virtio_balloon_traditional::VirtioBalloonTranditi use vm_device::device::virtio::virtio_balloon_traditional::VirtioMmioBalloonDevice; use vm_device::device::virtio::virtio_blk::VirtioBlkDevice; use vm_device::device::virtio::virtio_blk::VirtioMmioBlkDevice; -use vm_mm::allocator::MemoryContainer; use vm_mm::manager::MemoryAddressSpace; +use vm_mm::memory_container::MemoryContainer; use vm_pci::root_complex::mmio::PciRootComplexMmio; use vm_virtio::transport::VirtioDev; use vm_virtio::transport::pci::VirtioPciDevice; diff --git a/crates/vm-machine/src/firmware/bios.rs b/crates/vm-machine/src/firmware/bios.rs index 35d86b5..187e215 100644 --- a/crates/vm-machine/src/firmware/bios.rs +++ b/crates/vm-machine/src/firmware/bios.rs @@ -1,5 +1,5 @@ -use vm_mm::allocator::MemoryContainer; use vm_mm::manager::MemoryAddressSpace; +use vm_mm::memory_container::MemoryContainer; use crate::firmware::bios::e820::*; use crate::firmware::bios::ivt::InterruptVectorTable; diff --git a/crates/vm-mm/src/allocator.rs b/crates/vm-mm/src/allocator.rs index c7e2064..76a0315 100644 --- a/crates/vm-mm/src/allocator.rs +++ b/crates/vm-mm/src/allocator.rs @@ -1,11 +1,8 @@ use crate::error::Error; +use crate::memory_container::MemoryContainer; pub mod mmap_allocator; -pub trait MemoryContainer: Send + Sync + 'static { - fn to_hva(&self) -> *mut u8; -} - pub trait Allocator { type Container: MemoryContainer; diff --git a/crates/vm-mm/src/allocator/mmap_allocator.rs b/crates/vm-mm/src/allocator/mmap_allocator.rs index cc0a26d..76d8e80 100644 --- a/crates/vm-mm/src/allocator/mmap_allocator.rs +++ b/crates/vm-mm/src/allocator/mmap_allocator.rs @@ -2,16 +2,15 @@ use memmap2::MmapMut; use crate::allocator::Allocator; use crate::error::Error; +use crate::memory_container::MemoryContainer; -mod container { - use memmap2::MmapMut; - - use crate::allocator::MemoryContainer; +impl MemoryContainer for MmapMut { + fn hva(&self) -> *mut u8 { + self.as_ptr() as *mut u8 + } - impl MemoryContainer for MmapMut { - fn to_hva(&self) -> *mut u8 { - self.as_ptr() as *mut u8 - } + fn length(&self) -> usize { + self.len() } } @@ -25,8 +24,6 @@ impl Allocator for MmapAllocator { unimplemented!() } - let mmap = MmapMut::map_anon(len).map_err(|_| Error::AllocAnonymousMemoryFailed { len })?; - - Ok(mmap) + MmapMut::map_anon(len).map_err(|_| Error::AllocAnonymousMemoryFailed { len }) } } diff --git a/crates/vm-mm/src/error.rs b/crates/vm-mm/src/error.rs index b642254..118c4f4 100644 --- a/crates/vm-mm/src/error.rs +++ b/crates/vm-mm/src/error.rs @@ -3,12 +3,6 @@ pub enum Error { #[error("failed to allocate anonymous memory, len: {len}")] AllocAnonymousMemoryFailed { len: usize }, - #[error("try to access an uninitialized memory")] - MemoryIsNotAllocated, - - #[error("memory already allocated, cannot allocate again")] - MemoryAlreadyAllocated, - #[error("try to access invalid gpa: {0}")] AccessInvalidGpa(u64), diff --git a/crates/vm-mm/src/lib.rs b/crates/vm-mm/src/lib.rs index be82980..d948c3f 100644 --- a/crates/vm-mm/src/lib.rs +++ b/crates/vm-mm/src/lib.rs @@ -1,4 +1,7 @@ +#![deny(warnings)] + pub mod allocator; pub mod error; pub mod manager; +pub mod memory_container; pub mod region; diff --git a/crates/vm-mm/src/manager.rs b/crates/vm-mm/src/manager.rs index f664b4b..76288ea 100644 --- a/crates/vm-mm/src/manager.rs +++ b/crates/vm-mm/src/manager.rs @@ -1,11 +1,11 @@ use std::collections::BTreeMap; -use std::collections::btree_map; -use crate::allocator::MemoryContainer; use crate::error::Error; +use crate::memory_container::MemoryContainer; use crate::region::MemoryRegion; pub struct MemoryAddressSpace { + /// gpa |-> memory region regions: BTreeMap>, } @@ -17,15 +17,6 @@ impl Default for MemoryAddressSpace { } } -impl<'a, C> IntoIterator for &'a MemoryAddressSpace { - type Item = &'a MemoryRegion; - type IntoIter = btree_map::Values<'a, u64, MemoryRegion>; - - fn into_iter(self) -> Self::IntoIter { - self.regions.values() - } -} - impl MemoryAddressSpace where C: MemoryContainer, @@ -35,45 +26,90 @@ where return Err(region); } - self.regions.insert(region.gpa, region); + let old = self.regions.insert(region.gpa, region); + assert!(old.is_none()); Ok(()) } + // TODO: the API is not friendly to multi regions, try to avoid expose hva? pub fn gpa_to_hva(&self, gpa: u64) -> Result<*mut u8, Error> { let region = self.try_get_region_by_gpa(gpa)?; - let hva = region.to_hva(); + let hva = region.hva(); - let offset = gpa - region.gpa; - - unsafe { Ok(hva.add(offset as usize)) } + unsafe { Ok(hva.add((gpa - region.gpa) as usize)) } } - pub fn memset(&self, gpa: u64, val: u8, len: usize) -> Result<(), Error> { - let region = self.try_get_region_by_gpa(gpa)?; - let hva = region.to_hva(); - let offset = gpa - region.gpa; + pub fn memset(&self, mut gpa: u64, val: u8, len: usize) -> Result<(), Error> { + let mut check_gpa = gpa; + let mut remaining = len; + + while remaining > 0 { + let region = self.try_get_region_by_gpa(check_gpa)?; + + let offset = check_gpa - region.gpa; + let avail = region.len() - offset as usize; + let step = remaining.min(avail); - if offset + len as u64 > region.len as u64 { - return Err(Error::MemoryOverflow); + remaining -= step; + check_gpa += step as u64; } - unsafe { hva.add(offset as usize).write_bytes(val, len) }; + remaining = len; + + while remaining > 0 { + let region = self.try_get_region_by_gpa(gpa)?; + + let offset = gpa - region.gpa; + let avail = region.len() - offset as usize; + let step = remaining.min(avail); + + unsafe { + region.hva().add(offset as usize).write_bytes(val, step); + } + + remaining -= step; + gpa += step as u64; + } Ok(()) } - pub fn copy_from_slice(&self, gpa: u64, buf: &[u8], len: usize) -> Result<(), Error> { - let region = self.try_get_region_by_gpa(gpa)?; - let hva = region.to_hva(); - let offset = gpa - region.gpa; + pub fn copy_from_slice(&self, mut gpa: u64, buf: &[u8]) -> Result<(), Error> { + let mut remaining = buf.len(); + let mut check_gpa = gpa; + + while remaining > 0 { + let region = self.try_get_region_by_gpa(check_gpa)?; + + let offset = check_gpa - region.gpa; + let avail = region.len() - offset as usize; + let step = remaining.min(avail); - if offset + len as u64 > region.len as u64 { - return Err(Error::MemoryOverflow); + remaining -= step; + check_gpa += step as u64; } - unsafe { - hva.add(offset as usize).copy_from(buf.as_ptr(), len); + remaining = buf.len(); + let mut src_offset = 0; + + while remaining > 0 { + let region = self.try_get_region_by_gpa(gpa)?; + + let offset = gpa - region.gpa; + let avail = region.len() - offset as usize; + let step = remaining.min(avail); + + unsafe { + region + .hva() + .add(offset as usize) + .copy_from_nonoverlapping(buf.as_ptr().add(src_offset), step); + } + + remaining -= step; + src_offset += step; + gpa += step as u64; } Ok(()) @@ -81,20 +117,33 @@ where fn is_overlapping(&self, region: &MemoryRegion) -> bool { let new_left = region.gpa; - let new_right = region.gpa + region.len as u64; + let new_right = region.gpa + region.len() as u64; + + if let Some((_, prev)) = self.regions.range(..=new_left).next_back() { + let prev_right = prev.gpa + prev.len() as u64; + if prev_right > new_left { + return true; + } + } + + if let Some((_, next)) = self.regions.range(new_left..).next() { + let next_left = next.gpa; + if next_left < new_right { + return true; + } + } - self.regions.values().any(|r| { - let left = r.gpa; - let right = left + r.len as u64; - new_left < right && left < new_right - }) + false } fn get_by_gpa(&self, gpa: u64) -> Option<&MemoryRegion> { - self.regions - .values() - .find(|region| gpa >= region.gpa && gpa < region.gpa + region.len as u64) - .map(|v| v as _) + let (_, region) = self.regions.range(..=gpa).next_back()?; + + if gpa < region.gpa + region.len() as u64 { + Some(region) + } else { + None + } } fn try_get_region_by_gpa(&self, gpa: u64) -> Result<&MemoryRegion, Error> { @@ -119,17 +168,17 @@ mod tests { assert!( memory_as - .try_insert(MemoryRegion::new(0, 10, allocator.alloc(10, None)?)) + .try_insert(MemoryRegion::new(0, allocator.alloc(10, None)?)) .is_ok() ); assert!( memory_as - .try_insert(MemoryRegion::new(5, 10, allocator.alloc(10, None)?)) + .try_insert(MemoryRegion::new(5, allocator.alloc(10, None)?)) .is_err() ); assert!( memory_as - .try_insert(MemoryRegion::new(10, 10, allocator.alloc(10, None)?)) + .try_insert(MemoryRegion::new(10, allocator.alloc(10, None)?)) .is_ok() ); @@ -144,9 +193,9 @@ mod tests { let mut memory_as = MemoryAddressSpace::::default(); let allocator = MmapAllocator; - let region = MemoryRegion::new(GPA, LEN, allocator.alloc(LEN, None)?); + let region = MemoryRegion::new(GPA, allocator.alloc(LEN, None)?); - let hva = region.to_hva(); + let hva = region.hva(); assert!(memory_as.try_insert(region).is_ok()); @@ -178,21 +227,81 @@ mod tests { { // Test copy_from_slice ok let val = 0xaa; - memory_as.copy_from_slice(GPA, &[val; LEN], LEN)?; + memory_as.copy_from_slice(GPA, &[val; LEN])?; assert_eq!(unsafe { *hva }, val); assert_eq!(unsafe { *hva.add(LEN - 1) }, val); } { // Test copy_from_slice overflow - assert!( - memory_as - .copy_from_slice(GPA, &[0; LEN + 1], LEN + 1) - .is_err() - ); - assert!(memory_as.copy_from_slice(GPA + 1, &[0; LEN], LEN).is_err()); + assert!(memory_as.copy_from_slice(GPA, &[0; LEN + 1],).is_err()); + assert!(memory_as.copy_from_slice(GPA + 1, &[0; LEN],).is_err()); } Ok(()) } + + #[test] + fn test_memset_multi_regions_ok() -> anyhow::Result<()> { + let mut memory = MemoryAddressSpace::::default(); + let allocator = MmapAllocator; + + let region0 = MemoryRegion::new(0, allocator.alloc(10, None)?); + assert!(memory.try_insert(region0).is_ok()); + + let region1 = MemoryRegion::new(10, allocator.alloc(10, None)?); + assert!(memory.try_insert(region1).is_ok()); + + assert!(memory.memset(0, 0xff, 20).is_ok()); + + Ok(()) + } + + #[test] + fn test_memset_multi_regions_fail() -> anyhow::Result<()> { + let mut memory = MemoryAddressSpace::::default(); + let allocator = MmapAllocator; + + let region0 = MemoryRegion::new(0, allocator.alloc(10, None)?); + assert!(memory.try_insert(region0).is_ok()); + + let region1 = MemoryRegion::new(20, allocator.alloc(10, None)?); + assert!(memory.try_insert(region1).is_ok()); + + assert!(memory.memset(0, 0xff, 20).is_err()); + + Ok(()) + } + + #[test] + fn test_copy_from_slice_multi_regions_ok() -> anyhow::Result<()> { + let mut memory = MemoryAddressSpace::::default(); + let allocator = MmapAllocator; + + let region0 = MemoryRegion::new(0, allocator.alloc(10, None)?); + assert!(memory.try_insert(region0).is_ok()); + + let region1 = MemoryRegion::new(10, allocator.alloc(10, None)?); + assert!(memory.try_insert(region1).is_ok()); + + assert!(memory.copy_from_slice(0, &[0xff; 20]).is_ok()); + + Ok(()) + } + + #[test] + fn test_copy_from_slice_multi_regions_fail() -> anyhow::Result<()> { + let mut memory = MemoryAddressSpace::::default(); + let allocator = MmapAllocator; + + let region0 = MemoryRegion::new(0, allocator.alloc(10, None)?); + assert!(memory.try_insert(region0).is_ok()); + + let region1 = MemoryRegion::new(20, allocator.alloc(10, None)?); + assert!(memory.try_insert(region1).is_ok()); + + assert!(memory.copy_from_slice(0, &[0xff; 20]).is_err()); + + Ok(()) + } } diff --git a/crates/vm-mm/src/memory_container.rs b/crates/vm-mm/src/memory_container.rs new file mode 100644 index 0000000..55c8238 --- /dev/null +++ b/crates/vm-mm/src/memory_container.rs @@ -0,0 +1,5 @@ +pub trait MemoryContainer: Send + Sync + 'static { + fn hva(&self) -> *mut u8; + + fn length(&self) -> usize; +} diff --git a/crates/vm-mm/src/region.rs b/crates/vm-mm/src/region.rs index cfe2fed..4ea71cd 100644 --- a/crates/vm-mm/src/region.rs +++ b/crates/vm-mm/src/region.rs @@ -1,8 +1,7 @@ -use crate::allocator::MemoryContainer; +use crate::memory_container::MemoryContainer; pub struct MemoryRegion { pub gpa: u64, - pub len: usize, pub memory: C, } @@ -10,11 +9,16 @@ impl MemoryRegion where C: MemoryContainer, { - pub fn new(gpa: u64, len: usize, memory: C) -> Self { - MemoryRegion { gpa, len, memory } + pub fn new(gpa: u64, memory: C) -> Self { + MemoryRegion { gpa, memory } } - pub fn to_hva(&self) -> *mut u8 { - self.memory.to_hva() + #[allow(clippy::len_without_is_empty)] + pub fn len(&self) -> usize { + self.memory.length() + } + + pub fn hva(&self) -> *mut u8 { + self.memory.hva() } } diff --git a/crates/vm-virtio/src/device/virtqueue.rs b/crates/vm-virtio/src/device/virtqueue.rs index 1c67765..03cb0a0 100644 --- a/crates/vm-virtio/src/device/virtqueue.rs +++ b/crates/vm-virtio/src/device/virtqueue.rs @@ -3,8 +3,8 @@ use std::sync::Mutex; use tokio::sync::Notify; use vm_core::arch::irq::InterruptController; -use vm_mm::allocator::MemoryContainer; use vm_mm::manager::MemoryAddressSpace; +use vm_mm::memory_container::MemoryContainer; use crate::device::VirtioDevice; use crate::transport::VirtioDev; diff --git a/crates/vm-virtio/src/transport.rs b/crates/vm-virtio/src/transport.rs index 487c1f6..14ee3e0 100644 --- a/crates/vm-virtio/src/transport.rs +++ b/crates/vm-virtio/src/transport.rs @@ -5,7 +5,7 @@ use std::sync::Mutex; use bitflags::Flags; use tokio::sync::Notify; use tracing::warn; -use vm_mm::allocator::MemoryContainer; +use vm_mm::memory_container::MemoryContainer; use crate::device::VirtioDevice; use crate::result::Result; diff --git a/crates/vm-virtio/src/transport/mmio.rs b/crates/vm-virtio/src/transport/mmio.rs index 78e4da2..63155ef 100644 --- a/crates/vm-virtio/src/transport/mmio.rs +++ b/crates/vm-virtio/src/transport/mmio.rs @@ -6,7 +6,7 @@ use vm_core::device::mmio::MmioRange; use vm_core::device::mmio::mmio_device::MmioDevice; use vm_core::device::mmio::mmio_device::MmioHandler; use vm_fdt::FdtWriter; -use vm_mm::allocator::MemoryContainer; +use vm_mm::memory_container::MemoryContainer; use crate::device::VirtioDevice; use crate::transport::VirtioDev; diff --git a/crates/vm-virtio/src/transport/mmio/mmio_handler.rs b/crates/vm-virtio/src/transport/mmio/mmio_handler.rs index 3029403..96eb0ac 100644 --- a/crates/vm-virtio/src/transport/mmio/mmio_handler.rs +++ b/crates/vm-virtio/src/transport/mmio/mmio_handler.rs @@ -3,7 +3,7 @@ use tracing::error; use tracing::warn; use vm_core::device::mmio::MmioRange; use vm_core::device::mmio::mmio_device::MmioHandler; -use vm_mm::allocator::MemoryContainer; +use vm_mm::memory_container::MemoryContainer; use crate::device::VirtioDevice; use crate::result::Result as VirtioResult; diff --git a/crates/vm-virtio/src/transport/pci.rs b/crates/vm-virtio/src/transport/pci.rs index 25eebcb..92b0098 100644 --- a/crates/vm-virtio/src/transport/pci.rs +++ b/crates/vm-virtio/src/transport/pci.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use std::sync::Mutex; -use vm_mm::allocator::MemoryContainer; +use vm_mm::memory_container::MemoryContainer; use vm_pci::device::function::BarHandler; use vm_pci::device::function::PciTypeFunctionCommon; use vm_pci::device::function::type0::Bar; diff --git a/crates/vm-virtio/src/transport/pci/common_config_handler.rs b/crates/vm-virtio/src/transport/pci/common_config_handler.rs index 2763060..32092d0 100644 --- a/crates/vm-virtio/src/transport/pci/common_config_handler.rs +++ b/crates/vm-virtio/src/transport/pci/common_config_handler.rs @@ -3,7 +3,7 @@ use std::sync::Mutex; use strum_macros::FromRepr; use tracing::warn; -use vm_mm::allocator::MemoryContainer; +use vm_mm::memory_container::MemoryContainer; use vm_pci::device::function::BarHandler; use crate::transport::VirtioDev; diff --git a/crates/vm-virtio/src/transport/pci/device_handler.rs b/crates/vm-virtio/src/transport/pci/device_handler.rs index f39e570..bee3da2 100644 --- a/crates/vm-virtio/src/transport/pci/device_handler.rs +++ b/crates/vm-virtio/src/transport/pci/device_handler.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use std::sync::Mutex; -use vm_mm::allocator::MemoryContainer; +use vm_mm::memory_container::MemoryContainer; use vm_pci::device::function::BarHandler; use crate::transport::VirtioDev; diff --git a/crates/vm-virtio/src/transport/pci/isr_handler.rs b/crates/vm-virtio/src/transport/pci/isr_handler.rs index 81ca507..b5832bd 100644 --- a/crates/vm-virtio/src/transport/pci/isr_handler.rs +++ b/crates/vm-virtio/src/transport/pci/isr_handler.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use std::sync::Mutex; -use vm_mm::allocator::MemoryContainer; +use vm_mm::memory_container::MemoryContainer; use vm_pci::device::function::BarHandler; use crate::transport::VirtioDev; diff --git a/crates/vm-virtio/src/transport/pci/notify_handler.rs b/crates/vm-virtio/src/transport/pci/notify_handler.rs index 9a744e0..8cfa91b 100644 --- a/crates/vm-virtio/src/transport/pci/notify_handler.rs +++ b/crates/vm-virtio/src/transport/pci/notify_handler.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use std::sync::Mutex; -use vm_mm::allocator::MemoryContainer; +use vm_mm::memory_container::MemoryContainer; use vm_pci::device::function::BarHandler; use crate::transport::VirtioDev; diff --git a/crates/vm-virtio/src/virtqueue.rs b/crates/vm-virtio/src/virtqueue.rs index 7833237..b25fe99 100644 --- a/crates/vm-virtio/src/virtqueue.rs +++ b/crates/vm-virtio/src/virtqueue.rs @@ -1,5 +1,5 @@ -use vm_mm::allocator::MemoryContainer; use vm_mm::manager::MemoryAddressSpace; +use vm_mm::memory_container::MemoryContainer; use crate::result::Result; use crate::result::VirtioError; diff --git a/crates/vm-virtio/src/virtqueue/virtq_desc_table.rs b/crates/vm-virtio/src/virtqueue/virtq_desc_table.rs index f9e97a3..d5aa888 100644 --- a/crates/vm-virtio/src/virtqueue/virtq_desc_table.rs +++ b/crates/vm-virtio/src/virtqueue/virtq_desc_table.rs @@ -1,7 +1,7 @@ use std::ptr::NonNull; -use vm_mm::allocator::MemoryContainer; use vm_mm::manager::MemoryAddressSpace; +use vm_mm::memory_container::MemoryContainer; use crate::result::Result; use crate::result::VirtioError;