mirror of https://github.com/xemu-project/xemu.git
chardev: add memory (ringbuf) support to qapi
This patch adds 'memory' support to qapi and also switches over the memory chardev initialization to the new qapi code path. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
702ec69cc1
commit
1da48c658a
|
@ -3247,6 +3247,17 @@
|
||||||
'*cols' : 'int',
|
'*cols' : 'int',
|
||||||
'*rows' : 'int' } }
|
'*rows' : 'int' } }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @ChardevRingbuf:
|
||||||
|
#
|
||||||
|
# Configuration info for memory chardevs
|
||||||
|
#
|
||||||
|
# @size: #optional Ringbuffer size, must be power of two, default is 65536
|
||||||
|
#
|
||||||
|
# Since: 1.5
|
||||||
|
##
|
||||||
|
{ 'type': 'ChardevRingbuf', 'data': { '*size' : 'int' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @ChardevBackend:
|
# @ChardevBackend:
|
||||||
#
|
#
|
||||||
|
@ -3270,7 +3281,8 @@
|
||||||
'console': 'ChardevDummy',
|
'console': 'ChardevDummy',
|
||||||
'spicevmc' : 'ChardevSpiceChannel',
|
'spicevmc' : 'ChardevSpiceChannel',
|
||||||
'spiceport' : 'ChardevSpicePort',
|
'spiceport' : 'ChardevSpicePort',
|
||||||
'vc' : 'ChardevVC' } }
|
'vc' : 'ChardevVC',
|
||||||
|
'memory' : 'ChardevRingbuf' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @ChardevReturn:
|
# @ChardevReturn:
|
||||||
|
|
30
qemu-char.c
30
qemu-char.c
|
@ -2884,7 +2884,8 @@ static void ringbuf_chr_close(struct CharDriverState *chr)
|
||||||
chr->opaque = NULL;
|
chr->opaque = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CharDriverState *qemu_chr_open_ringbuf(QemuOpts *opts)
|
static CharDriverState *qemu_chr_open_ringbuf(ChardevRingbuf *opts,
|
||||||
|
Error **errp)
|
||||||
{
|
{
|
||||||
CharDriverState *chr;
|
CharDriverState *chr;
|
||||||
RingBufCharDriver *d;
|
RingBufCharDriver *d;
|
||||||
|
@ -2892,14 +2893,11 @@ static CharDriverState *qemu_chr_open_ringbuf(QemuOpts *opts)
|
||||||
chr = g_malloc0(sizeof(CharDriverState));
|
chr = g_malloc0(sizeof(CharDriverState));
|
||||||
d = g_malloc(sizeof(*d));
|
d = g_malloc(sizeof(*d));
|
||||||
|
|
||||||
d->size = qemu_opt_get_size(opts, "size", 0);
|
d->size = opts->has_size ? opts->size : 65536;
|
||||||
if (d->size == 0) {
|
|
||||||
d->size = 65536;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The size must be power of 2 */
|
/* The size must be power of 2 */
|
||||||
if (d->size & (d->size - 1)) {
|
if (d->size & (d->size - 1)) {
|
||||||
error_report("size of ringbuf device must be power of two");
|
error_setg(errp, "size of ringbuf chardev must be power of two");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3201,6 +3199,20 @@ static void qemu_chr_parse_pipe(QemuOpts *opts, ChardevBackend *backend,
|
||||||
backend->pipe->device = g_strdup(device);
|
backend->pipe->device = g_strdup(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void qemu_chr_parse_ringbuf(QemuOpts *opts, ChardevBackend *backend,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
int val;
|
||||||
|
|
||||||
|
backend->memory = g_new0(ChardevRingbuf, 1);
|
||||||
|
|
||||||
|
val = qemu_opt_get_number(opts, "size", 0);
|
||||||
|
if (val != 0) {
|
||||||
|
backend->memory->has_size = true;
|
||||||
|
backend->memory->size = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct CharDriver {
|
typedef struct CharDriver {
|
||||||
const char *name;
|
const char *name;
|
||||||
/* old, pre qapi */
|
/* old, pre qapi */
|
||||||
|
@ -3740,6 +3752,9 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
|
||||||
case CHARDEV_BACKEND_KIND_VC:
|
case CHARDEV_BACKEND_KIND_VC:
|
||||||
chr = vc_init(backend->vc);
|
chr = vc_init(backend->vc);
|
||||||
break;
|
break;
|
||||||
|
case CHARDEV_BACKEND_KIND_MEMORY:
|
||||||
|
chr = qemu_chr_open_ringbuf(backend->memory, errp);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
error_setg(errp, "unknown chardev backend (%d)", backend->kind);
|
error_setg(errp, "unknown chardev backend (%d)", backend->kind);
|
||||||
break;
|
break;
|
||||||
|
@ -3782,7 +3797,8 @@ static void register_types(void)
|
||||||
register_char_driver_qapi("null", CHARDEV_BACKEND_KIND_NULL, NULL);
|
register_char_driver_qapi("null", CHARDEV_BACKEND_KIND_NULL, NULL);
|
||||||
register_char_driver("socket", qemu_chr_open_socket);
|
register_char_driver("socket", qemu_chr_open_socket);
|
||||||
register_char_driver("udp", qemu_chr_open_udp);
|
register_char_driver("udp", qemu_chr_open_udp);
|
||||||
register_char_driver("memory", qemu_chr_open_ringbuf);
|
register_char_driver_qapi("memory", CHARDEV_BACKEND_KIND_MEMORY,
|
||||||
|
qemu_chr_parse_ringbuf);
|
||||||
register_char_driver_qapi("file", CHARDEV_BACKEND_KIND_FILE,
|
register_char_driver_qapi("file", CHARDEV_BACKEND_KIND_FILE,
|
||||||
qemu_chr_parse_file_out);
|
qemu_chr_parse_file_out);
|
||||||
register_char_driver_qapi("stdio", CHARDEV_BACKEND_KIND_STDIO,
|
register_char_driver_qapi("stdio", CHARDEV_BACKEND_KIND_STDIO,
|
||||||
|
|
Loading…
Reference in New Issue