Merge remote-tracking branch 'spice/spice.v61' into staging

* spice/spice.v61:
  qxl: set default revision to 4
  spice: raise requirement to 0.12
  hw/qxl: qxl_dirty_surfaces: use uintptr_t
  hw/qxl: fix condition for exiting guest_bug
  hw/qxl: exit on failure to register qxl interface
  qxl: fix range check for rev3 io commands.
  qxl/update_area_io: cleanup invalid parameters handling
  qxl: always update displaysurface on resize
This commit is contained in:
Anthony Liguori 2012-10-12 09:13:58 -05:00
commit 3f42ac89ba
8 changed files with 24 additions and 162 deletions

18
configure vendored
View File

@ -2716,20 +2716,14 @@ int main(void) { spice_server_new(); return 0; }
EOF EOF
spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null) spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null) spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
if $pkg_config --atleast-version=0.8.2 spice-server >/dev/null 2>&1 && \ if $pkg_config --atleast-version=0.12.0 spice-server >/dev/null 2>&1 && \
$pkg_config --atleast-version=0.8.1 spice-protocol > /dev/null 2>&1 && \ $pkg_config --atleast-version=0.12.2 spice-protocol > /dev/null 2>&1 && \
compile_prog "$spice_cflags" "$spice_libs" ; then compile_prog "$spice_cflags" "$spice_libs" ; then
spice="yes" spice="yes"
libs_softmmu="$libs_softmmu $spice_libs" libs_softmmu="$libs_softmmu $spice_libs"
QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags" QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags"
spice_protocol_version=$($pkg_config --modversion spice-protocol) spice_protocol_version=$($pkg_config --modversion spice-protocol)
spice_server_version=$($pkg_config --modversion spice-server) spice_server_version=$($pkg_config --modversion spice-server)
if $pkg_config --atleast-version=0.12.0 spice-protocol >/dev/null 2>&1; then
spice_qxl_io_monitors_config_async="yes"
fi
if $pkg_config --atleast-version=0.12.2 spice-protocol > /dev/null 2>&1; then
spice_qxl_client_monitors_config="yes"
fi
else else
if test "$spice" = "yes" ; then if test "$spice" = "yes" ; then
feature_not_found "spice" feature_not_found "spice"
@ -3474,14 +3468,6 @@ if test "$spice" = "yes" ; then
echo "CONFIG_SPICE=y" >> $config_host_mak echo "CONFIG_SPICE=y" >> $config_host_mak
fi fi
if test "$spice_qxl_io_monitors_config_async" = "yes" ; then
echo "CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC=y" >> $config_host_mak
fi
if test "$spice_qxl_client_monitors_config" = "yes" ; then
echo "CONFIG_QXL_CLIENT_MONITORS_CONFIG=y" >> $config_host_mak
fi
if test "$smartcard" = "yes" ; then if test "$smartcard" = "yes" ; then
echo "CONFIG_SMARTCARD=y" >> $config_host_mak echo "CONFIG_SMARTCARD=y" >> $config_host_mak
fi fi

View File

@ -371,6 +371,14 @@ static QEMUMachine pc_machine_v1_3 = {
.driver = "ivshmem",\ .driver = "ivshmem",\
.property = "use64",\ .property = "use64",\
.value = "0",\ .value = "0",\
},{\
.driver = "qxl",\
.property = "revision",\
.value = stringify(3),\
},{\
.driver = "qxl-vga",\
.property = "revision",\
.value = stringify(3),\
} }
static QEMUMachine pc_machine_v1_2 = { static QEMUMachine pc_machine_v1_2 = {

View File

@ -99,7 +99,6 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl)
{ {
VGACommonState *vga = &qxl->vga; VGACommonState *vga = &qxl->vga;
int i; int i;
DisplaySurface *surface = vga->ds->surface;
if (qxl->guest_primary.resized) { if (qxl->guest_primary.resized) {
qxl->guest_primary.resized = 0; qxl->guest_primary.resized = 0;
@ -112,9 +111,6 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl)
qxl->guest_primary.qxl_stride, qxl->guest_primary.qxl_stride,
qxl->guest_primary.bytes_pp, qxl->guest_primary.bytes_pp,
qxl->guest_primary.bits_pp); qxl->guest_primary.bits_pp);
}
if (surface->width != qxl->guest_primary.surface.width ||
surface->height != qxl->guest_primary.surface.height) {
if (qxl->guest_primary.qxl_stride > 0) { if (qxl->guest_primary.qxl_stride > 0) {
qemu_free_displaysurface(vga->ds); qemu_free_displaysurface(vga->ds);
qemu_create_displaysurface_from(qxl->guest_primary.surface.width, qemu_create_displaysurface_from(qxl->guest_primary.surface.width,

View File

@ -29,11 +29,6 @@
#include "qxl.h" #include "qxl.h"
#ifndef CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC
/* spice-protocol is too old, add missing definitions */
#define QXL_IO_MONITORS_CONFIG_ASYNC (QXL_IO_FLUSH_RELEASE + 1)
#endif
/* /*
* NOTE: SPICE_RING_PROD_ITEM accesses memory on the pci bar and as * NOTE: SPICE_RING_PROD_ITEM accesses memory on the pci bar and as
* such can be changed by the guest, so to avoid a guest trigerrable * such can be changed by the guest, so to avoid a guest trigerrable
@ -262,9 +257,6 @@ static void qxl_spice_destroy_surfaces(PCIQXLDevice *qxl, qxl_async_io async)
static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay) static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay)
{ {
trace_qxl_spice_monitors_config(qxl->id); trace_qxl_spice_monitors_config(qxl->id);
/* 0x000b01 == 0.11.1 */
#if SPICE_SERVER_VERSION >= 0x000b01 && \
defined(CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC)
if (replay) { if (replay) {
/* /*
* don't use QXL_COOKIE_TYPE_IO: * don't use QXL_COOKIE_TYPE_IO:
@ -286,10 +278,6 @@ static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay)
(uintptr_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO, (uintptr_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO,
QXL_IO_MONITORS_CONFIG_ASYNC)); QXL_IO_MONITORS_CONFIG_ASYNC));
} }
#else
fprintf(stderr, "qxl: too old spice-protocol/spice-server for "
"QXL_IO_MONITORS_CONFIG_ASYNC\n");
#endif
} }
void qxl_spice_reset_image_cache(PCIQXLDevice *qxl) void qxl_spice_reset_image_cache(PCIQXLDevice *qxl)
@ -948,8 +936,6 @@ static void interface_async_complete(QXLInstance *sin, uint64_t cookie_token)
} }
} }
#if SPICE_SERVER_VERSION >= 0x000b04
/* called from spice server thread context only */ /* called from spice server thread context only */
static void interface_set_client_capabilities(QXLInstance *sin, static void interface_set_client_capabilities(QXLInstance *sin,
uint8_t client_present, uint8_t client_present,
@ -971,11 +957,6 @@ static void interface_set_client_capabilities(QXLInstance *sin,
qxl_send_events(qxl, QXL_INTERRUPT_CLIENT); qxl_send_events(qxl, QXL_INTERRUPT_CLIENT);
} }
#endif
#if defined(CONFIG_QXL_CLIENT_MONITORS_CONFIG) \
&& SPICE_SERVER_VERSION >= 0x000b05
static uint32_t qxl_crc32(const uint8_t *p, unsigned len) static uint32_t qxl_crc32(const uint8_t *p, unsigned len)
{ {
/* /*
@ -1044,7 +1025,6 @@ static int interface_client_monitors_config(QXLInstance *sin,
qxl_send_events(qxl, QXL_INTERRUPT_CLIENT_MONITORS_CONFIG); qxl_send_events(qxl, QXL_INTERRUPT_CLIENT_MONITORS_CONFIG);
return 1; return 1;
} }
#endif
static const QXLInterface qxl_interface = { static const QXLInterface qxl_interface = {
.base.type = SPICE_INTERFACE_QXL, .base.type = SPICE_INTERFACE_QXL,
@ -1067,13 +1047,8 @@ static const QXLInterface qxl_interface = {
.flush_resources = interface_flush_resources, .flush_resources = interface_flush_resources,
.async_complete = interface_async_complete, .async_complete = interface_async_complete,
.update_area_complete = interface_update_area_complete, .update_area_complete = interface_update_area_complete,
#if SPICE_SERVER_VERSION >= 0x000b04
.set_client_capabilities = interface_set_client_capabilities, .set_client_capabilities = interface_set_client_capabilities,
#endif
#if SPICE_SERVER_VERSION >= 0x000b05 && \
defined(CONFIG_QXL_CLIENT_MONITORS_CONFIG)
.client_monitors_config = interface_client_monitors_config, .client_monitors_config = interface_client_monitors_config,
#endif
}; };
static void qxl_enter_vga_mode(PCIQXLDevice *d) static void qxl_enter_vga_mode(PCIQXLDevice *d)
@ -1461,12 +1436,12 @@ static void ioport_write(void *opaque, target_phys_addr_t addr,
qxl_async_io async = QXL_SYNC; qxl_async_io async = QXL_SYNC;
uint32_t orig_io_port = io_port; uint32_t orig_io_port = io_port;
if (d->guest_bug && !io_port == QXL_IO_RESET) { if (d->guest_bug && io_port != QXL_IO_RESET) {
return; return;
} }
if (d->revision <= QXL_REVISION_STABLE_V10 && if (d->revision <= QXL_REVISION_STABLE_V10 &&
io_port >= QXL_IO_FLUSH_SURFACES_ASYNC) { io_port > QXL_IO_FLUSH_RELEASE) {
qxl_set_guest_bug(d, "unsupported io %d for revision %d\n", qxl_set_guest_bug(d, "unsupported io %d for revision %d\n",
io_port, d->revision); io_port, d->revision);
return; return;
@ -1547,20 +1522,13 @@ async_common:
if (d->ram->update_surface > d->ssd.num_surfaces) { if (d->ram->update_surface > d->ssd.num_surfaces) {
qxl_set_guest_bug(d, "QXL_IO_UPDATE_AREA: invalid surface id %d\n", qxl_set_guest_bug(d, "QXL_IO_UPDATE_AREA: invalid surface id %d\n",
d->ram->update_surface); d->ram->update_surface);
return; break;
} }
if (update.left >= update.right || update.top >= update.bottom) { if (update.left >= update.right || update.top >= update.bottom ||
update.left < 0 || update.top < 0) {
qxl_set_guest_bug(d, qxl_set_guest_bug(d,
"QXL_IO_UPDATE_AREA: invalid area (%ux%u)x(%ux%u)\n", "QXL_IO_UPDATE_AREA: invalid area (%ux%u)x(%ux%u)\n",
update.left, update.top, update.right, update.bottom); update.left, update.top, update.right, update.bottom);
return;
}
if (update.left < 0 || update.top < 0 || update.left >= update.right ||
update.top >= update.bottom) {
qxl_set_guest_bug(d, "QXL_IO_UPDATE_AREA: "
"invalid area(%d,%d,%d,%d)\n", update.left,
update.right, update.top, update.bottom);
break; break;
} }
if (async == QXL_ASYNC) { if (async == QXL_ASYNC) {
@ -1811,7 +1779,7 @@ static void qxl_hw_text_update(void *opaque, console_ch_t *chardata)
static void qxl_dirty_surfaces(PCIQXLDevice *qxl) static void qxl_dirty_surfaces(PCIQXLDevice *qxl)
{ {
intptr_t vram_start; uintptr_t vram_start;
int i; int i;
if (qxl->mode != QXL_MODE_NATIVE && qxl->mode != QXL_MODE_COMPAT) { if (qxl->mode != QXL_MODE_NATIVE && qxl->mode != QXL_MODE_COMPAT) {
@ -1822,7 +1790,7 @@ static void qxl_dirty_surfaces(PCIQXLDevice *qxl)
qxl_set_dirty(&qxl->vga.vram, qxl->shadow_rom.draw_area_offset, qxl_set_dirty(&qxl->vga.vram, qxl->shadow_rom.draw_area_offset,
qxl->shadow_rom.surface0_area_size); qxl->shadow_rom.surface0_area_size);
vram_start = (intptr_t)memory_region_get_ram_ptr(&qxl->vram_bar); vram_start = (uintptr_t)memory_region_get_ram_ptr(&qxl->vram_bar);
/* dirty the off-screen surfaces */ /* dirty the off-screen surfaces */
for (i = 0; i < qxl->ssd.num_surfaces; i++) { for (i = 0; i < qxl->ssd.num_surfaces; i++) {
@ -1854,7 +1822,6 @@ static void qxl_vm_change_state_handler(void *opaque, int running,
RunState state) RunState state)
{ {
PCIQXLDevice *qxl = opaque; PCIQXLDevice *qxl = opaque;
qemu_spice_vm_change_state_handler(&qxl->ssd, running, state);
if (running) { if (running) {
/* /*
@ -1971,14 +1938,10 @@ static int qxl_init_common(PCIQXLDevice *qxl)
pci_device_rev = QXL_REVISION_STABLE_V10; pci_device_rev = QXL_REVISION_STABLE_V10;
io_size = 32; /* PCI region size must be pow2 */ io_size = 32; /* PCI region size must be pow2 */
break; break;
/* 0x000b01 == 0.11.1 */
#if SPICE_SERVER_VERSION >= 0x000b01 && \
defined(CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC)
case 4: /* qxl-4 */ case 4: /* qxl-4 */
pci_device_rev = QXL_REVISION_STABLE_V12; pci_device_rev = QXL_REVISION_STABLE_V12;
io_size = msb_mask(QXL_IO_RANGE_SIZE * 2 - 1); io_size = msb_mask(QXL_IO_RANGE_SIZE * 2 - 1);
break; break;
#endif
default: default:
error_report("Invalid revision %d for qxl device (max %d)", error_report("Invalid revision %d for qxl device (max %d)",
qxl->revision, QXL_DEFAULT_REVISION); qxl->revision, QXL_DEFAULT_REVISION);
@ -2044,7 +2007,11 @@ static int qxl_init_common(PCIQXLDevice *qxl)
qxl->ssd.qxl.base.sif = &qxl_interface.base; qxl->ssd.qxl.base.sif = &qxl_interface.base;
qxl->ssd.qxl.id = qxl->id; qxl->ssd.qxl.id = qxl->id;
qemu_spice_add_interface(&qxl->ssd.qxl.base); if (qemu_spice_add_interface(&qxl->ssd.qxl.base) != 0) {
error_report("qxl interface %d.%d not supported by spice-server\n",
SPICE_INTERFACE_QXL_MAJOR, SPICE_INTERFACE_QXL_MINOR);
return -1;
}
qemu_add_vm_change_state_handler(qxl_vm_change_state_handler, qxl); qemu_add_vm_change_state_handler(qxl_vm_change_state_handler, qxl);
init_pipe_signaling(qxl); init_pipe_signaling(qxl);

View File

@ -129,12 +129,7 @@ typedef struct PCIQXLDevice {
} \ } \
} while (0) } while (0)
#if 0
/* spice-server 0.12 is still in development */
#define QXL_DEFAULT_REVISION QXL_REVISION_STABLE_V12 #define QXL_DEFAULT_REVISION QXL_REVISION_STABLE_V12
#else
#define QXL_DEFAULT_REVISION QXL_REVISION_STABLE_V10
#endif
/* qxl.c */ /* qxl.c */
void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id); void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id);

View File

@ -223,7 +223,6 @@ static void channel_event(int event, SpiceChannelEventInfo *info)
client = qdict_new(); client = qdict_new();
server = qdict_new(); server = qdict_new();
#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT
if (info->flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT) { if (info->flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT) {
add_addr_info(client, (struct sockaddr *)&info->paddr_ext, add_addr_info(client, (struct sockaddr *)&info->paddr_ext,
info->plen_ext); info->plen_ext);
@ -232,12 +231,7 @@ static void channel_event(int event, SpiceChannelEventInfo *info)
} else { } else {
error_report("spice: %s, extended address is expected", error_report("spice: %s, extended address is expected",
__func__); __func__);
#endif
add_addr_info(client, &info->paddr, info->plen);
add_addr_info(server, &info->laddr, info->llen);
#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT
} }
#endif
if (event == SPICE_CHANNEL_EVENT_INITIALIZED) { if (event == SPICE_CHANNEL_EVENT_INITIALIZED) {
qdict_put(server, "auth", qstring_from_str(auth)); qdict_put(server, "auth", qstring_from_str(auth));
@ -276,7 +270,6 @@ static SpiceCoreInterface core_interface = {
.channel_event = channel_event, .channel_event = channel_event,
}; };
#ifdef SPICE_INTERFACE_MIGRATION
typedef struct SpiceMigration { typedef struct SpiceMigration {
SpiceMigrateInstance sin; SpiceMigrateInstance sin;
struct { struct {
@ -313,7 +306,6 @@ static void migrate_end_complete_cb(SpiceMigrateInstance *sin)
monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL); monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL);
spice_migration_completed = true; spice_migration_completed = true;
} }
#endif
/* config string parsing */ /* config string parsing */
@ -393,17 +385,13 @@ static SpiceChannelList *qmp_query_spice_channels(void)
chan = g_malloc0(sizeof(*chan)); chan = g_malloc0(sizeof(*chan));
chan->value = g_malloc0(sizeof(*chan->value)); chan->value = g_malloc0(sizeof(*chan->value));
#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT
if (item->info->flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT) { if (item->info->flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT) {
paddr = (struct sockaddr *)&item->info->paddr_ext; paddr = (struct sockaddr *)&item->info->paddr_ext;
plen = item->info->plen_ext; plen = item->info->plen_ext;
} else { } else {
#endif
paddr = &item->info->paddr; paddr = &item->info->paddr;
plen = item->info->plen; plen = item->info->plen;
#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT
} }
#endif
getnameinfo(paddr, plen, getnameinfo(paddr, plen,
host, sizeof(host), port, sizeof(port), host, sizeof(host), port, sizeof(port),
@ -473,13 +461,10 @@ SpiceInfo *qmp_query_spice(Error **errp)
info->tls_port = tls_port; info->tls_port = tls_port;
} }
#if SPICE_SERVER_VERSION >= 0x000a03 /* 0.10.3 */
info->mouse_mode = spice_server_is_server_mouse(spice_server) ? info->mouse_mode = spice_server_is_server_mouse(spice_server) ?
SPICE_QUERY_MOUSE_MODE_SERVER : SPICE_QUERY_MOUSE_MODE_SERVER :
SPICE_QUERY_MOUSE_MODE_CLIENT; SPICE_QUERY_MOUSE_MODE_CLIENT;
#else
info->mouse_mode = SPICE_QUERY_MOUSE_MODE_UNKNOWN;
#endif
/* for compatibility with the original command */ /* for compatibility with the original command */
info->has_channels = true; info->has_channels = true;
info->channels = qmp_query_spice_channels(); info->channels = qmp_query_spice_channels();
@ -492,19 +477,11 @@ static void migration_state_notifier(Notifier *notifier, void *data)
MigrationState *s = data; MigrationState *s = data;
if (migration_is_active(s)) { if (migration_is_active(s)) {
#ifdef SPICE_INTERFACE_MIGRATION
spice_server_migrate_start(spice_server); spice_server_migrate_start(spice_server);
#endif
} else if (migration_has_finished(s)) { } else if (migration_has_finished(s)) {
#ifndef SPICE_INTERFACE_MIGRATION
spice_server_migrate_switch(spice_server);
monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL);
spice_migration_completed = true;
#else
spice_server_migrate_end(spice_server, true); spice_server_migrate_end(spice_server, true);
} else if (migration_has_failed(s)) { } else if (migration_has_failed(s)) {
spice_server_migrate_end(spice_server, false); spice_server_migrate_end(spice_server, false);
#endif
} }
} }
@ -513,16 +490,11 @@ int qemu_spice_migrate_info(const char *hostname, int port, int tls_port,
MonitorCompletion *cb, void *opaque) MonitorCompletion *cb, void *opaque)
{ {
int ret; int ret;
#ifdef SPICE_INTERFACE_MIGRATION
spice_migrate.connect_complete.cb = cb; spice_migrate.connect_complete.cb = cb;
spice_migrate.connect_complete.opaque = opaque; spice_migrate.connect_complete.opaque = opaque;
ret = spice_server_migrate_connect(spice_server, hostname, ret = spice_server_migrate_connect(spice_server, hostname,
port, tls_port, subject); port, tls_port, subject);
#else
ret = spice_server_migrate_info(spice_server, hostname,
port, tls_port, subject);
cb(opaque, NULL);
#endif
return ret; return ret;
} }
@ -561,7 +533,6 @@ static int add_channel(const char *name, const char *value, void *opaque)
static void vm_change_state_handler(void *opaque, int running, static void vm_change_state_handler(void *opaque, int running,
RunState state) RunState state)
{ {
#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */
if (running) { if (running) {
qemu_spice_display_start(); qemu_spice_display_start();
spice_server_vm_start(spice_server); spice_server_vm_start(spice_server);
@ -569,7 +540,6 @@ static void vm_change_state_handler(void *opaque, int running,
spice_server_vm_stop(spice_server); spice_server_vm_stop(spice_server);
qemu_spice_display_stop(); qemu_spice_display_stop();
} }
#endif
} }
void qemu_spice_init(void) void qemu_spice_init(void)
@ -585,9 +555,7 @@ void qemu_spice_init(void)
int port, tls_port, len, addr_flags; int port, tls_port, len, addr_flags;
spice_image_compression_t compression; spice_image_compression_t compression;
spice_wan_compression_t wan_compr; spice_wan_compression_t wan_compr;
#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */
bool seamless_migration; bool seamless_migration;
#endif
qemu_thread_get_self(&me); qemu_thread_get_self(&me);
@ -672,16 +640,11 @@ void qemu_spice_init(void)
spice_server_set_ticket(spice_server, password, 0, 0, 0); spice_server_set_ticket(spice_server, password, 0, 0, 0);
} }
if (qemu_opt_get_bool(opts, "sasl", 0)) { if (qemu_opt_get_bool(opts, "sasl", 0)) {
#if SPICE_SERVER_VERSION >= 0x000900 /* 0.9.0 */
if (spice_server_set_sasl_appname(spice_server, "qemu") == -1 || if (spice_server_set_sasl_appname(spice_server, "qemu") == -1 ||
spice_server_set_sasl(spice_server, 1) == -1) { spice_server_set_sasl(spice_server, 1) == -1) {
error_report("spice: failed to enable sasl"); error_report("spice: failed to enable sasl");
exit(1); exit(1);
} }
#else
error_report("spice: sasl is not available (spice >= 0.9 required)");
exit(1);
#endif
} }
if (qemu_opt_get_bool(opts, "disable-ticketing", 0)) { if (qemu_opt_get_bool(opts, "disable-ticketing", 0)) {
auth = "none"; auth = "none";
@ -726,15 +689,11 @@ void qemu_spice_init(void)
qemu_opt_foreach(opts, add_channel, &tls_port, 0); qemu_opt_foreach(opts, add_channel, &tls_port, 0);
#if SPICE_SERVER_VERSION >= 0x000a02 /* 0.10.2 */
spice_server_set_name(spice_server, qemu_name); spice_server_set_name(spice_server, qemu_name);
spice_server_set_uuid(spice_server, qemu_uuid); spice_server_set_uuid(spice_server, qemu_uuid);
#endif
#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */
seamless_migration = qemu_opt_get_bool(opts, "seamless-migration", 0); seamless_migration = qemu_opt_get_bool(opts, "seamless-migration", 0);
spice_server_set_seamless_migration(spice_server, seamless_migration); spice_server_set_seamless_migration(spice_server, seamless_migration);
#endif
if (0 != spice_server_init(spice_server, &core_interface)) { if (0 != spice_server_init(spice_server, &core_interface)) {
error_report("failed to initialize spice server"); error_report("failed to initialize spice server");
exit(1); exit(1);
@ -743,11 +702,9 @@ void qemu_spice_init(void)
migration_state.notify = migration_state_notifier; migration_state.notify = migration_state_notifier;
add_migration_state_change_notifier(&migration_state); add_migration_state_change_notifier(&migration_state);
#ifdef SPICE_INTERFACE_MIGRATION
spice_migrate.sin.base.sif = &migrate_interface.base; spice_migrate.sin.base.sif = &migrate_interface.base;
spice_migrate.connect_complete.cb = NULL; spice_migrate.connect_complete.cb = NULL;
qemu_spice_add_interface(&spice_migrate.sin.base); qemu_spice_add_interface(&spice_migrate.sin.base);
#endif
qemu_spice_input_init(); qemu_spice_input_init();
qemu_spice_audio_init(); qemu_spice_audio_init();
@ -815,15 +772,11 @@ int qemu_spice_set_pw_expire(time_t expires)
int qemu_spice_display_add_client(int csock, int skipauth, int tls) int qemu_spice_display_add_client(int csock, int skipauth, int tls)
{ {
#if SPICE_SERVER_VERSION >= 0x000a01
if (tls) { if (tls) {
return spice_server_add_ssl_client(spice_server, csock, skipauth); return spice_server_add_ssl_client(spice_server, csock, skipauth);
} else { } else {
return spice_server_add_client(spice_server, csock, skipauth); return spice_server_add_client(spice_server, csock, skipauth);
} }
#else
return -1;
#endif
} }
static void spice_register_config(void) static void spice_register_config(void)

View File

@ -126,21 +126,6 @@ void qemu_spice_wakeup(SimpleSpiceDisplay *ssd)
ssd->worker->wakeup(ssd->worker); 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; static int spice_display_is_running;
void qemu_spice_display_start(void) void qemu_spice_display_start(void)
@ -153,15 +138,9 @@ void qemu_spice_display_stop(void)
spice_display_is_running = false; spice_display_is_running = false;
} }
#endif
int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd) 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; return spice_display_is_running;
#endif
} }
static void qemu_spice_create_one_update(SimpleSpiceDisplay *ssd, static void qemu_spice_create_one_update(SimpleSpiceDisplay *ssd,
@ -364,22 +343,6 @@ void qemu_spice_destroy_host_primary(SimpleSpiceDisplay *ssd)
qemu_spice_destroy_primary_surface(ssd, 0, QXL_SYNC); qemu_spice_destroy_primary_surface(ssd, 0, QXL_SYNC);
} }
void qemu_spice_vm_change_state_handler(void *opaque, int running,
RunState state)
{
#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */
SimpleSpiceDisplay *ssd = opaque;
if (running) {
ssd->running = true;
qemu_spice_start(ssd);
} else {
qemu_spice_stop(ssd);
ssd->running = false;
}
#endif
}
void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd, DisplayState *ds) void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd, DisplayState *ds)
{ {
ssd->ds = ds; ssd->ds = ds;
@ -623,7 +586,6 @@ void qemu_spice_display_init(DisplayState *ds)
qemu_spice_add_interface(&sdpy.qxl.base); qemu_spice_add_interface(&sdpy.qxl.base);
assert(sdpy.worker); assert(sdpy.worker);
qemu_add_vm_change_state_handler(qemu_spice_vm_change_state_handler, &sdpy);
qemu_spice_create_host_memslot(&sdpy); qemu_spice_create_host_memslot(&sdpy);
qemu_spice_create_host_primary(&sdpy); qemu_spice_create_host_primary(&sdpy);
} }

View File

@ -83,9 +83,6 @@ struct SimpleSpiceDisplay {
QXLRect dirty; QXLRect dirty;
int notify; int notify;
#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */
int running;
#endif
/* /*
* All struct members below this comment can be accessed from * All struct members below this comment can be accessed from
@ -133,8 +130,6 @@ void qemu_spice_create_primary_surface(SimpleSpiceDisplay *ssd, uint32_t id,
void qemu_spice_destroy_primary_surface(SimpleSpiceDisplay *ssd, void qemu_spice_destroy_primary_surface(SimpleSpiceDisplay *ssd,
uint32_t id, qxl_async_io async); uint32_t id, qxl_async_io async);
void qemu_spice_wakeup(SimpleSpiceDisplay *ssd); void qemu_spice_wakeup(SimpleSpiceDisplay *ssd);
#if SPICE_SERVER_VERSION >= 0x000b02 /* before 0.11.2 */
void qemu_spice_display_start(void); void qemu_spice_display_start(void);
void qemu_spice_display_stop(void); void qemu_spice_display_stop(void);
#endif
int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd); int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd);