diff --git a/alioth/src/board/board_amd64/sev.rs b/alioth/src/board/board_amd64/sev.rs index f5a277db..9bafb759 100644 --- a/alioth/src/board/board_amd64/sev.rs +++ b/alioth/src/board/board_amd64/sev.rs @@ -141,4 +141,12 @@ impl LayoutChanged for EncryptPages { fn ram_removed(&self, _: u64, _: &ArcMemPages) -> mem::Result<()> { Ok(()) } + + fn dev_mem_added(&self, _: u64, _: &ArcMemPages) -> mem::Result<()> { + Ok(()) + } + + fn dev_mem_removed(&self, _: u64, _: &ArcMemPages) -> mem::Result<()> { + Ok(()) + } } diff --git a/alioth/src/mem/mem.rs b/alioth/src/mem/mem.rs index fa08b126..5ff5a13e 100644 --- a/alioth/src/mem/mem.rs +++ b/alioth/src/mem/mem.rs @@ -245,6 +245,8 @@ impl SlotBackend for Arc { pub trait LayoutChanged: Debug + Send + Sync + 'static { fn ram_added(&self, gpa: u64, pages: &ArcMemPages) -> Result<()>; fn ram_removed(&self, gpa: u64, pages: &ArcMemPages) -> Result<()>; + fn dev_mem_added(&self, gpa: u64, pages: &ArcMemPages) -> Result<()>; + fn dev_mem_removed(&self, gpa: u64, pages: &ArcMemPages) -> Result<()>; } pub trait LayoutUpdated: Debug + Send + Sync + 'static { @@ -353,20 +355,26 @@ impl Memory { let mut ram_updated = false; for range in ®ion.ranges { let gpa = addr + offset; + if let MemRange::Ram(r) | MemRange::DevMem(r) = range { + self.ram_bus.add(gpa, r.clone())?; + self.map_to_vm(gpa, r)?; + ram_updated = true; + } match range { MemRange::Emulated(r) => { let mut mmio_bus = self.mmio_bus.write(); mmio_bus.add(gpa, r.clone())? } MemRange::Ram(r) => { - self.map_to_vm(gpa, r)?; for callback in &callbacks.changed { callback.ram_added(gpa, r)?; } - self.ram_bus.add(gpa, r.clone())?; - ram_updated = true; } - MemRange::DevMem(r) => self.map_to_vm(gpa, r)?, + MemRange::DevMem(r) => { + for callback in &callbacks.changed { + callback.dev_mem_added(gpa, r)?; + } + } MemRange::Span(_) => {} } offset += range.size(); @@ -390,20 +398,26 @@ impl Memory { let mut ram_updated = false; for range in ®ion.ranges { let gpa = addr + offset; + if let MemRange::Ram(r) | MemRange::DevMem(r) = range { + self.ram_bus.remove(gpa)?; + self.unmap_from_vm(gpa, r)?; + ram_updated = true; + } match range { MemRange::Emulated(_) => { let mut mmio_bus = self.mmio_bus.write(); mmio_bus.remove(gpa)?; } MemRange::Ram(r) => { - self.ram_bus.remove(gpa)?; for callback in callbacks.changed.iter().rev() { callback.ram_removed(gpa, r)?; } - self.unmap_from_vm(gpa, r)?; - ram_updated = true; } - MemRange::DevMem(r) => self.unmap_from_vm(gpa, r)?, + MemRange::DevMem(r) => { + for callback in callbacks.changed.iter().rev() { + callback.dev_mem_removed(gpa, r)?; + } + } MemRange::Span(_) => {} }; offset += range.size(); @@ -620,4 +634,12 @@ impl LayoutChanged for MarkPrivateMemory { fn ram_removed(&self, _: u64, _: &ArcMemPages) -> Result<()> { Ok(()) } + + fn dev_mem_added(&self, _: u64, _: &ArcMemPages) -> Result<()> { + Ok(()) + } + + fn dev_mem_removed(&self, _: u64, _: &ArcMemPages) -> Result<()> { + Ok(()) + } } diff --git a/alioth/src/vfio/container.rs b/alioth/src/vfio/container.rs index eba63a3f..30dfe99e 100644 --- a/alioth/src/vfio/container.rs +++ b/alioth/src/vfio/container.rs @@ -119,4 +119,12 @@ impl LayoutChanged for UpdateContainerMapping { ret.box_trace(mem::error::ChangeLayout)?; Ok(()) } + + fn dev_mem_added(&self, gpa: u64, pages: &ArcMemPages) -> mem::Result<()> { + self.ram_added(gpa, pages) + } + + fn dev_mem_removed(&self, gpa: u64, pages: &ArcMemPages) -> mem::Result<()> { + self.ram_removed(gpa, pages) + } } diff --git a/alioth/src/vfio/iommu.rs b/alioth/src/vfio/iommu.rs index 2254fb8b..a45bbd7b 100644 --- a/alioth/src/vfio/iommu.rs +++ b/alioth/src/vfio/iommu.rs @@ -137,4 +137,13 @@ impl LayoutChanged for UpdateIommuIoas { ret.box_trace(mem::error::ChangeLayout)?; Ok(()) } + + fn dev_mem_added(&self, _gpa: u64, _pages: &ArcMemPages) -> mem::Result<()> { + // Iommufd does not support mapping device memory into IOAS. + Ok(()) + } + + fn dev_mem_removed(&self, _gpa: u64, _pages: &ArcMemPages) -> mem::Result<()> { + Ok(()) + } } diff --git a/alioth/src/virtio/vu/frontend.rs b/alioth/src/virtio/vu/frontend.rs index 5f89fe3d..e83f822b 100644 --- a/alioth/src/virtio/vu/frontend.rs +++ b/alioth/src/virtio/vu/frontend.rs @@ -89,6 +89,14 @@ impl LayoutChanged for UpdateVuMem { log::trace!("{}: remove memory region: {:x?}", self.name, region.region); Ok(()) } + + fn dev_mem_added(&self, gpa: u64, pages: &ArcMemPages) -> mem::Result<()> { + self.ram_added(gpa, pages) + } + + fn dev_mem_removed(&self, gpa: u64, pages: &ArcMemPages) -> mem::Result<()> { + self.ram_removed(gpa, pages) + } } #[derive(Debug)]