spice-qemu-char: add spiceport chardev

Add a new spice chardev to allow arbitrary communication between the
host and the Spice client via the spice server.

Examples:

This allows the Spice client to have a special port for the qemu
monitor:

... -chardev spiceport,name=org.qemu.monitor,id=monitorport
    -mon chardev=monitorport

v2:
- remove support for chardev to chardev linking
- conditionnaly compile with SPICE_SERVER_VERSION

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Marc-André Lureau 2012-12-05 16:15:34 +01:00 committed by Gerd Hoffmann
parent 71b423f4b9
commit 5a49d3e9a7
5 changed files with 65 additions and 0 deletions

View File

@ -2762,6 +2762,9 @@ static const struct {
#endif #endif
#ifdef CONFIG_SPICE #ifdef CONFIG_SPICE
{ .name = "spicevmc", .open = qemu_chr_open_spice }, { .name = "spicevmc", .open = qemu_chr_open_spice },
#if SPICE_SERVER_VERSION >= 0x000c02
{ .name = "spiceport", .open = qemu_chr_open_spice_port },
#endif
#endif #endif
}; };

View File

@ -1749,6 +1749,7 @@ DEF("chardev", HAS_ARG, QEMU_OPTION_chardev,
#endif #endif
#if defined(CONFIG_SPICE) #if defined(CONFIG_SPICE)
"-chardev spicevmc,id=id,name=name[,debug=debug]\n" "-chardev spicevmc,id=id,name=name[,debug=debug]\n"
"-chardev spiceport,id=id,name=name[,debug=debug]\n"
#endif #endif
, QEMU_ARCH_ALL , QEMU_ARCH_ALL
) )
@ -1776,6 +1777,7 @@ Backend is one of:
@option{tty}, @option{tty},
@option{parport}, @option{parport},
@option{spicevmc}. @option{spicevmc}.
@option{spiceport}.
The specific backend will determine the applicable options. The specific backend will determine the applicable options.
All devices must have an id, which can be any string up to 127 characters long. All devices must have an id, which can be any string up to 127 characters long.
@ -1961,6 +1963,17 @@ required.
Connect to a spice virtual machine channel, such as vdiport. Connect to a spice virtual machine channel, such as vdiport.
@item -chardev spiceport ,id=@var{id} ,debug=@var{debug}, name=@var{name}
@option{spiceport} is only available when spice support is built in.
@option{debug} debug level for spicevmc
@option{name} name of spice port to connect to
Connect to a spice port, allowing a Spice client to handle the traffic
identified by a name (preferably a fqdn).
@end table @end table
ETEXI ETEXI

View File

@ -3,6 +3,7 @@
#include "ui/qemu-spice.h" #include "ui/qemu-spice.h"
#include <spice.h> #include <spice.h>
#include <spice-experimental.h> #include <spice-experimental.h>
#include <spice/protocol.h>
#include "osdep.h" #include "osdep.h"
@ -67,6 +68,27 @@ static int vmc_read(SpiceCharDeviceInstance *sin, uint8_t *buf, int len)
return bytes; return bytes;
} }
#if SPICE_SERVER_VERSION >= 0x000c02
static void vmc_event(SpiceCharDeviceInstance *sin, uint8_t event)
{
SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin);
int chr_event;
switch (event) {
case SPICE_PORT_EVENT_BREAK:
chr_event = CHR_EVENT_BREAK;
break;
default:
dprintf(scd, 2, "%s: unknown %d\n", __func__, event);
return;
}
dprintf(scd, 2, "%s: %d\n", __func__, event);
trace_spice_vmc_event(chr_event);
qemu_chr_be_event(scd->chr, chr_event);
}
#endif
static void vmc_state(SpiceCharDeviceInstance *sin, int connected) static void vmc_state(SpiceCharDeviceInstance *sin, int connected)
{ {
SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin); SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin);
@ -103,6 +125,9 @@ static SpiceCharDeviceInterface vmc_interface = {
.state = vmc_state, .state = vmc_state,
.write = vmc_write, .write = vmc_write,
.read = vmc_read, .read = vmc_read,
#if SPICE_SERVER_VERSION >= 0x000c02
.event = vmc_event,
#endif
}; };
@ -242,3 +267,23 @@ CharDriverState *qemu_chr_open_spice(QemuOpts *opts)
return chr; return chr;
} }
#if SPICE_SERVER_VERSION >= 0x000c02
CharDriverState *qemu_chr_open_spice_port(QemuOpts *opts)
{
CharDriverState *chr;
SpiceCharDriver *s;
const char *name = qemu_opt_get(opts, "name");
if (name == NULL) {
fprintf(stderr, "spice-qemu-char: missing name parameter\n");
return NULL;
}
chr = chr_open(opts, "port");
s = chr->opaque;
s->sin.portname = name;
return chr;
}
#endif

View File

@ -535,6 +535,7 @@ spice_vmc_write(ssize_t out, int len) "spice wrottn %zd of requested %d"
spice_vmc_read(int bytes, int len) "spice read %d of requested %d" spice_vmc_read(int bytes, int len) "spice read %d of requested %d"
spice_vmc_register_interface(void *scd) "spice vmc registered interface %p" spice_vmc_register_interface(void *scd) "spice vmc registered interface %p"
spice_vmc_unregister_interface(void *scd) "spice vmc unregistered interface %p" spice_vmc_unregister_interface(void *scd) "spice vmc unregistered interface %p"
spice_vmc_event(int event) "spice vmc event %d"
# hw/lm32_pic.c # hw/lm32_pic.c
lm32_pic_raise_irq(void) "Raise CPU interrupt" lm32_pic_raise_irq(void) "Raise CPU interrupt"

View File

@ -46,6 +46,9 @@ void do_info_spice_print(Monitor *mon, const QObject *data);
void do_info_spice(Monitor *mon, QObject **ret_data); void do_info_spice(Monitor *mon, QObject **ret_data);
CharDriverState *qemu_chr_open_spice(QemuOpts *opts); CharDriverState *qemu_chr_open_spice(QemuOpts *opts);
#if SPICE_SERVER_VERSION >= 0x000c02
CharDriverState *qemu_chr_open_spice_port(QemuOpts *opts);
#endif
#else /* CONFIG_SPICE */ #else /* CONFIG_SPICE */
#include "monitor.h" #include "monitor.h"