Signed-off-by: Fotis Xenakis <[email protected]>
---
drivers/virtio-device.hh | 2 ++
drivers/virtio-mmio.hh | 1 +
drivers/virtio-pci-device.cc | 24 ++++++++++++++++++++++++
drivers/virtio-pci-device.hh | 4 ++++
4 files changed, 31 insertions(+)
diff --git a/drivers/virtio-device.hh b/drivers/virtio-device.hh
index 1327a159..732f9b18 100644
--- a/drivers/virtio-device.hh
+++ b/drivers/virtio-device.hh
@@ -76,6 +76,8 @@ public:
virtual u8 read_config(u32 offset) = 0;
virtual void dump_config() = 0;
+ virtual bool get_shm(u8 id, mmioaddr_t &addr, u64 &length) = 0;
+
virtual bool is_modern() = 0;
virtual size_t get_vring_alignment() = 0;
};
diff --git a/drivers/virtio-mmio.hh b/drivers/virtio-mmio.hh
index 024190ac..0cbf7000 100644
--- a/drivers/virtio-mmio.hh
+++ b/drivers/virtio-mmio.hh
@@ -136,6 +136,7 @@ public:
bool parse_config();
+ virtual bool get_shm(u8 id, mmioaddr_t &addr, u64 &length) { /* TODO */
return false; }
private:
mmio_device_info _dev_info;
//u64 _id;
diff --git a/drivers/virtio-pci-device.cc b/drivers/virtio-pci-device.cc
index 0451923b..69cc7e22 100644
--- a/drivers/virtio-pci-device.cc
+++ b/drivers/virtio-pci-device.cc
@@ -253,6 +253,30 @@ u8 virtio_modern_pci_device::read_and_ack_isr()
return _isr_cfg->virtio_conf_readb(0);
}
+// Stores the address and length of the shared memory region identified by @id
+// in @addr and @length respectively. Returns false and doesn't modify @addr
and
+// @length if no region with a matching id is found.
+bool virtio_modern_pci_device::get_shm(u8 id, mmioaddr_t &addr, u64 &length)
+{
+ auto cap = std::find_if(_shm_cfgs.cbegin(), _shm_cfgs.cend(),
+ [id, this] (const std::unique_ptr<virtio_capability>& cap) {
+ u8 cap_id = _dev->pci_readb(cap->get_cfg_offset() +
+ offsetof(virtio_pci_cap, id));
+ return cap_id == id;
+ });
+ if (cap == _shm_cfgs.cend()) {
+ return false;
+ }
+
+ auto bar = cap->get()->get_bar();
+ if (!bar->is_mmio()) {
+ return false;
+ }
+ addr = bar->get_mmio();
+ length = bar->get_size();
+ return true;
+}
+
bool virtio_modern_pci_device::parse_pci_config()
{
// Check ABI version
diff --git a/drivers/virtio-pci-device.hh b/drivers/virtio-pci-device.hh
index b8a5c02f..9a3c7b87 100644
--- a/drivers/virtio-pci-device.hh
+++ b/drivers/virtio-pci-device.hh
@@ -116,6 +116,8 @@ public:
virtual u8 read_and_ack_isr();
virtual bool is_modern() { return false; }
+
+ virtual bool get_shm(u8 id, mmioaddr_t &addr, u64 &length) { return false;
}
protected:
virtual bool parse_pci_config();
@@ -243,6 +245,7 @@ public:
_bar->writel(_bar_offset + offset, val);
};
u32 get_cfg_offset() { return _cfg_offset; }
+ pci::bar* get_bar() { return _bar; }
void print(const char *prefix) {
virtio_d("%s bar=%d, offset=%x, size=%x", prefix, _bar_no,
_bar_offset, _length);
@@ -284,6 +287,7 @@ public:
virtual bool is_modern() { return true; };
+ virtual bool get_shm(u8 id, mmioaddr_t &addr, u64 &length);
protected:
virtual bool parse_pci_config();
private:
--
2.25.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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/osv-dev/VI1PR03MB438350F248BA69EB1E8BFD17A6F80%40VI1PR03MB4383.eurprd03.prod.outlook.com.