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; +}