VMM: Added virtio_lguest_helpers.h for helper functions derived from lguest
authorMichael Taufen <mtaufen@gmail.com>
Wed, 4 May 2016 03:31:33 +0000 (20:31 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 13 May 2016 14:42:56 +0000 (10:42 -0400)
This is included in virtio.h so that people can just include virtio.h and
access the common virtio utility functions, but we still maintain a clean
separation between our code and code derived from lguest.

Users should not include virtio_lguest_helpers.h directly.

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/vmm/include/vmm/virtio.h
user/vmm/include/vmm/virtio_lguest_helpers.h [new file with mode: 0644]

index 18c3b8b..b8feca0 100644 (file)
@@ -113,3 +113,10 @@ struct virtio_vq_dev {
        // Flexible array of vqs on this device
        struct virtio_vq vqs[];
 };
+
+// Do not include virtio_lguest_helpers.h directly. You should include the
+// contained functions by including virtio.h. These functions are kept apart
+// from virtio.h so that we can keep a clean separation between our code
+// and code derived from lguest.
+#include <vmm/virtio_lguest_helpers.h>
+
diff --git a/user/vmm/include/vmm/virtio_lguest_helpers.h b/user/vmm/include/vmm/virtio_lguest_helpers.h
new file mode 100644 (file)
index 0000000..21499c8
--- /dev/null
@@ -0,0 +1,46 @@
+/* Virtio helper functions from linux/tools/lguest/lguest.c
+ *
+ * Copyright (C) 1991-2016, the Linux Kernel authors
+ * Copyright (c) 2016 Google Inc.
+ *
+ * Author:
+ *  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.
+ *
+ * The code from lguest.c has been 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
+ */
+
+#pragma once
+
+// Validates memory regions provided by the guest's virtio driver
+void *virtio_check_pointer(struct virtio_vq *vq, uint64_t addr,
+                           uint32_t size, char *file, uint32_t line);
+
+// Adds descriptor chain to the used ring of the vq
+// Based on add_used in Linux's lguest.c
+void virtio_add_used_desc(struct virtio_vq *vq, uint32_t head, uint32_t len);
+
+// Waits for the next available descriptor chain and writes the addresses
+// and sizes of the buffers it describes to an iovec to make them easy to use.
+// Based on wait_for_vq_desc in Linux lguest.c
+uint32_t virtio_next_avail_vq_desc(struct virtio_vq *vq, struct iovec iov[],
+                            uint32_t *olen, uint32_t *ilen);
+
+// After the driver tells us that a queue is ready for processing,
+// we use this to validate the addresses on the vring it gave us.
+void virtio_check_vring(struct virtio_vq *vq);