mirror of https://gitee.com/openkylin/qemu.git
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:
parent
71b423f4b9
commit
5a49d3e9a7
|
@ -2762,6 +2762,9 @@ static const struct {
|
|||
#endif
|
||||
#ifdef CONFIG_SPICE
|
||||
{ .name = "spicevmc", .open = qemu_chr_open_spice },
|
||||
#if SPICE_SERVER_VERSION >= 0x000c02
|
||||
{ .name = "spiceport", .open = qemu_chr_open_spice_port },
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
@ -1749,6 +1749,7 @@ DEF("chardev", HAS_ARG, QEMU_OPTION_chardev,
|
|||
#endif
|
||||
#if defined(CONFIG_SPICE)
|
||||
"-chardev spicevmc,id=id,name=name[,debug=debug]\n"
|
||||
"-chardev spiceport,id=id,name=name[,debug=debug]\n"
|
||||
#endif
|
||||
, QEMU_ARCH_ALL
|
||||
)
|
||||
|
@ -1776,6 +1777,7 @@ Backend is one of:
|
|||
@option{tty},
|
||||
@option{parport},
|
||||
@option{spicevmc}.
|
||||
@option{spiceport}.
|
||||
The specific backend will determine the applicable options.
|
||||
|
||||
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.
|
||||
|
||||
@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
|
||||
ETEXI
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include "ui/qemu-spice.h"
|
||||
#include <spice.h>
|
||||
#include <spice-experimental.h>
|
||||
#include <spice/protocol.h>
|
||||
|
||||
#include "osdep.h"
|
||||
|
||||
|
@ -67,6 +68,27 @@ static int vmc_read(SpiceCharDeviceInstance *sin, uint8_t *buf, int len)
|
|||
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)
|
||||
{
|
||||
SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin);
|
||||
|
@ -103,6 +125,9 @@ static SpiceCharDeviceInterface vmc_interface = {
|
|||
.state = vmc_state,
|
||||
.write = vmc_write,
|
||||
.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;
|
||||
}
|
||||
|
||||
#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
|
||||
|
|
|
@ -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_register_interface(void *scd) "spice vmc registered 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
|
||||
lm32_pic_raise_irq(void) "Raise CPU interrupt"
|
||||
|
|
|
@ -46,6 +46,9 @@ void do_info_spice_print(Monitor *mon, const QObject *data);
|
|||
void do_info_spice(Monitor *mon, QObject **ret_data);
|
||||
|
||||
CharDriverState *qemu_chr_open_spice(QemuOpts *opts);
|
||||
#if SPICE_SERVER_VERSION >= 0x000c02
|
||||
CharDriverState *qemu_chr_open_spice_port(QemuOpts *opts);
|
||||
#endif
|
||||
|
||||
#else /* CONFIG_SPICE */
|
||||
#include "monitor.h"
|
||||
|
|
Loading…
Reference in New Issue