+QXLCookie *qxl_cookie_new(int type, uint64_t io)
+{
+ QXLCookie *cookie;
+
+ cookie = g_malloc0(sizeof(*cookie));
+ cookie->type = type;
+ cookie->io = io;
+ return cookie;
+}
+
+void qemu_spice_add_memslot(SimpleSpiceDisplay *ssd, QXLDevMemSlot *memslot,
+ qxl_async_io async)
+{
+ trace_qemu_spice_add_memslot(ssd->qxl.id, memslot->slot_id,
+ memslot->virt_start, memslot->virt_end,
+ async);
+
+ if (async != QXL_SYNC) {
+ spice_qxl_add_memslot_async(&ssd->qxl, memslot,
+ (uintptr_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO,
+ QXL_IO_MEMSLOT_ADD_ASYNC));
+ } else {
+ ssd->worker->add_memslot(ssd->worker, memslot);
+ }
+}
+
+void qemu_spice_del_memslot(SimpleSpiceDisplay *ssd, uint32_t gid, uint32_t sid)
+{
+ trace_qemu_spice_del_memslot(ssd->qxl.id, gid, sid);
+ ssd->worker->del_memslot(ssd->worker, gid, sid);
+}
+
+void qemu_spice_create_primary_surface(SimpleSpiceDisplay *ssd, uint32_t id,
+ QXLDevSurfaceCreate *surface,
+ qxl_async_io async)
+{
+ trace_qemu_spice_create_primary_surface(ssd->qxl.id, id, surface, async);
+ if (async != QXL_SYNC) {
+ spice_qxl_create_primary_surface_async(&ssd->qxl, id, surface,
+ (uintptr_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO,
+ QXL_IO_CREATE_PRIMARY_ASYNC));
+ } else {
+ ssd->worker->create_primary_surface(ssd->worker, id, surface);
+ }
+}
+
+void qemu_spice_destroy_primary_surface(SimpleSpiceDisplay *ssd,
+ uint32_t id, qxl_async_io async)
+{
+ trace_qemu_spice_destroy_primary_surface(ssd->qxl.id, id, async);
+ if (async != QXL_SYNC) {
+ spice_qxl_destroy_primary_surface_async(&ssd->qxl, id,
+ (uintptr_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO,
+ QXL_IO_DESTROY_PRIMARY_ASYNC));
+ } else {
+ ssd->worker->destroy_primary_surface(ssd->worker, id);
+ }
+}
+
+void qemu_spice_wakeup(SimpleSpiceDisplay *ssd)
+{
+ trace_qemu_spice_wakeup(ssd->qxl.id);
+ ssd->worker->wakeup(ssd->worker);
+}
+
+#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */
+static void qemu_spice_start(SimpleSpiceDisplay *ssd)
+{
+ trace_qemu_spice_start(ssd->qxl.id);
+ ssd->worker->start(ssd->worker);
+}
+
+static void qemu_spice_stop(SimpleSpiceDisplay *ssd)
+{
+ trace_qemu_spice_stop(ssd->qxl.id);
+ ssd->worker->stop(ssd->worker);
+}
+
+#else
+
+static int spice_display_is_running;
+
+void qemu_spice_display_start(void)
+{
+ spice_display_is_running = true;
+}
+
+void qemu_spice_display_stop(void)
+{
+ spice_display_is_running = false;
+}
+
+#endif
+
+int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd)
+{
+#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */
+ return ssd->running;
+#else
+ return spice_display_is_running;
+#endif
+}
+
+static void qemu_spice_create_update(SimpleSpiceDisplay *ssd)