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@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
#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;
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 */
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;
+}