grml...
[seabios.git] / src / virtio-ring.h
index b97d5721ebdda87dd82863e4c5ef1575085cef3b..b7a7aafb238df38d5fb19ac6e92f74deb4e9a8de 100644 (file)
@@ -1,13 +1,17 @@
 #ifndef _VIRTIO_RING_H
 #define _VIRTIO_RING_H
 
+#include "types.h" // u64
+#include "memmap.h" // PAGE_SIZE
+
 #define PAGE_SHIFT 12
 #define PAGE_MASK  (PAGE_SIZE-1)
 
 #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) */
@@ -69,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;
@@ -102,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 */