This patch adds a helper used to retrieve the type of field used when guest
is writing or reading from virtio config space.

Since the config space is dynamic, it may change during runtime - so we must
calculate it before every read/write.
Signed-off-by: Sasha Levin <[email protected]>
---
 tools/kvm/include/kvm/virtio.h |    6 ++++++
 tools/kvm/virtio/core.c        |   23 ++++++++++++++++++++++-
 2 files changed, 28 insertions(+), 1 deletions(-)

diff --git a/tools/kvm/include/kvm/virtio.h b/tools/kvm/include/kvm/virtio.h
index b962705..3442338 100644
--- a/tools/kvm/include/kvm/virtio.h
+++ b/tools/kvm/include/kvm/virtio.h
@@ -12,6 +12,10 @@
 #define VIRTIO_IRQ_LOW         0
 #define VIRTIO_IRQ_HIGH                1
 
+#define VIRTIO_PCI_O_CONFIG    0
+#define VIRTIO_PCI_O_MSIX      1
+#define VIRTIO_PCI_O_FEATURES  2
+
 struct virt_queue {
        struct vring    vring;
        u32             pfn;
@@ -56,4 +60,6 @@ u16 virt_queue__get_inout_iov(struct kvm *kvm, struct 
virt_queue *queue,
 
 void virt_queue__trigger_irq(struct virt_queue *vq, int irq, u8 *isr, struct 
kvm *kvm);
 
+int virtio__get_dev_specific_field(int offset, bool msix, bool features_hi, 
u32 *config_off);
+
 #endif /* KVM__VIRTIO_H */
diff --git a/tools/kvm/virtio/core.c b/tools/kvm/virtio/core.c
index d28cfc6..1398447 100644
--- a/tools/kvm/virtio/core.c
+++ b/tools/kvm/virtio/core.c
@@ -100,3 +100,24 @@ void virt_queue__trigger_irq(struct virt_queue *vq, int 
irq, u8 *isr, struct kvm
                kvm__irq_line(kvm, irq, VIRTIO_IRQ_HIGH);
        }
 }
+
+int virtio__get_dev_specific_field(int offset, bool msix, bool features_hi, 
u32 *config_off)
+{
+       if (msix) {
+               if (offset < 4)
+                       return VIRTIO_PCI_O_MSIX;
+               else
+                       offset -= 4;
+       }
+
+       if (features_hi) {
+               if (offset < 4)
+                       return VIRTIO_PCI_O_FEATURES;
+               else
+                       offset -= 4;
+       }
+
+       *config_off = offset;
+
+       return VIRTIO_PCI_O_CONFIG;
+}
-- 
1.7.6

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to