VMM: Make new virtio implementation work with new vmm 2LS
authorGanShun <ganshun@gmail.com>
Mon, 9 May 2016 23:40:16 +0000 (16:40 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 13 May 2016 14:53:30 +0000 (10:53 -0400)
Changed pthread implementation to use the vmm task_threads.

Signed-off-by: GanShun <ganshun@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tests/vmm/vmrunkernel.c
user/vmm/include/vmm/virtio.h
user/vmm/include/vmm/virtio_lguest_console.h
user/vmm/include/vmm/virtio_mmio.h
user/vmm/include/vmm/vmm.h
user/vmm/virtio_lguest_console.c
user/vmm/virtio_mmio.c
user/vmm/vmexit.c

index 8a1c9f0..1f8d96c 100644 (file)
@@ -623,10 +623,10 @@ int main(int argc, char **argv)
        fprintf(stderr, "p512 %p p512[0] is 0x%lx p1 %p p1[0] is 0x%x\n", p512, p512[0], p1, p1[0]);
 
        vm->virtio_mmio_base = 0x100000000;
-       register_virtio_mmio(&vqdev, vm->virtio_mmio_base);
 
        cons_mmio_dev.addr = vm->virtio_mmio_base;
        cons_mmio_dev.vqdev = &cons_vqdev;
+       vm->cons_mmio_dev = &cons_mmio_dev;
 
        vmm_run_task(vm, timer_thread, 0);
 
index 373e55c..30718f8 100644 (file)
@@ -16,9 +16,9 @@
 
 #include <stdint.h>
 #include <err.h>
-#include <pthread.h>
 #include <sys/uio.h>
 #include <vmm/virtio_ring.h>
+#include <vmm/sched.h>
 
 // This file contains the core virtio structs, functions, and macros for Akaros
 
@@ -69,10 +69,10 @@ struct virtio_vq {
        uint16_t last_avail;
 
        // The service function that processes buffers for this queue
-       void *(*srv_fn)(void *arg);
+       void (*srv_fn)(void *arg);
 
        // The thread that the service function is running in
-       pthread_t srv_th;
+       struct task_thread *srv_th;
 
        // Write eventfd to wake up the service function; it blocks on eventfd read
        int eventfd;
index 9298891..62a0b54 100644 (file)
@@ -25,5 +25,5 @@
  *     e523caa601f4a7c2fa1ecd040db921baf7453798
  */
 
-void *cons_receiveq_fn(void *_vq);
-void *cons_transmitq_fn(void *_vq);
+void cons_receiveq_fn(void *_vq);
+void cons_transmitq_fn(void *_vq);
index 3457cf6..f0b8979 100644 (file)
@@ -228,7 +228,9 @@ void virtio_mmio_set_cfg_irq(struct virtio_mmio_dev *mmio_dev);
 //   It is used to calculate the offset from the mmio device's base address,
 //   and thus the target register of the access operation.
 // - size is the width of the access operation in bytes.
-uint32_t virtio_mmio_rd(struct virtio_mmio_dev *mmio_dev,
+uint32_t virtio_mmio_rd(struct virtual_machine *unused_vm,
+                        struct virtio_mmio_dev *mmio_dev,
                         uint64_t gpa, uint8_t size);
-void     virtio_mmio_wr(struct virtio_mmio_dev *mmio_dev,
+void     virtio_mmio_wr(struct virtual_machine *vm,
+                        struct virtio_mmio_dev *mmio_dev,
                         uint64_t gpa, uint8_t size, uint32_t *value);
index 0dd2274..5b5e7a1 100644 (file)
@@ -21,6 +21,7 @@ struct virtual_machine {
        uintptr_t                                       virtio_mmio_base;
        int                                                     virtio_irq;
        uint8_t                                         *low4k;
+       struct virtio_mmio_dev          *cons_mmio_dev;
 };
 
 char *regname(uint8_t reg);
index 45ec5ed..0303a0f 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;
@@ -94,10 +94,9 @@ void *cons_receiveq_fn(void *_vq) // host -> guest
                                "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;
@@ -155,5 +154,4 @@ void *cons_transmitq_fn(void *_vq) // guest -> host
                                "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;
 }
index e7cf953..5cef438 100644 (file)
@@ -37,7 +37,6 @@
 
 #include <stdio.h>
 #include <string.h>
-#include <pthread.h>
 #include <unistd.h>
 #include <sys/eventfd.h>
 #include <vmm/virtio_config.h>
@@ -133,7 +132,8 @@ static void virtio_mmio_reset(struct virtio_mmio_dev *mmio_dev)
        virtio_mmio_reset_cfg(mmio_dev);
 }
 
-uint32_t virtio_mmio_rd(struct virtio_mmio_dev *mmio_dev,
+uint32_t virtio_mmio_rd(struct virtual_machine *unused_vm,
+                        struct virtio_mmio_dev *mmio_dev,
                         uint64_t gpa, uint8_t size)
 {
        uint64_t offset = gpa - mmio_dev->addr;
@@ -354,7 +354,8 @@ uint32_t virtio_mmio_rd(struct virtio_mmio_dev *mmio_dev,
        return 0;
 }
 
-void virtio_mmio_wr(struct virtio_mmio_dev *mmio_dev, uint64_t gpa,
+void virtio_mmio_wr(struct virtual_machine *vm,
+                    struct virtio_mmio_dev *mmio_dev, uint64_t gpa,
                     uint8_t size, uint32_t *value)
 {
        uint64_t offset = gpa - mmio_dev->addr;
@@ -565,18 +566,14 @@ void virtio_mmio_wr(struct virtio_mmio_dev *mmio_dev, uint64_t gpa,
                                        mmio_dev->vqdev->vqs[mmio_dev->qsel].eventfd = eventfd(0, 0);
                                        mmio_dev->vqdev->vqs[mmio_dev->qsel].qready = 0x1;
 
-                                       if (pthread_create(
-                                                      // service thread id
-                                                      &mmio_dev->vqdev->vqs[mmio_dev->qsel].srv_th,
-                                                      // no special thread attrs
-                                                      NULL,
-                                                      // service function that srv_th starts in
-                                                      mmio_dev->vqdev->vqs[mmio_dev->qsel].srv_fn,
-                                                      // arg passed to srv_fn is the vq itself
-                                                      &mmio_dev->vqdev->vqs[mmio_dev->qsel]))
+                                       mmio_dev->vqdev->vqs[mmio_dev->qsel].srv_th =
+                                                       vmm_run_task(vm,
+                                                                       mmio_dev->vqdev->vqs[mmio_dev->qsel].srv_fn,
+                                                                       &mmio_dev->vqdev->vqs[mmio_dev->qsel]);
+                                       if (!mmio_dev->vqdev->vqs[mmio_dev->qsel].srv_th) {
                                                VIRTIO_DEV_ERRX(mmio_dev->vqdev,
-                                                       "pthread_create failed when trying to start service thread after driver wrote 0x1 to QueueReady.");
-
+                                                       "vm_run_task failed when trying to start service thread after driver wrote 0x1 to QueueReady.");
+                                       }
                                } else if (mmio_dev->vqdev->vqs[mmio_dev->qsel].qready == 0x1
                                               && *value == 0x0) {
                                        // Driver is trying to revoke QueueReady while the queue is
index 3a38361..615a86f 100644 (file)
@@ -28,20 +28,19 @@ static bool handle_ept_fault(struct guest_thread *gth)
         * be wrong too. */
        if (PG_ADDR(gpa) == vm->virtio_mmio_base) {
                /* TODO: can the guest cause us to spawn off infinite threads? */
-               virtio_mmio(gth, gpa, regx, regp, store);
                if (size < 0) {
                        // TODO: It would be preferable for the decoder to return an
                        //       unsigned value, so that we don't have to worry
                        //       about this. I don't know if it's even possible for
                        //       the width to be negative;
-                       VIRTIO_DRI_ERRX(cons_mmio_dev.vqdev,
+                       VIRTIO_DRI_ERRX(vm->cons_mmio_dev->vqdev,
                            "Driver tried to access the device with a negative access width in the instruction?");
                }
                //fprintf(stderr, "RIP is 0x%x\n", vm_tf->tf_rip);
                if (store)
-                       virtio_mmio_wr(&cons_mmio_dev, gpa, size, (uint32_t *)regp);
+                       virtio_mmio_wr(vm, vm->cons_mmio_dev, gpa, size, (uint32_t *)regp);
                else
-                       *regp = virtio_mmio_rd(&cons_mmio_dev, gpa, size);
+                       *regp = virtio_mmio_rd(vm, vm->cons_mmio_dev, gpa, size);
 
        } else if (PG_ADDR(gpa) == 0xfec00000) {
                do_ioapic(gth, gpa, regx, regp, store);