summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCopilot <[email protected]>2026-01-04 16:55:19 +0800
committerGitHub <[email protected]>2026-01-04 16:55:19 +0800
commit7c05661ae9836533a5cce55b028fa90dec5e7fc9 (patch)
tree2e0c36f7e20652874c106bba0d2d974b94c69d24
parent4463dbcf23dc800296fa72ba138e59a1a705c738 (diff)
[virtio] Fix queue_sel ordering in virtio_queue_init and virtio_queue_destroy #11114
-rw-r--r--components/drivers/virtio/virtio.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/components/drivers/virtio/virtio.c b/components/drivers/virtio/virtio.c
index 0ad924e9d7..a7937dfaee 100644
--- a/components/drivers/virtio/virtio.c
+++ b/components/drivers/virtio/virtio.c
@@ -96,12 +96,16 @@ rt_err_t virtio_queue_init(struct virtio_device *dev, rt_uint32_t queue_index, r
_virtio_dev_check(dev);
- RT_ASSERT(dev->mmio_config->queue_num_max > 0);
- RT_ASSERT(dev->mmio_config->queue_num_max > queue_index);
+ RT_ASSERT(queue_index < dev->queues_num);
/* ring_size is power of 2 */
RT_ASSERT(ring_size > 0);
RT_ASSERT(((ring_size - 1) & ring_size) == 0);
+ /* Select the queue first, then read queue_num_max */
+ dev->mmio_config->queue_sel = queue_index;
+ RT_ASSERT(dev->mmio_config->queue_num_max > 0);
+ RT_ASSERT(ring_size <= dev->mmio_config->queue_num_max);
+
queue = &dev->queues[queue_index];
pages_total_size = VIRTIO_PAGE_ALIGN(
VIRTQ_DESC_TOTAL_SIZE(ring_size) + VIRTQ_AVAIL_TOTAL_SIZE(ring_size)) + VIRTQ_USED_TOTAL_SIZE(ring_size);
@@ -124,7 +128,6 @@ rt_err_t virtio_queue_init(struct virtio_device *dev, rt_uint32_t queue_index, r
rt_memset(pages, 0, pages_total_size);
dev->mmio_config->guest_page_size = VIRTIO_PAGE_SIZE;
- dev->mmio_config->queue_sel = queue_index;
dev->mmio_config->queue_num = ring_size;
dev->mmio_config->queue_align = VIRTIO_PAGE_SIZE;
dev->mmio_config->queue_pfn = VIRTIO_VA2PA(pages) >> VIRTIO_PAGE_SHIFT;
@@ -154,8 +157,11 @@ void virtio_queue_destroy(struct virtio_device *dev, rt_uint32_t queue_index)
_virtio_dev_check(dev);
+ RT_ASSERT(queue_index < dev->queues_num);
+
+ /* Select the queue first, then read queue_num_max */
+ dev->mmio_config->queue_sel = queue_index;
RT_ASSERT(dev->mmio_config->queue_num_max > 0);
- RT_ASSERT(dev->mmio_config->queue_num_max > queue_index);
queue = &dev->queues[queue_index];
@@ -164,7 +170,6 @@ void virtio_queue_destroy(struct virtio_device *dev, rt_uint32_t queue_index)
rt_free(queue->free);
rt_free_align((void *)queue->desc);
- dev->mmio_config->queue_sel = queue_index;
dev->mmio_config->queue_pfn = RT_NULL;
queue->num = 0;