VMM: Add our virtio_mmio_dev struct and specify its interface functions
authorMichael Taufen <mtaufen@gmail.com>
Wed, 4 May 2016 03:50:52 +0000 (20:50 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 13 May 2016 14:42:56 +0000 (10:42 -0400)
Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/vmm/include/vmm/virtio_mmio.h

index 222c276..3457cf6 100644 (file)
 #define VIRTIO_MMIO_INT_VRING          (1 << 0)
 #define VIRTIO_MMIO_INT_CONFIG         (1 << 1)
 
+// Code below this line was added for Akaros and is released
+// under the following copyrights and license:
+
+/* Virtio MMIO bindings
+ *
+ * Copyright (c) 2011 Linaro Limited
+ * Copyright (C) 1991-2016, the Linux Kernel authors
+ * Copyright (c) 2016 Google Inc.
+ *
+ * Author:
+ *  Peter Maydell <peter.maydell@linaro.org>
+ *  Rusty Russell <rusty@rustcorp.com.au>
+ *  Michael Taufen <mtaufen@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Akaros's virtio_mmio (items in this file following this notice)
+ * is inspired by QEMU's virtio-mmio.c and Linux's lguest.c.
+ * Both of QEMU's virtio-mmio.c and Linux's lguest.c are released under the
+ * GNU General Public License version 2 or later.
+ * Their original files were heavily modified for Akaros.
+ *
+ * Original linux/tools/lguest/lguest.c:
+ *   https://github.com/torvalds/linux/blob/v4.5/tools/lguest/lguest.c
+ *   most recent hash on the file as of v4.5 tag:
+ *     e523caa601f4a7c2fa1ecd040db921baf7453798
+ *
+ * Original virtio-mmio.c:
+ *   https://github.com/qemu/qemu/blob/v2.5.0/hw/virtio/virtio-mmio.c
+ *   most recent hash on the file as of v2.5.0 tag:
+ *     ab223c9518e8c7eb542ef3133de1a34475b69790
+ */
+
+#include <stdint.h>
+#include <vmm/virtio.h>
+
+// The virtio mmio transport device. Wraps a virtio_vq_dev.
+struct virtio_mmio_dev {
+       // The base address of the virtio mmio device
+       // we save the same value here as we report to guest via kernel cmd line
+       uint64_t addr;
+
+       // Reads from vqdev.dev_feat are performed starting at bit 32 * dev_feat_sel
+       uint32_t dev_feat_sel;
+
+       // Writes to vqdev.dri_feat are performed starting at bit 32 * dri_feat_sel
+       uint32_t dri_feat_sel;
+
+       // Reads and writes to queue-specific registers target vqdev->vqs[qsel]
+       uint32_t qsel;
+
+       // Interrupt status register
+       uint32_t isr;
+
+       // This utility function will be called when the device needs to interrupt
+       // the guest. You can have it do whatever you want, but it is required.
+       void (*poke_guest)(void);
+
+       // Status flags for the device
+       uint8_t status;
+
+       // ConfigGeneration, used to check that access to device-specific
+       // configuration space was atomic
+       uint32_t cfg_gen;
+
+       // The generic vq device contained by this mmio transport
+       struct virtio_vq_dev *vqdev;
+};
+
+// Sets the VIRTIO_MMIO_INT_VRING bit in the interrupt status
+// register for the device
+void virtio_mmio_set_vring_irq(struct virtio_mmio_dev *mmio_dev);
+
+// Sets the VIRTIO_MMIO_INT_CONFIG bit in the interrupt status
+// register for the device
+void virtio_mmio_set_cfg_irq(struct virtio_mmio_dev *mmio_dev);
+
+// virtio_mmio_rd and virtio_mmio_wr:
+// Used to read and write to the mmio device registers.
+// - gpa is the guest physical address that the driver tried to write to.
+//   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,
+                        uint64_t gpa, uint8_t size);
+void     virtio_mmio_wr(struct virtio_mmio_dev *mmio_dev,
+                        uint64_t gpa, uint8_t size, uint32_t *value);