aboutsummaryrefslogtreecommitdiff
path: root/include/virtio_ring.h
diff options
context:
space:
mode:
authorAndrew Scull2022-05-16 10:41:31 +0000
committerTom Rini2022-06-08 09:24:03 -0400
commit10a14536366350fdd2d14af1981d9e3d8cb3c524 (patch)
tree1ea7fac183ce3f796db30a3bca8267a5500c2e57 /include/virtio_ring.h
parentb0952977c98affb9054aa5ba6a79291a293c8824 (diff)
virtio_ring: Maintain a shadow copy of descriptors
The shared descriptors should only be written by the guest driver, however, the device is still able to overwrite and corrupt them. Maintain a private shadow copy of the descriptors for the driver to use for state tracking, removing the need to read from the shared descriptors. Signed-off-by: Andrew Scull <ascull@google.com> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'include/virtio_ring.h')
-rw-r--r--include/virtio_ring.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/include/virtio_ring.h b/include/virtio_ring.h
index 6fc0593b14b..52cbe77c0a2 100644
--- a/include/virtio_ring.h
+++ b/include/virtio_ring.h
@@ -55,6 +55,14 @@ struct vring_desc {
__virtio16 next;
};
+/* Shadow of struct vring_desc in guest byte order. */
+struct vring_desc_shadow {
+ u64 addr;
+ u32 len;
+ u16 flags;
+ u16 next;
+};
+
struct vring_avail {
__virtio16 flags;
__virtio16 idx;
@@ -89,6 +97,7 @@ struct vring {
* @index: the zero-based ordinal number for this queue
* @num_free: number of elements we expect to be able to fit
* @vring: actual memory layout for this queue
+ * @vring_desc_shadow: guest-only copy of descriptors
* @event: host publishes avail event idx
* @free_head: head of free buffer list
* @num_added: number we've added since last sync
@@ -102,6 +111,7 @@ struct virtqueue {
unsigned int index;
unsigned int num_free;
struct vring vring;
+ struct vring_desc_shadow *vring_desc_shadow;
bool event;
unsigned int free_head;
unsigned int num_added;