[RFC PATCH 02/12] Virt-mmio test.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



--- a/hw/virtio.c    2012-09-18 17:10:48.000000000 +0200
+++ b/hw/virtio.c    2012-10-08 11:08:06.038031336 +0200
@@ -19,7 +19,9 @@
  #include "qemu-barrier.h"

  /* The alignment to use between consumer and producer parts of vring.
- * x86 pagesize again. */
+ * x86 pagesize again. This is the default, used by transports like PCI
+ * which don't provide a means for the guest to tell the host the 
alignment.
+ */
  #define VIRTIO_PCI_VRING_ALIGN         4096

  typedef struct VRingDesc
@@ -53,6 +55,7 @@
  typedef struct VRing
  {
      unsigned int num;
+    unsigned int align;
      target_phys_addr_t desc;
      target_phys_addr_t avail;
      target_phys_addr_t used;
@@ -90,7 +93,7 @@
      vq->vring.avail = pa + vq->vring.num * sizeof(VRingDesc);
      vq->vring.used = vring_align(vq->vring.avail +
                                   offsetof(VRingAvail, 
ring[vq->vring.num]),
-                                 VIRTIO_PCI_VRING_ALIGN);
+                                 vq->vring.align);
  }

  static inline uint64_t vring_desc_addr(target_phys_addr_t desc_pa, int i)
@@ -640,6 +643,12 @@
      return vq - &vdev->vq[0];
  }

+void virtio_queue_set_align(VirtIODevice *vdev, int n, int align)
+{
+    vdev->vq[n].vring.align = align;
+    virtqueue_init(&vdev->vq[n]);
+}
+
  void virtio_queue_notify_vq(VirtQueue *vq)
  {
      if (vq->vring.desc) {
@@ -680,6 +689,7 @@
          abort();

      vdev->vq[i].vring.num = queue_size;
+    vdev->vq[i].vring.align = VIRTIO_PCI_VRING_ALIGN;
      vdev->vq[i].handle_output = handle_output;

      return &vdev->vq[i];
--- a/hw/virtio.h    2012-09-18 17:10:48.000000000 +0200
+++ b/hw/virtio.h    2012-10-08 11:08:06.039031295 +0200
@@ -178,6 +178,7 @@
  void virtio_queue_set_addr(VirtIODevice *vdev, int n, 
target_phys_addr_t addr);
  target_phys_addr_t virtio_queue_get_addr(VirtIODevice *vdev, int n);
  int virtio_queue_get_num(VirtIODevice *vdev, int n);
+void virtio_queue_set_align(VirtIODevice *vdev, int n, int align);
  void virtio_queue_notify(VirtIODevice *vdev, int n);
  uint16_t virtio_queue_vector(VirtIODevice *vdev, int n);
  void virtio_queue_set_vector(VirtIODevice *vdev, int n, uint16_t vector);
_______________________________________________
kvmarm mailing list
kvmarm@xxxxxxxxxxxxxxxxxxxxx
https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm


[Index of Archives]     [Linux KVM]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux