From 2cd406ba50b58196112c11557648873372ea82ba Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Fri, 20 Sep 2019 14:48:34 -0700 Subject: [PATCH] vm-virtio: Fix virtio-pci BAR type The 32 or 64 bits type for the memory BAR was not set correctly. This patch ensure the right type is applied to the BAR. Signed-off-by: Sebastien Boeuf --- vm-virtio/src/transport/pci_device.rs | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/vm-virtio/src/transport/pci_device.rs b/vm-virtio/src/transport/pci_device.rs index de2a24d8f..83440e55d 100755 --- a/vm-virtio/src/transport/pci_device.rs +++ b/vm-virtio/src/transport/pci_device.rs @@ -542,32 +542,27 @@ impl PciDevice for VirtioPciDevice { // Allocate the virtio-pci capability BAR. // See http://docs.oasis-open.org/virtio/virtio/v1.0/cs04/virtio-v1.0-cs04.html#x1-740004 - let virtio_pci_bar_addr = if self.use_64bit_bar { + let (virtio_pci_bar_addr, region_type) = if self.use_64bit_bar { + let region_type = PciBarRegionType::Memory64BitRegion; let addr = allocator .allocate_mmio_addresses(None, CAPABILITY_BAR_SIZE, None) .ok_or(PciDeviceError::IoAllocationFailed(CAPABILITY_BAR_SIZE))?; - ranges.push(( - addr, - CAPABILITY_BAR_SIZE, - PciBarRegionType::Memory64BitRegion, - )); - addr + ranges.push((addr, CAPABILITY_BAR_SIZE, region_type)); + (addr, region_type) } else { + let region_type = PciBarRegionType::Memory32BitRegion; let addr = allocator .allocate_mmio_hole_addresses(None, CAPABILITY_BAR_SIZE, None) .ok_or(PciDeviceError::IoAllocationFailed(CAPABILITY_BAR_SIZE))?; - ranges.push(( - addr, - CAPABILITY_BAR_SIZE, - PciBarRegionType::Memory32BitRegion, - )); - addr + ranges.push((addr, CAPABILITY_BAR_SIZE, region_type)); + (addr, region_type) }; let config = PciBarConfiguration::default() .set_register_index(0) .set_address(virtio_pci_bar_addr.raw_value()) - .set_size(CAPABILITY_BAR_SIZE); + .set_size(CAPABILITY_BAR_SIZE) + .set_region_type(region_type); let virtio_pci_bar = self.configuration.add_pci_bar(&config).map_err(|e| { PciDeviceError::IoRegistrationFailed(virtio_pci_bar_addr.raw_value(), e)