We're finding more undocumented bits. So the bit set test is failing.
[akaros.git] / tests / vmm / vmrunkernel.c
index 243b1b0..65f669e 100644 (file)
@@ -40,7 +40,7 @@ int nr_threads = 3;
 char *line, *consline, *outline;
 struct scatterlist iov[32];
 unsigned int inlen, outlen, conslen;
-int debug = 1;
+int debug = 0;
 /* unlike Linux, this shared struct is for both host and guest. */
 //     struct virtqueue *constoguest = 
 //             vring_new_virtqueue(0, 512, 8192, 0, inpages, NULL, NULL, "test");
@@ -58,36 +58,38 @@ void *consout(void *arg)
        uint32_t vv;
        int i;
        int num;
-       printf("Sleep 15 seconds\n");
-       uthread_sleep(15);
-       printf("----------------------- TT a %p\n", a);
-       printf("talk thread ttargs %x v %x\n", a, v);
+       if (debug) {
+               printf("----------------------- TT a %p\n", a);
+               printf("talk thread ttargs %x v %x\n", a, v);
+       }
        
        for(num = 0;;num++) {
                /* host: use any buffers we should have been sent. */
                head = wait_for_vq_desc(v, iov, &outlen, &inlen);
                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++)
-                       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++;
-                       printf("Host:%s:\n", (char *)iov[i].v);
+                       int j;
+                       for (j = 0; j < iov[i].length; j++)
+                               printf("%c", ((char *)iov[i].v)[j]);
                }
                
                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++) {
-                       if (debug) fprintf(stderr, "send back empty writeable");
+                       if (debug) fprintf(stderr, "CCC: send back empty writeable");
                        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);
-               if (debug) printf("DONE call add_used\n");
+               if (debug) printf("CCC: DONE call add_used\n");
        }
        fprintf(stderr, "All done\n");
        return NULL;
@@ -166,11 +168,11 @@ void *consin(void *arg)
 static struct vqdev vqdev= {
 name: "console",
 dev: VIRTIO_ID_CONSOLE,
-features: VIRTIO_F_VERSION_1,
+device_features: 0, /* Can't do it: linux console device does not support it. VIRTIO_F_VERSION_1*/
 numvqs: 2,
 vqs: {
-               {name: "consin", maxqnum: 2, f: &consin, arg: (void *)0},
-               {name: "consout", maxqnum: 2, f: consout, arg: (void *)0},
+               {name: "consin", maxqnum: 64, f: &consin, arg: (void *)0},
+               {name: "consout", maxqnum: 64, f: consout, arg: (void *)0},
        }
 };
 
@@ -329,22 +331,22 @@ int main(int argc, char **argv)
                void showstatus(FILE *f, struct vmctl *v);
                int c;
                vmctl.command = REG_RIP;
-               printf("RESUME?\n");
-               c = getchar();
-               if (c == 'q')
-                       break;
-               printf("RIP %p, shutdown 0x%x\n", vmctl.regs.tf_rip, vmctl.shutdown);
+               if (debug) printf("RESUME?\n");
+               //c = getchar();
+               //if (c == 'q')
+                       //break;
+               if (debug) printf("RIP %p, shutdown 0x%x\n", vmctl.regs.tf_rip, vmctl.shutdown);
                //showstatus(stdout, &vmctl);
                // this will be in a function, someday.
                // A rough check: is the GPA 
                if ((vmctl.shutdown == 5/*EXIT_REASON_EPT_VIOLATION*/) && ((vmctl.gpa & ~0xfffULL) == virtiobase)) {
-                       printf("DO SOME VIRTIO\n");
+                       if (debug) printf("DO SOME VIRTIO\n");
                        virtio_mmio(&vmctl);
                        vmctl.shutdown = 0;
                        vmctl.gpa = 0;
                        vmctl.command = REG_ALL;
                }
-               printf("NOW DO A RESUME\n");
+               if (debug) printf("NOW DO A RESUME\n");
                ret = write(fd, &vmctl, sizeof(vmctl));
                if (ret != sizeof(vmctl)) {
                        perror(cmd);