proc: fix refcounting bug in proc_get_set()
[akaros.git] / user / vmm / virtio.c
1 /*
2  * Copyright (c) 2016 Google Inc.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of
7  * the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  */
14
15 #include <vmm/virtio.h>
16 #include <vmm/virtio_ids.h>
17 #include <vmm/virtio_config.h>
18
19 // Returns NULL if the features are valid, otherwise returns
20 // an error string describing what part of validation failed
21 // We pass the vqdev instead of just the dev_id in case we
22 // also want to validate the device-specific config space.
23 // feat is the feature vector that you want to validate for the vqdev
24 const char *virtio_validate_feat(struct virtio_vq_dev *vqdev, uint64_t feat)
25 {
26
27         // First validate device-specific features. We want to tell someone
28         // when they forgot to implement validation code for a new device
29         // as soon as possible, so that they don't skip this when they
30         // implement new devices.
31         switch (vqdev->dev_id) {
32         case VIRTIO_ID_CONSOLE:
33                 // No interdependent features for the console.
34                 break;
35         case VIRTIO_ID_NET:
36                 // There is no "mandatory" feature bit that we always want to
37                 // have, either the device can set its own MAC Address (as it
38                 // does now) or the driver can set it using a controller thread.
39                 break;
40         case VIRTIO_ID_BLOCK:
41                 break;
42         case 0:
43                 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.";
44         default:
45                 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.";
46         }
47
48         // Validate common features
49         if (!(feat & ((uint64_t)1 << VIRTIO_F_VERSION_1)))
50                 return "A device MUST offer the VIRTIO_F_VERSION_1 feature bit and a driver MUST accept it.\n"
51                        "  See virtio-v1.0-cs04 s6.1 & s6.2.";
52
53         return NULL;
54 }