parlib: Implement join/detach() for all uthreads
[akaros.git] / user / vmm / virtio_lguest_console.c
index 45ec5ed..480d367 100644 (file)
@@ -32,7 +32,7 @@
 #include <vmm/virtio.h>
 #include <vmm/virtio_mmio.h>
 
-void *cons_receiveq_fn(void *_vq) // host -> guest
+void cons_receiveq_fn(void *_vq) // host -> guest
 {
        struct virtio_vq *vq = _vq;
        uint32_t head;
@@ -40,6 +40,7 @@ void *cons_receiveq_fn(void *_vq) // host -> guest
        uint32_t i, j;
        int num_read;
        struct iovec *iov;
+       struct virtio_mmio_dev *dev = vq->vqdev->transport_dev;
 
        if (!vq)
                errx(1,
@@ -85,25 +86,25 @@ void *cons_receiveq_fn(void *_vq) // host -> guest
                virtio_add_used_desc(vq, head, num_read);
 
                // Poke the guest however the mmio transport prefers
-               // NOTE: assuming that the mmio transport was used for now
-               virtio_mmio_set_vring_irq(vq->vqdev->transport_dev);
-               if (((struct virtio_mmio_dev*)vq->vqdev->transport_dev)->poke_guest)
-                       ((struct virtio_mmio_dev*)vq->vqdev->transport_dev)->poke_guest();
+               // NOTE: assuming that the mmio transport was used for now.
+               virtio_mmio_set_vring_irq(dev);
+               if (dev->poke_guest)
+                       dev->poke_guest(dev->vec, dev->dest);
                else
                        VIRTIO_DEV_ERRX(vq->vqdev,
                                "The host MUST provide a way for device interrupts to be sent to the guest. The 'poke_guest' function pointer on the vq->vqdev->transport_dev (assumed to be a struct virtio_mmio_dev) was not set.");
        }
        free(iov);
-       return NULL;
 }
 
-void *cons_transmitq_fn(void *_vq) // guest -> host
+void cons_transmitq_fn(void *_vq) // guest -> host
 {
        struct virtio_vq *vq = _vq;
        uint32_t head;
        uint32_t olen, ilen;
        uint32_t i, j;
        struct iovec *iov;
+       struct virtio_mmio_dev *dev = vq->vqdev->transport_dev;
 
        if (!vq)
                errx(1,
@@ -147,13 +148,12 @@ void *cons_transmitq_fn(void *_vq) // guest -> host
 
                // Poke the guest however the mmio transport prefers
                // NOTE: assuming that the mmio transport was used for now
-               virtio_mmio_set_vring_irq(vq->vqdev->transport_dev);
-               if (((struct virtio_mmio_dev*)vq->vqdev->transport_dev)->poke_guest)
-                       ((struct virtio_mmio_dev*)vq->vqdev->transport_dev)->poke_guest();
+               virtio_mmio_set_vring_irq(dev);
+               if (dev->poke_guest)
+                       dev->poke_guest(dev->vec, dev->dest);
                else
                        VIRTIO_DEV_ERRX(vq->vqdev,
                                "The host MUST provide a way for device interrupts to be sent to the guest. The 'poke_guest' function pointer on the vq->vqdev->transport_dev (assumed to be a struct virtio_mmio_dev) was not set.");
        }
        free(iov);
-       return NULL;
 }