diff options
author | Andrew Scull | 2022-05-16 10:41:31 +0000 |
---|---|---|
committer | Tom Rini | 2022-06-08 09:24:03 -0400 |
commit | 10a14536366350fdd2d14af1981d9e3d8cb3c524 (patch) | |
tree | 1ea7fac183ce3f796db30a3bca8267a5500c2e57 /include/virtio_ring.h | |
parent | b0952977c98affb9054aa5ba6a79291a293c8824 (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.h | 10 |
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; |