VMM: Added a helper function for validating device features
authorMichael Taufen <mtaufen@gmail.com>
Wed, 4 May 2016 03:40:34 +0000 (20:40 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 13 May 2016 14:42:56 +0000 (10:42 -0400)
As we add more devices (e.g. network), we can add more cases for
device-specific feature validation to this function.

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

index b8feca0..373e55c 100644 (file)
@@ -120,3 +120,9 @@ struct virtio_vq_dev {
 // and code derived from lguest.
 #include <vmm/virtio_lguest_helpers.h>
 
+// Returns NULL if the features are valid, otherwise returns
+// an error string describing what part of validation failed
+// We pass the vqdev instead of just the dev_id in case we
+// also want to validate the device-specific config space.
+// feat is the feature vector that you want to validate for the vqdev
+const char *virtio_validate_feat(struct virtio_vq_dev *vqdev, uint64_t feat);
diff --git a/user/vmm/virtio.c b/user/vmm/virtio.c
new file mode 100644 (file)
index 0000000..165cb47
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2016 Google Inc.
+ *
+ * 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.
+ */
+
+#include <vmm/virtio.h>
+#include <vmm/virtio_ids.h>
+#include <vmm/virtio_config.h>
+
+// Returns NULL if the features are valid, otherwise returns
+// an error string describing what part of validation failed
+// We pass the vqdev instead of just the dev_id in case we
+// also want to validate the device-specific config space.
+// feat is the feature vector that you want to validate for the vqdev
+const char *virtio_validate_feat(struct virtio_vq_dev *vqdev, uint64_t feat)
+{
+
+       // First validate device-specific features. We want to tell someone
+       // when they forgot to implement validation code for a new device
+       // as soon as possible, so that they don't skip this when they
+       // implement new devices.
+       switch (vqdev->dev_id) {
+               case VIRTIO_ID_CONSOLE:
+                       // No interdependent features for the console.
+                       break;
+               case 0:
+                       return "Invalid device id (0x0)! On the MMIO transport, this value indicates that the device is a system memory map with placeholder devices at static, well known addresses. In any case, this is not something you validate features for.";
+               default:
+                       return "Validation not implemented for this device type! You MUST implement validation for this device! You should add your new code to the virtio_validate_feat function in vmm/virtio.c.";
+       }
+
+       // Validate common features
+       if (!(feat & ((uint64_t)1 << VIRTIO_F_VERSION_1)))
+               return "A device MUST offer the VIRTIO_F_VERSION_1 feature bit and a driver MUST accept it.\n"
+                      "  See virtio-v1.0-cs04 s6.1 & s6.2.";
+
+       return NULL;
+}