Implemented virtio-block
[akaros.git] / tests / vmm / vmrunkernel.c
index 034b4fc..609f7d2 100644 (file)
@@ -23,6 +23,7 @@
 #include <vmm/linux_bootparam.h>
 
 #include <vmm/virtio.h>
+#include <vmm/virtio_blk.h>
 #include <vmm/virtio_mmio.h>
 #include <vmm/virtio_ids.h>
 #include <vmm/virtio_config.h>
@@ -252,6 +253,36 @@ static struct virtio_vq_dev net_vqdev = {
        }
 };
 
+static struct virtio_mmio_dev blk_mmio_dev = {
+       .poke_guest = virtio_poke_guest,
+};
+
+static struct virtio_blk_config blk_cfg = {
+};
+
+static struct virtio_blk_config blk_cfg_d = {
+};
+
+static struct virtio_vq_dev blk_vqdev = {
+       .name = "block",
+       .dev_id = VIRTIO_ID_BLOCK,
+       .dev_feat = (1ULL << VIRTIO_F_VERSION_1),
+
+       .num_vqs = 1,
+       .cfg = &blk_cfg,
+       .cfg_d = &blk_cfg_d,
+       .cfg_sz = sizeof(struct virtio_blk_config),
+       .transport_dev = &blk_mmio_dev,
+       .vqs = {
+               {
+                       .name = "blk_request",
+                       .qnum_max = 64,
+                       .srv_fn = blk_request,
+                       .vqdev = &blk_vqdev
+               },
+       }
+};
+
 void lowmem() {
        __asm__ __volatile__ (".section .lowmem, \"aw\"\n\tlow: \n\t.=0x1000\n\t.align 0x100000\n\t.previous\n");
 }
@@ -346,6 +377,7 @@ int main(int argc, char **argv)
        uint64_t tsc_freq_khz;
        char *cmdlinep;
        int cmdlinesz, len;
+       char *disk_image_file = NULL;
 
        fprintf(stderr, "%p %p %p %p\n", PGSIZE, PGSHIFT, PML1_SHIFT,
                        PML1_PTE_REACH);
@@ -384,6 +416,7 @@ int main(int argc, char **argv)
        argc--, argv++;
        // switches ...
        // Sorry, I don't much like the gnu opt parsing code.
+       // TODO(dcross): Convert this to use getopt()
        while (1) {
                if (*argv[0] != '-')
                        break;
@@ -407,6 +440,10 @@ int main(int argc, char **argv)
                case 's':       /* scp */
                        parlib_wants_to_be_mcp = FALSE;
                        break;
+               case 'f':       /* file to pass to blk_init */
+                       argc--; argv++;
+                       disk_image_file = *argv;
+                       break;
                default:
                        fprintf(stderr, "BMAFR\n");
                        break;
@@ -600,6 +637,14 @@ int main(int argc, char **argv)
        net_mmio_dev.vqdev = &net_vqdev;
        vm->virtio_mmio_devices[VIRTIO_MMIO_NETWORK_DEV] = &net_mmio_dev;
 
+       if (disk_image_file != NULL) {
+               blk_mmio_dev.addr =
+                   virtio_mmio_base_addr + PGSIZE * VIRTIO_MMIO_BLOCK_DEV;
+               blk_mmio_dev.vqdev = &blk_vqdev;
+               vm->virtio_mmio_devices[VIRTIO_MMIO_BLOCK_DEV] = &blk_mmio_dev;
+               blk_init_fn(&blk_vqdev, disk_image_file);
+       }
+
        net_init_fn(&net_vqdev, default_nic);
 
        /* Set the kernel command line parameters */