From c3a79fa1cdec6ce3ef20dd6174baba25f976529b Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Sun, 21 Aug 2011 13:16:34 +0300 Subject: [PATCH] kvm tools: Add helper to retrieve the field used in virtio config space 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 Signed-off-by: Pekka Enberg --- include/kvm/virtio.h | 6 ++++++ virtio/core.c | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/kvm/virtio.h b/include/kvm/virtio.h index b962705..3442338 100644 --- a/include/kvm/virtio.h +++ b/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/virtio/core.c b/virtio/core.c index d28cfc6..d7c132b 100644 --- a/virtio/core.c +++ b/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; +}