summary refs log tree commit diff
path: root/devices/src/virtio/virtio_pci_device.rs
diff options
context:
space:
mode:
authorDylan Reid <dgreid@chromium.org>2019-03-03 00:19:52 +0000
committerchrome-bot <chrome-bot@chromium.org>2019-03-06 15:33:43 -0800
commit4a63b6876185da3027879d3c9d199d776cfe546a (patch)
tree10aa1a0150205dbec7ad8abe3b3522d364df048f /devices/src/virtio/virtio_pci_device.rs
parent52c48ae54380c27683569aaf070fbd0f850f62ed (diff)
downloadcrosvm-4a63b6876185da3027879d3c9d199d776cfe546a.tar
crosvm-4a63b6876185da3027879d3c9d199d776cfe546a.tar.gz
crosvm-4a63b6876185da3027879d3c9d199d776cfe546a.tar.bz2
crosvm-4a63b6876185da3027879d3c9d199d776cfe546a.tar.lz
crosvm-4a63b6876185da3027879d3c9d199d776cfe546a.tar.xz
crosvm-4a63b6876185da3027879d3c9d199d776cfe546a.tar.zst
crosvm-4a63b6876185da3027879d3c9d199d776cfe546a.zip
PCI: Return results from pci setup functions
Enough failure cases have been added to `add_pci_bar` and
`add_pci_capabilities` that they should return unique errors instead of
an `Option`.

BUG=none
TEST=cargo test in devices

Signed-off-by: Dylan Reid <dgreid@chromium.org>
Change-Id: Ice2a06d2944011f95707f113f9d709da15c90cfe
Reviewed-on: https://chromium-review.googlesource.com/1497740
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
Diffstat (limited to 'devices/src/virtio/virtio_pci_device.rs')
-rw-r--r--devices/src/virtio/virtio_pci_device.rs32
1 files changed, 23 insertions, 9 deletions
diff --git a/devices/src/virtio/virtio_pci_device.rs b/devices/src/virtio/virtio_pci_device.rs
index e764569..bfff317 100644
--- a/devices/src/virtio/virtio_pci_device.rs
+++ b/devices/src/virtio/virtio_pci_device.rs
@@ -231,7 +231,10 @@ impl VirtioPciDevice {
         }
     }
 
-    fn add_pci_capabilities(&mut self, settings_bar: u8) {
+    fn add_pci_capabilities(
+        &mut self,
+        settings_bar: u8,
+    ) -> std::result::Result<(), PciDeviceError> {
         // Add pointers to the different configuration structures from the PCI capabilities.
         let common_cap = VirtioPciCap::new(
             PciCapabilityType::CommonConfig,
@@ -239,7 +242,9 @@ impl VirtioPciDevice {
             COMMON_CONFIG_BAR_OFFSET as u32,
             COMMON_CONFIG_SIZE as u32,
         );
-        self.config_regs.add_capability(&common_cap);
+        self.config_regs
+            .add_capability(&common_cap)
+            .map_err(|e| PciDeviceError::CapabilitiesSetup(e))?;
 
         let isr_cap = VirtioPciCap::new(
             PciCapabilityType::IsrConfig,
@@ -247,7 +252,9 @@ impl VirtioPciDevice {
             ISR_CONFIG_BAR_OFFSET as u32,
             ISR_CONFIG_SIZE as u32,
         );
-        self.config_regs.add_capability(&isr_cap);
+        self.config_regs
+            .add_capability(&isr_cap)
+            .map_err(|e| PciDeviceError::CapabilitiesSetup(e))?;
 
         // TODO(dgreid) - set based on device's configuration size?
         let device_cap = VirtioPciCap::new(
@@ -256,7 +263,9 @@ impl VirtioPciDevice {
             DEVICE_CONFIG_BAR_OFFSET as u32,
             DEVICE_CONFIG_SIZE as u32,
         );
-        self.config_regs.add_capability(&device_cap);
+        self.config_regs
+            .add_capability(&device_cap)
+            .map_err(|e| PciDeviceError::CapabilitiesSetup(e))?;
 
         let notify_cap = VirtioPciNotifyCap::new(
             PciCapabilityType::NotifyConfig,
@@ -265,13 +274,18 @@ impl VirtioPciDevice {
             NOTIFICATION_SIZE as u32,
             Le32::from(NOTIFY_OFF_MULTIPLIER),
         );
-        self.config_regs.add_capability(&notify_cap);
+        self.config_regs
+            .add_capability(&notify_cap)
+            .map_err(|e| PciDeviceError::CapabilitiesSetup(e))?;
 
         //TODO(dgreid) - How will the configuration_cap work?
         let configuration_cap = VirtioPciCap::new(PciCapabilityType::PciConfig, 0, 0, 0);
-        self.config_regs.add_capability(&configuration_cap);
+        self.config_regs
+            .add_capability(&configuration_cap)
+            .map_err(|e| PciDeviceError::CapabilitiesSetup(e))?;
 
         self.settings_bar = settings_bar;
+        Ok(())
     }
 }
 
@@ -319,12 +333,12 @@ impl PciDevice for VirtioPciDevice {
         let settings_bar = self
             .config_regs
             .add_pci_bar(&config)
-            .ok_or(PciDeviceError::IoRegistrationFailed(settings_config_addr))?
+            .map_err(|e| PciDeviceError::IoRegistrationFailed(settings_config_addr, e))?
             as u8;
         ranges.push((settings_config_addr, CAPABILITY_BAR_SIZE));
 
         // Once the BARs are allocated, the capabilities can be added to the PCI configuration.
-        self.add_pci_capabilities(settings_bar);
+        self.add_pci_capabilities(settings_bar)?;
 
         Ok(ranges)
     }
@@ -345,7 +359,7 @@ impl PciDevice for VirtioPciDevice {
                     let _device_bar = self
                         .config_regs
                         .add_pci_bar(&config)
-                        .ok_or(PciDeviceError::IoRegistrationFailed(device_addr))?;
+                        .map_err(|e| PciDeviceError::IoRegistrationFailed(device_addr, e))?;
                     ranges.push((device_addr, config.get_size()));
                 }
             }