@@ -322,6 +322,17 @@ bool virtio_modern_pci_device::parse_pci_config()
322322 return _common_cfg && _isr_cfg && _notify_cfg;
323323}
324324
325+ pci::bar* virtio_modern_pci_device::map_capability_bar (u8 cap_offset, u8 &bar_no)
326+ {
327+ u8 bar_index = _dev->pci_readb (cap_offset + offsetof (struct virtio_pci_cap , bar));
328+ bar_no = bar_index + 1 ;
329+ auto bar = _dev->get_bar (bar_no);
330+ if (bar && bar->is_mmio () && !bar->is_mapped ()) {
331+ bar->map ();
332+ }
333+ return bar;
334+ }
335+
325336// Parse a single virtio PCI capability, whose type must match @type and store
326337// it in @ptr.
327338void 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,
337348 }
338349
339350 if (cfg_offset != 0xFF ) {
340- u8 bar_index = _dev->pci_readb (cfg_offset + offsetof (struct virtio_pci_cap , bar));
341- auto bar_no = bar_index + 1 ;
342- auto bar = _dev->get_bar (bar_no);
343- if (bar && bar->is_mmio () && !bar->is_mapped ()) {
344- bar->map ();
345- }
351+ u8 bar_no;
352+ auto bar = map_capability_bar (cfg_offset, bar_no);
346353
347354 u64 offset = _dev->pci_readl (cfg_offset + offsetof (struct virtio_pci_cap , offset));
348355 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<
368375 }
369376
370377 auto cfg_offset = cfg_offset_and_type.first ;
371- u8 bar_index = _dev->pci_readb (cfg_offset + offsetof (struct virtio_pci_cap , bar));
372- auto bar_no = bar_index + 1 ;
373- auto bar = _dev->get_bar (bar_no);
374- if (bar && bar->is_mmio () && !bar->is_mapped ()) {
375- bar->map ();
376- }
378+ u8 bar_no;
379+ auto bar = map_capability_bar (cfg_offset, bar_no);
377380
378381 u64 offset = _dev->pci_readl (cfg_offset + offsetof (struct virtio_pci_cap , offset));
379382 u64 length = _dev->pci_readl (cfg_offset + offsetof (struct virtio_pci_cap , length));
0 commit comments