Unmap pages mapped during a failed fill_vmr()
[akaros.git] / user / vmm / include / vmm / virtio.h
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  #pragma once
16
17 #include <stdint.h>
18 #include <err.h>
19 #include <sys/uio.h>
20 #include <vmm/virtio_ring.h>
21 #include <vmm/sched.h>
22
23 // This file contains the core virtio structs, functions, and macros for Akaros
24
25 // Print errors caused by incorrect driver behavior
26 #define VIRTIO_DRI_ERRX(dev, fmt, ...) \
27         errx(1, "\n  %s:%d\n  Virtio Device: %s: Error, driver behavior.\n  "\
28                 fmt, __FILE__, __LINE__, (dev)->name, ## __VA_ARGS__)
29
30 // Print warnings caused by incorrect driver behavior
31 #define VIRTIO_DRI_WARNX(dev, fmt, ...) \
32         warnx("\n  %s:%d\n  Virtio Device: %s: Warning, driver behavior.\n  "\
33                 fmt, __FILE__, __LINE__, (dev)->name, ## __VA_ARGS__)
34
35 // Print errors caused by incorrect device behavior
36 #define VIRTIO_DEV_ERRX(dev, fmt, ...) \
37         errx(1, "\n  %s:%d\n  Virtio Device: %s: Error, device behavior.\n  "\
38                 fmt, __FILE__, __LINE__, (dev)->name, ## __VA_ARGS__)
39
40 // Print warnings caused by incorrect device behavior
41 #define VIRTIO_DEV_WARNX(dev, fmt, ...) \
42         warnx("\n  %s:%d\n  Virtio Device: %s: Warning, device behavior.\n  "\
43                 fmt, __FILE__, __LINE__, (dev)->name, ## __VA_ARGS__)
44
45
46
47 struct virtio_vq {
48         // The name of the vq e.g. for printing errors
49         char *name;
50
51         // The vqdev that contains this vq
52         struct virtio_vq_dev *vqdev;
53
54         // The vring contains pointers to the descriptor table and available and
55         // used rings as well as the number of elements in the queue.
56         struct vring vring;
57
58         // The maximum number of elements in the queue that the device is ready to
59         // process. Reads from the register corresponding to this value return 0x0
60         // if the queue is not available. A queue's size is always a power of 2.
61         int qnum_max;
62
63         // The driver writes 0x1 to qready to tell the device
64         // that it can execute requests from this vq
65         uint32_t qready;
66
67         // The last vq.vring.avail->idx that the service function saw while
68         // processing the queue
69         uint16_t last_avail;
70
71         // The service function that processes buffers for this queue
72         void *(*srv_fn)(void *arg);
73
74         // The thread that the service function is running in
75         struct task_thread *srv_th;
76
77         // Write eventfd to wake up the service function; it blocks on eventfd read
78         int eventfd;
79 };
80
81 struct virtio_vq_dev {
82         // The name of the device e.g. for printing errors
83         char *name;
84
85         // The type of the device e.g. VIRTIO_ID_CONSOLE for a console device
86         uint32_t dev_id;
87
88         // The features supported by this device
89         uint64_t dev_feat;
90
91         // The features supported by the driver (these are set by the guest)
92         uint64_t dri_feat;
93
94         // The number of virtio_vqs on the device
95         uint32_t num_vqs;
96
97         // A pointer to the device-specific config space
98         void *cfg;
99
100         // A pointer to a default device-specific config space
101         // If set, cfg_sz bytes, starting at cfg_d, will be
102         // copied to cfg.
103         void *cfg_d;
104
105         // The size, in bytes, of the device-specific config space
106         // Used by the device to bounds-check driver access
107         uint64_t cfg_sz;
108
109         // The virtio transport dev that contains this vqdev
110         // i.e. struct virtio_mmio_dev
111         void *transport_dev;
112
113         // Flexible array of vqs on this device
114         struct virtio_vq vqs[];
115 };
116
117 // Do not include virtio_lguest_helpers.h directly. You should include the
118 // contained functions by including virtio.h. These functions are kept apart
119 // from virtio.h so that we can keep a clean separation between our code
120 // and code derived from lguest.
121 #include <vmm/virtio_lguest_helpers.h>
122
123 // Returns NULL if the features are valid, otherwise returns
124 // an error string describing what part of validation failed
125 // We pass the vqdev instead of just the dev_id in case we
126 // also want to validate the device-specific config space.
127 // feat is the feature vector that you want to validate for the vqdev
128 const char *virtio_validate_feat(struct virtio_vq_dev *vqdev, uint64_t feat);