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 <levinsasha928@xxxxxxxxx> --- 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html