vgabios: Unify X_set_mode() functions.
[seabios.git] / src / virtio-ring.h
index 95ae85b5055bde3dd2607cb1e1d3d3edb3dfd3fb..b7a7aafb238df38d5fb19ac6e92f74deb4e9a8de 100644 (file)
@@ -9,8 +9,9 @@
 
 #define virt_to_phys(v) (unsigned long)(v)
 #define phys_to_virt(p) (void*)(p)
-#define wmb() barrier()
-#define mb() barrier()
+/* Compiler barrier is enough as an x86 CPU does not reorder reads or writes */
+#define smp_rmb() barrier()
+#define smp_wmb() barrier()
 
 /* Status byte for guest to report progress, and synchronize features. */
 /* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */
@@ -72,7 +73,7 @@ struct vring {
          + PAGE_MASK) & ~PAGE_MASK) + \
          (sizeof(struct vring_used) + sizeof(struct vring_used_elem) * num))
 
-typedef unsigned char virtio_queue_t[PAGE_MASK + vring_size(MAX_QUEUE_NUM)];
+typedef unsigned char virtio_queue_t[vring_size(MAX_QUEUE_NUM)];
 
 struct vring_virtqueue {
    virtio_queue_t queue;
@@ -105,6 +106,8 @@ static inline void vring_init(struct vring *vr,
    vr->desc = phys_to_virt(pa);
 
    vr->avail = (struct vring_avail *)&vr->desc[num];
+   /* disable interrupts */
+   vr->avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
 
    /* physical address of used must be page aligned */