Properly reset Rutabaga so that Rutabaga will not continue to interact
with guest memory, for example.
Fixes: 1dcc6adbc168 ("gfxstream + rutabaga: add initial support for gfxstream")
Signed-off-by: Akihiko Odaki <[email protected]>
---
include/hw/virtio/virtio-gpu.h | 1 +
hw/display/virtio-gpu-rutabaga.c | 16 ++++++++++++++++
hw/display/virtio-gpu.c | 4 ++++
3 files changed, 21 insertions(+)
diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
index 69b5ee2e382f..acae2b4778b3 100644
--- a/include/hw/virtio/virtio-gpu.h
+++ b/include/hw/virtio/virtio-gpu.h
@@ -226,6 +226,7 @@ struct VirtIOGPU {
struct VirtIOGPUClass {
VirtIOGPUBaseClass parent;
+ void (*reset)(VirtIOGPU *g);
void (*handle_ctrl)(VirtIODevice *vdev, VirtQueue *vq);
void (*process_cmd)(VirtIOGPU *g, struct virtio_gpu_ctrl_command *cmd);
void (*update_cursor_data)(VirtIOGPU *g,
diff --git a/hw/display/virtio-gpu-rutabaga.c b/hw/display/virtio-gpu-rutabaga.c
index 041216a10d04..7bdeeeb5c023 100644
--- a/hw/display/virtio-gpu-rutabaga.c
+++ b/hw/display/virtio-gpu-rutabaga.c
@@ -1074,6 +1074,21 @@ virtio_gpu_rutabaga_get_num_capsets(VirtIOGPU *g,
uint32_t *num_capsets, Error *
return true;
}
+static void virtio_gpu_rutabaga_reset(VirtIOGPU *g)
+{
+ VirtIOGPURutabaga *vr = VIRTIO_GPU_RUTABAGA(g);
+ Error *local_err = NULL;
+
+ if (vr->rutabaga) {
+ rutabaga_finish(&vr->rutabaga);
+ }
+
+ if (!virtio_gpu_rutabaga_init(g, &local_err)) {
+ virtio_error(VIRTIO_DEVICE(g), "%s", error_get_pretty(local_err));
+ error_free(local_err);
+ }
+}
+
static void virtio_gpu_rutabaga_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
{
VirtIOGPU *g = VIRTIO_GPU(vdev);
@@ -1156,6 +1171,7 @@ static void virtio_gpu_rutabaga_class_init(ObjectClass
*klass, const void *data)
VirtIOGPUClass *vgc = VIRTIO_GPU_CLASS(klass);
vbc->gl_flushed = virtio_gpu_rutabaga_gl_flushed;
+ vgc->reset = virtio_gpu_rutabaga_reset;
vgc->handle_ctrl = virtio_gpu_rutabaga_handle_ctrl;
vgc->process_cmd = virtio_gpu_rutabaga_process_cmd;
vgc->update_cursor_data = virtio_gpu_rutabaga_update_cursor;
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index 55a1c7f80fb8..b57f07bd26c8 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -1761,6 +1761,10 @@ static void virtio_gpu_reset_bh(void *opaque)
qemu_console_set_surface(g->parent_obj.scanout[i].con, NULL);
}
+ if (vgc->reset) {
+ vgc->reset(g);
+ }
+
g->reset_finished = true;
qemu_cond_signal(&g->reset_cond);
}
--
2.55.0