From 593a958fe5953b3b0be656b6a59101f5922303c1 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Mon, 30 Nov 2020 10:53:31 +0000 Subject: [PATCH] pci, vmm: Include VFIO devices in device tree Fixes: #1687 Signed-off-by: Rob Bradford --- pci/src/vfio.rs | 10 +++++++--- vmm/src/device_manager.rs | 13 +++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/pci/src/vfio.rs b/pci/src/vfio.rs index ff3910ab8..9fcbae442 100644 --- a/pci/src/vfio.rs +++ b/pci/src/vfio.rs @@ -221,9 +221,9 @@ impl Interrupt { } #[derive(Copy, Clone)] -struct MmioRegion { - start: GuestAddress, - length: GuestUsize, +pub struct MmioRegion { + pub start: GuestAddress, + pub length: GuestUsize, type_: PciBarRegionType, index: u32, mem_slot: Option, @@ -615,6 +615,10 @@ impl VfioPciDevice { .extend_dma_map(new_region) .map_err(VfioPciError::UpdateMemory) } + + pub fn mmio_regions(&self) -> Vec { + self.mmio_regions.clone() + } } impl Drop for VfioPciDevice { diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 05bcf930b..2c6482c08 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -2539,6 +2539,15 @@ impl DeviceManager { }) .map_err(DeviceManagerError::VfioMapRegion)?; + let mut node = device_node!(vfio_name); + + for region in vfio_pci_device.mmio_regions() { + node.resources.push(Resource::MmioAddressRange { + base: region.start.0, + size: region.length as u64, + }); + } + let vfio_pci_device = Arc::new(Mutex::new(vfio_pci_device)); self.add_pci_device( @@ -2549,6 +2558,10 @@ impl DeviceManager { pci_device_bdf, vfio_name.clone(), )?; + self.device_tree + .lock() + .unwrap() + .insert(vfio_name.clone(), node); Ok((pci_device_bdf, vfio_name)) }