Lei Li <li...@linux.vnet.ibm.com> writes: > Signed-off-by: Lei Li <li...@linux.vnet.ibm.com> > --- > qapi-schema.json | 20 ++++++++++++++++++++ > qemu-char.c | 19 +++++++++++++++++++ > qmp-commands.hx | 29 +++++++++++++++++++++++++++++ > 3 files changed, 68 insertions(+), 0 deletions(-) > > diff --git a/qapi-schema.json b/qapi-schema.json > index bc55ed2..3c8530f 100644 > --- a/qapi-schema.json > +++ b/qapi-schema.json > @@ -206,6 +206,26 @@ > { 'command': 'query-chardev', 'returns': ['ChardevInfo'] } > > ## > +# @memchar_write:
memchar-write as Eric suggested. > +# > +# Provide writing interface for memchardev. Write data to memchar > +# char device. > +# > +# @chardev: the name of the memchar char device. > +# > +# @size: the size to write in bytes. > +# > +# @data: the source data write to memchar. > +# > +# Returns: Nothing on success > +# If an I/O error occurs while writing, IOError > +# > +# Since: 1.2 > +## > +{ 'command': 'memchar_write', > + 'data': {'chardev': 'str', 'size': 'int', 'data': 'str'} } You should add another option which is '*format': 'DataFormat'. DataFormat would be an enum and would include: "utf8", "base64" to start with. The default value would be utf8. You'll need to be careful to scrub the output of memchar-read of any non-UTF8 character to make sure what you are returning is UTF8 clean. > + > +## > # @CommandInfo: > # > # Information about a QMP command > diff --git a/qemu-char.c b/qemu-char.c > index 087c92d..1012e65 100644 > --- a/qemu-char.c > +++ b/qemu-char.c > @@ -2636,6 +2636,25 @@ size_t qemu_chr_mem_osize(const CharDriverState *chr) > return d->cbuf_count; > } > > +void qmp_memchar_write(const char *chardev, int64_t size, > + uint8_t *data, Error **errp) > +{ > + CharDriverState *chr; > + int ret; > + > + chr = qemu_chr_find(chardev); > + > + if(!chr) { > + qemu_chr_init_mem(chr, size); > + } Indenting is off here (need a space after the if). Plus chr is still NULL after this returns. I don't think you should do lazy init here. If qemu_chr_find() returns NULL, you should throw an error. Regards, Anthony Liguori > + > + ret = mem_chr_write(chr, data, size); > + if (ret <= 0) { > + error_set(errp, QERR_IO_ERROR); > + return; > + } > +} > + > QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename) > { > char host[65], port[33], width[8], height[8]; > diff --git a/qmp-commands.hx b/qmp-commands.hx > index e3cf3c5..182f1e6 100644 > --- a/qmp-commands.hx > +++ b/qmp-commands.hx > @@ -441,6 +441,35 @@ Note: inject-nmi is only supported for x86 guest > currently, it will > EQMP > > { > + .name = "memchar_write", > + .args_type = "chardev:s,size:i,data:s", > + .mhandler.cmd_new = qmp_marshal_input_memchar_write, > + }, > + > +SQMP > +memchar_write > +------------- > + > +Provide writing interface for memchardev. Write data to memchar > +char device. > + > +Arguments: > + > +- "chardev": the name of the char device, must be unique (json-string) > +- "size": the memory size, in bytes (json-int) > +- "data": the source data writed to memchar (json-string) > + > +Example: > + > +-> { "execute": "memchar_write", > + "arguments": { "chardev": foo, > + "size": 1000, > + "data": "data string" } } > +<- { "return": {} } > + > +EQMP > + > + { > .name = "xen-save-devices-state", > .args_type = "filename:F", > .mhandler.cmd_new = qmp_marshal_input_xen_save_devices_state, > -- > 1.7.7.6