diff --git a/crates/vm-bootloader/src/boot_loader.rs b/crates/vm-bootloader/src/boot_loader.rs index 8124f63..03f1ad5 100644 --- a/crates/vm-bootloader/src/boot_loader.rs +++ b/crates/vm-bootloader/src/boot_loader.rs @@ -56,7 +56,7 @@ where fn load( &self, virt: &mut V, - memory: &mut MemoryAddressSpace, + memory: &MemoryAddressSpace, irq_chip: &dyn InterruptController, devices: Iter<'_, Box>, ) -> Result<()>; diff --git a/crates/vm-bootloader/src/boot_loader/arch/aarch64.rs b/crates/vm-bootloader/src/boot_loader/arch/aarch64.rs index dd66fbb..6a979f3 100644 --- a/crates/vm-bootloader/src/boot_loader/arch/aarch64.rs +++ b/crates/vm-bootloader/src/boot_loader/arch/aarch64.rs @@ -33,7 +33,7 @@ impl AArch64BootLoader { fn load_image( &self, layout: &mut AArch64Layout, - memory: &mut MemoryAddressSpace, + memory: &MemoryAddressSpace, ) -> Result<()> where C: MemoryContainer, @@ -61,7 +61,7 @@ impl AArch64BootLoader { fn load_initrd( &self, layout: &mut AArch64Layout, - memory: &mut MemoryAddressSpace, + memory: &MemoryAddressSpace, ) -> Result<()> where C: MemoryContainer, @@ -88,7 +88,7 @@ impl AArch64BootLoader { fn load_dtb( &self, layout: &mut AArch64Layout, - memory: &mut MemoryAddressSpace, + memory: &MemoryAddressSpace, dtb: Vec, ) -> Result<()> where @@ -256,7 +256,7 @@ where fn load( &self, virt: &mut V, - memory: &mut MemoryAddressSpace, + memory: &MemoryAddressSpace, irq_chip: &dyn InterruptController, devices: Iter<'_, Box>, ) -> Result<()> { diff --git a/crates/vm-bootloader/src/boot_loader/arch/x86_64.rs b/crates/vm-bootloader/src/boot_loader/arch/x86_64.rs index de9a97f..b95a426 100644 --- a/crates/vm-bootloader/src/boot_loader/arch/x86_64.rs +++ b/crates/vm-bootloader/src/boot_loader/arch/x86_64.rs @@ -28,7 +28,7 @@ where fn load( &self, _virt: &mut V, - _memory: &mut MemoryAddressSpace, + _memory: &MemoryAddressSpace, _irq_chip: &dyn InterruptController, _devices: Iter<'_, Box>, ) -> Result<()> { diff --git a/crates/vm-bootloader/src/initrd_loader.rs b/crates/vm-bootloader/src/initrd_loader.rs index d604122..c517650 100644 --- a/crates/vm-bootloader/src/initrd_loader.rs +++ b/crates/vm-bootloader/src/initrd_loader.rs @@ -30,7 +30,7 @@ impl InitrdLoader { Ok(InitrdLoader { initrd }) } - pub fn load(&self, addr: u64, memory: &mut MemoryAddressSpace) -> Result + pub fn load(&self, addr: u64, memory: &MemoryAddressSpace) -> Result where C: MemoryContainer, { diff --git a/crates/vm-bootloader/src/kernel_loader.rs b/crates/vm-bootloader/src/kernel_loader.rs index 1ace535..8b73284 100644 --- a/crates/vm-bootloader/src/kernel_loader.rs +++ b/crates/vm-bootloader/src/kernel_loader.rs @@ -40,6 +40,6 @@ pub trait KernelLoader { fn load( &self, boot_params: &Self::BootParams, - memory: &mut MemoryAddressSpace, + memory: &MemoryAddressSpace, ) -> Result; } diff --git a/crates/vm-bootloader/src/kernel_loader/linux/bzimage.rs b/crates/vm-bootloader/src/kernel_loader/linux/bzimage.rs index 3583a43..98bf4ab 100644 --- a/crates/vm-bootloader/src/kernel_loader/linux/bzimage.rs +++ b/crates/vm-bootloader/src/kernel_loader/linux/bzimage.rs @@ -180,7 +180,7 @@ where fn load( &self, _boot_params: &Self::BootParams, - _memory: &mut MemoryAddressSpace, + _memory: &MemoryAddressSpace, ) -> Result { todo!() } diff --git a/crates/vm-bootloader/src/kernel_loader/linux/image.rs b/crates/vm-bootloader/src/kernel_loader/linux/image.rs index 857b456..1c07d16 100644 --- a/crates/vm-bootloader/src/kernel_loader/linux/image.rs +++ b/crates/vm-bootloader/src/kernel_loader/linux/image.rs @@ -89,7 +89,7 @@ where fn load( &self, boot_params: &AArch64BootParams, - memory: &mut MemoryAddressSpace, + memory: &MemoryAddressSpace, ) -> Result { let header = self.get_header()?; diff --git a/crates/vm-core/src/virt/hvp/mm.rs b/crates/vm-core/src/virt/hvp/mm.rs index 0836cad..e86425f 100644 --- a/crates/vm-core/src/virt/hvp/mm.rs +++ b/crates/vm-core/src/virt/hvp/mm.rs @@ -10,7 +10,7 @@ unsafe impl Send for MemoryWrapper {} unsafe impl Sync for MemoryWrapper {} impl MemoryContainer for MemoryWrapper { - fn to_hva(&mut self) -> *mut u8 { + fn to_hva(&self) -> *mut u8 { self.0.host_addr() } } diff --git a/crates/vm-device/src/device/virtio/virtio_blk.rs b/crates/vm-device/src/device/virtio/virtio_blk.rs index 86a3a66..d6e158f 100644 --- a/crates/vm-device/src/device/virtio/virtio_blk.rs +++ b/crates/vm-device/src/device/virtio/virtio_blk.rs @@ -1,5 +1,4 @@ use std::sync::Arc; -use std::sync::Mutex; use tokio::sync::Notify; use vm_core::arch::irq::InterruptController; @@ -22,7 +21,7 @@ use zerocopy::IntoBytes; pub struct VirtIoBlkDevice { irq: u32, irq_chip: Arc, - mm: Arc>>, + mm: Arc>, cfg: VirtioBlkConfig, } @@ -33,7 +32,7 @@ where pub fn new( irq: u32, irq_chip: Arc, - mm: Arc>>, + mm: Arc>, ) -> Self { let cfg = VirtioBlkConfig { capacity: 50, @@ -88,12 +87,12 @@ where notify.notified().await; let mut dev = dev.lock().unwrap(); - let mut mm = mm.lock().unwrap(); + let q = dev.get_virt_queue_mut(queue_sel).unwrap(); - let avail_ring = q.avail_ring(&mut mm).unwrap(); - let desc_ring = q.desc_table_ref(&mut mm).unwrap(); - let mut used_ring = q.used_ring(&mut mm).unwrap(); + let avail_ring = q.avail_ring(&mm).unwrap(); + let desc_ring = q.desc_table_ref(&mm).unwrap(); + let mut used_ring = q.used_ring(&mm).unwrap(); let mut updated = false; @@ -101,7 +100,7 @@ where let last_available_idx = q.last_available_idx(); let desc_id = avail_ring.ring(last_available_idx); let desc_entry = desc_ring.get(desc_id); - let req = desc_entry.addr(&mut mm).unwrap(); + let req = desc_entry.addr(&mm).unwrap(); let req = unsafe { &*(req.as_ptr() as *const VirtioBlkReq) }; match req.r#type { @@ -109,12 +108,12 @@ where let chains = desc_ring.get_chain(desc_id); let data = chains[1]; - let data_hva = data.addr(&mut mm).unwrap(); + let data_hva = data.addr(&mm).unwrap(); let data_len = data.len; unsafe { data_hva.write_bytes(0xff, data_len.try_into().unwrap()) }; let status = chains[2]; - let mut status_hva = status.addr(&mut mm).unwrap(); + let mut status_hva = status.addr(&mm).unwrap(); *unsafe { status_hva.as_mut() } = 0; let used_idx = used_ring.idx(); diff --git a/crates/vm-machine/src/device.rs b/crates/vm-machine/src/device.rs index 66d2d21..b074ff7 100644 --- a/crates/vm-machine/src/device.rs +++ b/crates/vm-machine/src/device.rs @@ -1,5 +1,4 @@ use std::sync::Arc; -use std::sync::Mutex; use vm_core::arch::irq::InterruptController; use vm_core::device::device_manager::DeviceManager; @@ -18,7 +17,7 @@ use crate::error::Error; pub trait InitDevice { fn init_devices( &mut self, - mm: Arc>>, + mm: Arc>, devices: Vec, irq_chip: Option>, ) -> Result<(), Error> @@ -29,7 +28,7 @@ pub trait InitDevice { impl InitDevice for DeviceManager { fn init_devices( &mut self, - mm: Arc>>, + mm: Arc>, devices: Vec, irq_chip: Option>, ) -> Result<(), Error> diff --git a/crates/vm-machine/src/vm.rs b/crates/vm-machine/src/vm.rs index 3854066..f8ef894 100644 --- a/crates/vm-machine/src/vm.rs +++ b/crates/vm-machine/src/vm.rs @@ -11,7 +11,7 @@ use crate::error::Error; use crate::error::Result; pub struct Vm { - pub(crate) memory: Arc>>, + pub(crate) memory: Arc>, pub(crate) virt: V, pub(crate) device_manager: Arc>, pub(crate) gdb_stub: Option, @@ -23,13 +23,11 @@ where { pub fn run(&mut self, boot_loader: &dyn BootLoader) -> Result<()> { { - let mut memory = self.memory.lock().unwrap(); - let device_manager = self.device_manager.lock().unwrap(); boot_loader.load( &mut self.virt, - &mut memory, + &self.memory, device_manager .get_irq_chip() .ok_or_else(|| Error::InitIrqchip("irq_chip is not exists".to_string()))? diff --git a/crates/vm-machine/src/vm_builder.rs b/crates/vm-machine/src/vm_builder.rs index 372b865..a176184 100644 --- a/crates/vm-machine/src/vm_builder.rs +++ b/crates/vm-machine/src/vm_builder.rs @@ -43,7 +43,7 @@ impl VmBuilder { let mut memory_regions = MemoryAddressSpace::default(); virt.init_memory(&mut memory_regions, self.memory_size)?; - let memory = Arc::new(Mutex::new(memory_regions)); + let memory = Arc::new(memory_regions); let layout = virt.get_layout(); let mmio_layout = MmioLayout::new(layout.get_mmio_start(), layout.get_mmio_len()); diff --git a/crates/vm-mm/src/allocator.rs b/crates/vm-mm/src/allocator.rs index 4960b4a..c7e2064 100644 --- a/crates/vm-mm/src/allocator.rs +++ b/crates/vm-mm/src/allocator.rs @@ -3,7 +3,7 @@ use crate::error::Error; pub mod mmap_allocator; pub trait MemoryContainer: Send + Sync + 'static { - fn to_hva(&mut self) -> *mut u8; + fn to_hva(&self) -> *mut u8; } pub trait Allocator { diff --git a/crates/vm-mm/src/allocator/mmap_allocator.rs b/crates/vm-mm/src/allocator/mmap_allocator.rs index 3ec6cd2..cc0a26d 100644 --- a/crates/vm-mm/src/allocator/mmap_allocator.rs +++ b/crates/vm-mm/src/allocator/mmap_allocator.rs @@ -9,8 +9,8 @@ mod container { use crate::allocator::MemoryContainer; impl MemoryContainer for MmapMut { - fn to_hva(&mut self) -> *mut u8 { - self.as_mut_ptr() + fn to_hva(&self) -> *mut u8 { + self.as_ptr() as *mut u8 } } } diff --git a/crates/vm-mm/src/manager.rs b/crates/vm-mm/src/manager.rs index 59f5177..f664b4b 100644 --- a/crates/vm-mm/src/manager.rs +++ b/crates/vm-mm/src/manager.rs @@ -40,8 +40,8 @@ where Ok(()) } - pub fn gpa_to_hva(&mut self, gpa: u64) -> Result<*mut u8, Error> { - let region = self.try_get_region_by_gpa_mut(gpa)?; + 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 offset = gpa - region.gpa; @@ -49,8 +49,8 @@ where unsafe { Ok(hva.add(offset as usize)) } } - pub fn memset(&mut self, gpa: u64, val: u8, len: usize) -> Result<(), Error> { - let region = self.try_get_region_by_gpa_mut(gpa)?; + 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; @@ -63,8 +63,8 @@ where Ok(()) } - pub fn copy_from_slice(&mut self, gpa: u64, buf: &[u8], len: usize) -> Result<(), Error> { - let region = self.try_get_region_by_gpa_mut(gpa)?; + 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; @@ -90,15 +90,15 @@ where }) } - fn get_mut_by_gpa(&mut self, gpa: u64) -> Option<&mut MemoryRegion> { + fn get_by_gpa(&self, gpa: u64) -> Option<&MemoryRegion> { self.regions - .values_mut() + .values() .find(|region| gpa >= region.gpa && gpa < region.gpa + region.len as u64) .map(|v| v as _) } - fn try_get_region_by_gpa_mut(&mut self, gpa: u64) -> Result<&mut MemoryRegion, Error> { - self.get_mut_by_gpa(gpa).ok_or(Error::AccessInvalidGpa(gpa)) + fn try_get_region_by_gpa(&self, gpa: u64) -> Result<&MemoryRegion, Error> { + self.get_by_gpa(gpa).ok_or(Error::AccessInvalidGpa(gpa)) } } @@ -144,7 +144,7 @@ mod tests { let mut memory_as = MemoryAddressSpace::::default(); let allocator = MmapAllocator; - let mut region = MemoryRegion::new(GPA, LEN, allocator.alloc(LEN, None)?); + let region = MemoryRegion::new(GPA, LEN, allocator.alloc(LEN, None)?); let hva = region.to_hva(); diff --git a/crates/vm-mm/src/region.rs b/crates/vm-mm/src/region.rs index 35a703c..cfe2fed 100644 --- a/crates/vm-mm/src/region.rs +++ b/crates/vm-mm/src/region.rs @@ -14,7 +14,7 @@ where MemoryRegion { gpa, len, memory } } - pub fn to_hva(&mut self) -> *mut u8 { + pub fn to_hva(&self) -> *mut u8 { self.memory.to_hva() } } diff --git a/crates/vm-virtio/src/virt_queue.rs b/crates/vm-virtio/src/virt_queue.rs index 53bfdbb..f5a79a6 100644 --- a/crates/vm-virtio/src/virt_queue.rs +++ b/crates/vm-virtio/src/virt_queue.rs @@ -121,7 +121,7 @@ impl VirtQueue { } } - pub fn desc_table_ref(&self, mm: &mut MemoryAddressSpace) -> Result + pub fn desc_table_ref(&self, mm: &MemoryAddressSpace) -> Result where C: MemoryContainer, { @@ -135,7 +135,7 @@ impl VirtQueue { Ok(VirtqDescTableRef::new(self.queue_size, hva)) } - pub fn avail_ring(&self, mm: &mut MemoryAddressSpace) -> Result + pub fn avail_ring(&self, mm: &MemoryAddressSpace) -> Result where C: MemoryContainer, { @@ -149,7 +149,7 @@ impl VirtQueue { Ok(VirtqAvail::new(self.queue_size, hva as *const u16)) } - pub fn used_ring(&self, mm: &mut MemoryAddressSpace) -> Result + pub fn used_ring(&self, mm: &MemoryAddressSpace) -> Result where C: MemoryContainer, { diff --git a/crates/vm-virtio/src/virt_queue/virtq_desc_table.rs b/crates/vm-virtio/src/virt_queue/virtq_desc_table.rs index 8febbee..9126f6e 100644 --- a/crates/vm-virtio/src/virt_queue/virtq_desc_table.rs +++ b/crates/vm-virtio/src/virt_queue/virtq_desc_table.rs @@ -28,7 +28,7 @@ pub struct VirtqDesc { impl VirtqDesc { /// Get hva of the buf - pub fn addr(&self, mm: &mut MemoryAddressSpace) -> Result> + pub fn addr(&self, mm: &MemoryAddressSpace) -> Result> where C: MemoryContainer, {