case QXL_IO_DESTROY_PRIMARY: if (val != 0) { - qxl_guest_bug(d, "QXL_IO_DESTROY_PRIMARY: val != 0"); - break; + qxl_guest_bug(d, "QXL_IO_DESTROY_PRIMARY (async=%d): val != 0", + async); + goto cancel_async; + } + dprint(d, 1, "QXL_IO_DESTROY_PRIMARY (async=%d) (%s)\n", async, + qxl_mode_to_string(d->mode)); + qxl_destroy_primary(d, async); +#if SPICE_INTERFACE_QXL_MINOR>= 1 + if (d->mode == QXL_MODE_UNDEFINED&& async == QXL_ASYNC) { + dprint(d, 1, "QXL_IO_DESTROY_PRIMARY_ASYNC in %s, ignored\n", + qxl_mode_to_string(d->mode)); + qxl_send_events(d, QXL_INTERRUPT_IO_CMD); + goto cancel_async; }
Hmm? Why this is needed?
default: fprintf(stderr, "%s: ioport=0x%x, abort()\n", __FUNCTION__, io_port); abort(); } + return; +cancel_async: +#if SPICE_INTERFACE_QXL_MINOR>= 1 + if (async) { + qemu_mutex_lock(&d->async_lock); + d->current_async = QXL_UNDEFINED_IO; + qemu_mutex_unlock(&d->async_lock);
Add "qxl_send_events(d, QXL_INTERRUPT_IO_CMD)" here?
typedef struct PCIQXLDevice { PCIDevice pci; SimpleSpiceDisplay ssd; @@ -30,6 +32,11 @@ typedef struct PCIQXLDevice { int32_t num_memslots; int32_t num_surfaces; +#if SPICE_INTERFACE_QXL_MINOR>= 1 + uint32_t current_async; + QemuMutex async_lock; +#endif
No need to ifdef this. cheers, Gerd