Signed-off-by: Waldemar Kozaczuk <jwkozac...@gmail.com>
---
 drivers/virtio-pci-device.cc | 27 +++++++++++++++------------
 drivers/virtio-pci-device.hh |  1 +
 2 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/drivers/virtio-pci-device.cc b/drivers/virtio-pci-device.cc
index 89130e01..4171f3a6 100644
--- a/drivers/virtio-pci-device.cc
+++ b/drivers/virtio-pci-device.cc
@@ -322,6 +322,17 @@ bool virtio_modern_pci_device::parse_pci_config()
     return _common_cfg && _isr_cfg && _notify_cfg;
 }
 
+pci::bar* virtio_modern_pci_device::map_capability_bar(u8 cap_offset, u8 
&bar_no)
+{
+    u8 bar_index = _dev->pci_readb(cap_offset + offsetof(struct 
virtio_pci_cap, bar));
+    bar_no = bar_index + 1;
+    auto bar = _dev->get_bar(bar_no);
+    if (bar && bar->is_mmio() && !bar->is_mapped()) {
+        bar->map();
+    }
+    return bar;
+}
+
 // Parse a single virtio PCI capability, whose type must match @type and store
 // it in @ptr.
 void 
virtio_modern_pci_device::parse_virtio_capability(std::vector<std::pair<u8,u8>> 
&offsets_and_types,
@@ -337,12 +348,8 @@ void 
virtio_modern_pci_device::parse_virtio_capability(std::vector<std::pair<u8,
     }
 
     if (cfg_offset != 0xFF) {
-        u8 bar_index = _dev->pci_readb(cfg_offset + offsetof(struct 
virtio_pci_cap, bar));
-        auto bar_no = bar_index + 1;
-        auto bar = _dev->get_bar(bar_no);
-        if (bar && bar->is_mmio() && !bar->is_mapped()) {
-            bar->map();
-        }
+        u8 bar_no;
+        auto bar = map_capability_bar(cfg_offset, bar_no);
 
         u64 offset = _dev->pci_readl(cfg_offset + offsetof(struct 
virtio_pci_cap, offset));
         u64 length = _dev->pci_readl(cfg_offset + offsetof(struct 
virtio_pci_cap, length));
@@ -368,12 +375,8 @@ void virtio_modern_pci_device::parse_virtio_capabilities( 
std::vector<std::pair<
         }
 
         auto cfg_offset = cfg_offset_and_type.first;
-        u8 bar_index = _dev->pci_readb(cfg_offset + offsetof(struct 
virtio_pci_cap, bar));
-        auto bar_no = bar_index + 1;
-        auto bar = _dev->get_bar(bar_no);
-        if (bar && bar->is_mmio() && !bar->is_mapped()) {
-            bar->map();
-        }
+        u8 bar_no;
+        auto bar = map_capability_bar(cfg_offset, bar_no);
 
         u64 offset = _dev->pci_readl(cfg_offset + offsetof(struct 
virtio_pci_cap, offset));
         u64 length = _dev->pci_readl(cfg_offset + offsetof(struct 
virtio_pci_cap, length));
diff --git a/drivers/virtio-pci-device.hh b/drivers/virtio-pci-device.hh
index 9941bcac..701fe820 100644
--- a/drivers/virtio-pci-device.hh
+++ b/drivers/virtio-pci-device.hh
@@ -292,6 +292,7 @@ protected:
     virtual bool parse_pci_config();
 private:
     void find_vendor_capabilities(std::vector<std::pair<u8,u8>>& 
offsets_and_types);
+    pci::bar* map_capability_bar(u8 cap_offset, u8 &bar_no);
     void parse_virtio_capability(std::vector<std::pair<u8,u8>> 
&offsets_and_types,
             std::unique_ptr<virtio_capability> &ptr, u8 type);
     void parse_virtio_capabilities(std::vector<std::pair<u8,u8>> 
&offsets_and_types,
-- 
2.20.1

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to osv-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/20200317044119.1198-2-jwkozaczuk%40gmail.com.

Reply via email to