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


Reply via email to