Actual working output now from virtio ring. Time for lots and lots of cleanup.
authorRonald G. Minnich <rminnich@gmail.com>
Thu, 13 Aug 2015 17:53:28 +0000 (10:53 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 2 Nov 2015 23:24:25 +0000 (18:24 -0500)
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tests/vmm/vmrunkernel.c
user/vmm/virtio-mmio.c
user/vmm/virtio_ring.c

index 6eb4ade..34c48c2 100644 (file)
@@ -66,28 +66,29 @@ void *consout(void *arg)
        for(num = 0;;num++) {
                /* host: use any buffers we should have been sent. */
                head = wait_for_vq_desc(v, iov, &outlen, &inlen);
        for(num = 0;;num++) {
                /* host: use any buffers we should have been sent. */
                head = wait_for_vq_desc(v, iov, &outlen, &inlen);
+               (void) getchar();
                if (debug)
                if (debug)
-                       printf("vq desc head %d, gaveit %d gotitback %d\n", head, gaveit, gotitback);
+                       printf("CCC: vq desc head %d, gaveit %d gotitback %d\n", head, gaveit, gotitback);
                for(i = 0; debug && i < outlen + inlen; i++)
                for(i = 0; debug && i < outlen + inlen; i++)
-                       printf("v[%d/%d] v %p len %d\n", i, outlen + inlen, iov[i].v, iov[i].length);
+                       printf("CCC: v[%d/%d] v %p len %d\n", i, outlen + inlen, iov[i].v, iov[i].length);
                /* host: if we got an output buffer, just output it. */
                for(i = 0; i < outlen; i++) {
                        num++;
                /* host: if we got an output buffer, just output it. */
                for(i = 0; i < outlen; i++) {
                        num++;
-                       printf("Host:%s:\n", (char *)iov[i].v);
+                       printf("CCC: Host:%s:\n", (char *)iov[i].v);
                }
                
                if (debug)
                }
                
                if (debug)
-                       printf("outlen is %d; inlen is %d\n", outlen, inlen);
+                       printf("CCC: outlen is %d; inlen is %d\n", outlen, inlen);
                /* host: fill in the writeable buffers. */
                /* why we're getting these I don't know. */
                for (i = outlen; i < outlen + inlen; i++) {
                /* host: fill in the writeable buffers. */
                /* why we're getting these I don't know. */
                for (i = outlen; i < outlen + inlen; i++) {
-                       if (debug) fprintf(stderr, "send back empty writeable");
+                       if (debug) fprintf(stderr, "CCC: send back empty writeable");
                        iov[i].length = 0;
                }
                        iov[i].length = 0;
                }
-               if (debug) printf("call add_used\n");
+               if (debug) printf("CCC: call add_used\n");
                /* host: now ack that we used them all. */
                add_used(v, head, outlen+inlen);
                /* host: now ack that we used them all. */
                add_used(v, head, outlen+inlen);
-               if (debug) printf("DONE call add_used\n");
+               if (debug) printf("CCC: DONE call add_used\n");
        }
        fprintf(stderr, "All done\n");
        return NULL;
        }
        fprintf(stderr, "All done\n");
        return NULL;
@@ -330,9 +331,9 @@ int main(int argc, char **argv)
                int c;
                vmctl.command = REG_RIP;
                printf("RESUME?\n");
                int c;
                vmctl.command = REG_RIP;
                printf("RESUME?\n");
-               c = getchar();
-               if (c == 'q')
-                       break;
+               //c = getchar();
+               //if (c == 'q')
+                       //break;
                printf("RIP %p, shutdown 0x%x\n", vmctl.regs.tf_rip, vmctl.shutdown);
                //showstatus(stdout, &vmctl);
                // this will be in a function, someday.
                printf("RIP %p, shutdown 0x%x\n", vmctl.regs.tf_rip, vmctl.shutdown);
                //showstatus(stdout, &vmctl);
                // this will be in a function, someday.
index 2cbfc56..4b15469 100644 (file)
@@ -301,7 +301,7 @@ static void virtio_mmio_write(uint64_t gpa, uint32_t value)
                                                          mmio.vqdev->vqs[mmio.qsel].qnum,
                                                          mmio.vqdev->vqs[mmio.qsel].qalign,
                                                          false, // weak_barriers
                                                          mmio.vqdev->vqs[mmio.qsel].qnum,
                                                          mmio.vqdev->vqs[mmio.qsel].qalign,
                                                          false, // weak_barriers
-                                                         mmio.vqdev->vqs[mmio.qsel].pfn,
+                                                         mmio.vqdev->vqs[mmio.qsel].pfn * mmio.vqdev->vqs[mmio.qsel].qalign,
                                                          NULL, NULL, /* callbacks */
                                                          mmio.vqdev->vqs[mmio.qsel].name);
                    fprintf(stderr, "START THE THREAD. pfn is 0x%x, virtio is %p\n", mmio.pagesize, va->arg->virtio);
                                                          NULL, NULL, /* callbacks */
                                                          mmio.vqdev->vqs[mmio.qsel].name);
                    fprintf(stderr, "START THE THREAD. pfn is 0x%x, virtio is %p\n", mmio.pagesize, va->arg->virtio);
index 8c57297..f3454da 100644 (file)
@@ -688,15 +688,12 @@ struct virtqueue *vring_new_virtqueue(unsigned int index,
                exit(1);
        }
 
                exit(1);
        }
 
-#if 0 // pretty sure this is wrong? Or not? 
        vq = mmap((int*)4096, sizeof(*vq) + sizeof(void *) * num + 2*PGSIZE, PROT_READ | PROT_WRITE,
                  MAP_ANONYMOUS, -1, 0);
        if (vq == MAP_FAILED) {
                perror("Unable to mmap vq");
                exit(1);
        }
        vq = mmap((int*)4096, sizeof(*vq) + sizeof(void *) * num + 2*PGSIZE, PROT_READ | PROT_WRITE,
                  MAP_ANONYMOUS, -1, 0);
        if (vq == MAP_FAILED) {
                perror("Unable to mmap vq");
                exit(1);
        }
-#endif
-       vq = pages;
        fprintf(stderr, "VQ %p %d bytes \n", vq, num * vring_align); /* really? */
        if (!vq)
                return NULL;
        fprintf(stderr, "VQ %p %d bytes \n", vq, num * vring_align); /* really? */
        if (!vq)
                return NULL;
@@ -978,16 +975,11 @@ unsigned int wait_for_vq_desc(struct virtqueue *_vq,
        }
        *out_num = *in_num = 0;
        /* There's nothing available? */
        }
        *out_num = *in_num = 0;
        /* There's nothing available? */
-fprintf(stderr, "last_avail %d\n"); 
-       while (! vq->vring.avail) {
-               uthread_sleep(1);
-               fprintf(stderr, "last_avail %p\n", vq->vring.avail); 
-               hexdump(stderr, &(vq->vring), 96);
-       }
+fprintf(stderr, "last_avail %d\n", last_avail);  
                ;
                ;
-fprintf(stderr, "vq %p vq->vring.avail %p idx %d\n", vq, vq->vring.avail, vq->vring.avail);
+fprintf(stderr, "vq %p vq->vring.avail %p idx %d\n", vq, vq->vring.avail, vq->vring.avail); (void)getchar();
+j = 0;
        while (last_avail == vq->vring.avail->idx) {
        while (last_avail == vq->vring.avail->idx) {
-fprintf(stderr, "%d.", j++);
                //uint64_t event;
                if (virtqueue_is_broken(_vq)) {
                        return 0;
                //uint64_t event;
                if (virtqueue_is_broken(_vq)) {
                        return 0;
@@ -998,35 +990,31 @@ fprintf(stderr, "%d.", j++);
                 * Guest about what we've used up to now.
 
                trigger_irq(vq);
                 * Guest about what we've used up to now.
 
                trigger_irq(vq);
-fprintf(stderr, "%d.", j++);
                 */
                /* OK, now we need to know about added descriptors. */
                vq->vring.used->flags &= ~VRING_USED_F_NO_NOTIFY;
 
                 */
                /* OK, now we need to know about added descriptors. */
                vq->vring.used->flags &= ~VRING_USED_F_NO_NOTIFY;
 
-fprintf(stderr, "%d.", j++);
                /*
                 * They could have slipped one in as we were doing that: make
                 * sure it's written, then check again.
                 */
                mb();
                /*
                 * They could have slipped one in as we were doing that: make
                 * sure it's written, then check again.
                 */
                mb();
-fprintf(stderr, "%d.", j++);
                if (last_avail != vq->vring.avail->idx) {
                        vq->vring.used->flags |= VRING_USED_F_NO_NOTIFY;
                        break;
                }
 
                if (last_avail != vq->vring.avail->idx) {
                        vq->vring.used->flags |= VRING_USED_F_NO_NOTIFY;
                        break;
                }
 
-fprintf(stderr, "%d.", j++);
                /* Nothing new?  Wait for eventfd to tell us they refilled. *
                if (read(vq->eventfd, &event, sizeof(event)) != sizeof(event))
                        errx(1, "Event read failed?");
                */
                /* We don't need to be notified again. */
                vq->vring.used->flags |= VRING_USED_F_NO_NOTIFY;
                /* Nothing new?  Wait for eventfd to tell us they refilled. *
                if (read(vq->eventfd, &event, sizeof(event)) != sizeof(event))
                        errx(1, "Event read failed?");
                */
                /* We don't need to be notified again. */
                vq->vring.used->flags |= VRING_USED_F_NO_NOTIFY;
-fprintf(stderr, "%d.", j++);
        }
 
        /* Check it isn't doing very strange things with descriptor numbers. */
        }
 
        /* Check it isn't doing very strange things with descriptor numbers. */
-fprintf(stderr, "out of loop %d.", j++);
+//showvq(_vq);
+//fprintf(stderr, "out of loop %d.", j++); (void)getchar();
        if ((uint16_t)(vq->vring.avail->idx - last_avail) > vq->vring.num)
                errx(1, "Guest moved used index from %u to %u",
                     last_avail, vq->vring.avail->idx);
        if ((uint16_t)(vq->vring.avail->idx - last_avail) > vq->vring.num)
                errx(1, "Guest moved used index from %u to %u",
                     last_avail, vq->vring.avail->idx);
@@ -1037,7 +1025,6 @@ fprintf(stderr, "out of loop %d.", j++);
         */
        rmb();
 
         */
        rmb();
 
-fprintf(stderr, "out of loop %d.", j++);
        /*
         * Grab the next descriptor number they're advertising, and increment
         * the index we've seen.
        /*
         * Grab the next descriptor number they're advertising, and increment
         * the index we've seen.
@@ -1045,16 +1032,13 @@ fprintf(stderr, "out of loop %d.", j++);
        head = vq->vring.avail->ring[last_avail % vq->vring.num];
        lg_last_avail(vq)++;
 
        head = vq->vring.avail->ring[last_avail % vq->vring.num];
        lg_last_avail(vq)++;
 
-fprintf(stderr, "out of loop %d.", j++);
        /* If their number is silly, that's a fatal mistake. */
        if (head >= vq->vring.num)
                errx(1, "Guest says index %u is available", head);
 
        /* If their number is silly, that's a fatal mistake. */
        if (head >= vq->vring.num)
                errx(1, "Guest says index %u is available", head);
 
-fprintf(stderr, "out of loop %d.", j++);
        /* When we start there are none of either input nor output. */
        *out_num = *in_num = 0;
 
        /* When we start there are none of either input nor output. */
        *out_num = *in_num = 0;
 
-fprintf(stderr, "out of loop %d.", j++);
        max = vq->vring.num;
        desc = vq->vring.desc;
        i = head;
        max = vq->vring.num;
        desc = vq->vring.desc;
        i = head;
@@ -1080,9 +1064,7 @@ fprintf(stderr, "out of loop %d.", j++);
        }
 
 
        }
 
 
-fprintf(stderr, "out of loop %d.", j++);
        do {
        do {
-fprintf(stderr, "do loop %d.", j++);
                /* Grab the first descriptor, and check it's OK. */
                iov[*out_num + *in_num].length = desc[i].len;
                iov[*out_num + *in_num].v
                /* Grab the first descriptor, and check it's OK. */
                iov[*out_num + *in_num].length = desc[i].len;
                iov[*out_num + *in_num].v
@@ -1105,7 +1087,7 @@ fprintf(stderr, "do loop %d.", j++);
                        errx(1, "Looped descriptor");
        } while ((i = next_desc(desc, i, max)) != max);
 
                        errx(1, "Looped descriptor");
        } while ((i = next_desc(desc, i, max)) != max);
 
-fprintf(stderr, "RETURN head %d\n", head);
+fprintf(stderr, "RETURN head %d\n", head); (void)getchar();
        return head;
 }
 
        return head;
 }