Skip to content

Commit

Permalink
QAPI: Introduce memchar-write QMP command
Browse files Browse the repository at this point in the history
Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
  • Loading branch information
leilihh authored and Luiz Capitulino committed Jan 25, 2013
1 parent 51767e7 commit 1f590cf
Show file tree
Hide file tree
Showing 6 changed files with 145 additions and 0 deletions.
18 changes: 18 additions & 0 deletions hmp-commands.hx
Expand Up @@ -837,6 +837,24 @@ STEXI
@item nmi @var{cpu}
@findex nmi
Inject an NMI on the given CPU (x86 only).

ETEXI

{
.name = "memchar_write",
.args_type = "device:s,data:s",
.params = "device data",
.help = "Provide writing interface for CirMemCharDriver. Write"
"'data' to it.",
.mhandler.cmd = hmp_memchar_write,
},

STEXI
@item memchar_write @var{device} @var{data}
@findex memchar_write
Provide writing interface for CirMemCharDriver. Write @var{data}
to char device 'memory'.

ETEXI

{
Expand Down
13 changes: 13 additions & 0 deletions hmp.c
Expand Up @@ -662,6 +662,19 @@ void hmp_pmemsave(Monitor *mon, const QDict *qdict)
hmp_handle_error(mon, &errp);
}

void hmp_memchar_write(Monitor *mon, const QDict *qdict)
{
uint32_t size;
const char *chardev = qdict_get_str(qdict, "device");
const char *data = qdict_get_str(qdict, "data");
Error *errp = NULL;

size = strlen(data);
qmp_memchar_write(chardev, size, data, false, 0, &errp);

hmp_handle_error(mon, &errp);
}

static void hmp_cont_cb(void *opaque, int err)
{
if (!err) {
Expand Down
1 change: 1 addition & 0 deletions hmp.h
Expand Up @@ -43,6 +43,7 @@ void hmp_system_powerdown(Monitor *mon, const QDict *qdict);
void hmp_cpu(Monitor *mon, const QDict *qdict);
void hmp_memsave(Monitor *mon, const QDict *qdict);
void hmp_pmemsave(Monitor *mon, const QDict *qdict);
void hmp_memchar_write(Monitor *mon, const QDict *qdict);
void hmp_cont(Monitor *mon, const QDict *qdict);
void hmp_system_wakeup(Monitor *mon, const QDict *qdict);
void hmp_inject_nmi(Monitor *mon, const QDict *qdict);
Expand Down
38 changes: 38 additions & 0 deletions qapi-schema.json
Expand Up @@ -324,6 +324,44 @@
##
{ 'command': 'query-chardev', 'returns': ['ChardevInfo'] }

##
# @DataFormat:
#
# An enumeration of data format.
#
# @utf8: The data format is 'utf8'.
#
# @base64: The data format is 'base64'.
#
# Since: 1.4
##
{ 'enum': 'DataFormat'
'data': [ 'utf8', 'base64' ] }

##
# @memchar-write:
#
# Provide writing interface for memchardev. Write data to char
# device 'memory'.
#
# @device: the name of the memory char device.
#
# @size: the size to write in bytes.
#
# @data: the source data write to memchar.
#
# @format: #optional the format of the data write to chardev 'memory',
# by default is 'utf8'.
#
# Returns: Nothing on success
# If @device is not a valid char device, DeviceNotFound
#
# Since: 1.4
##
{ 'command': 'memchar-write',
'data': {'device': 'str', 'size': 'int', 'data': 'str',
'*format': 'DataFormat'} }

##
# @CommandInfo:
#
Expand Down
42 changes: 42 additions & 0 deletions qemu-char.c
Expand Up @@ -2748,6 +2748,48 @@ static CharDriverState *qemu_chr_open_cirmemchr(QemuOpts *opts)
return NULL;
}

static bool qemu_is_chr(const CharDriverState *chr, const char *filename)
{
return strcmp(chr->filename, filename);
}

void qmp_memchar_write(const char *device, int64_t size,
const char *data, bool has_format,
enum DataFormat format,
Error **errp)
{
CharDriverState *chr;
guchar *write_data;
int ret;
gsize write_count;

chr = qemu_chr_find(device);
if (!chr) {
error_set(errp, QERR_DEVICE_NOT_FOUND, device);
return;
}

if (qemu_is_chr(chr, "memory")) {
error_setg(errp,"%s is not memory char device", device);
return;
}

write_count = (gsize)size;

if (has_format && (format == DATA_FORMAT_BASE64)) {
write_data = g_base64_decode(data, &write_count);
} else {
write_data = (uint8_t *)data;
}

ret = cirmem_chr_write(chr, write_data, write_count);

if (ret < 0) {
error_setg(errp, "Failed to write to device %s", device);
return;
}
}

QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename)
{
char host[65], port[33], width[8], height[8];
Expand Down
33 changes: 33 additions & 0 deletions qmp-commands.hx
Expand Up @@ -463,6 +463,39 @@ Example:
Note: inject-nmi fails when the guest doesn't support injecting.
Currently, only x86 guests do.

EQMP

{
.name = "memchar-write",
.args_type = "device:s,size:i,data:s,format:s?",
.mhandler.cmd_new = qmp_marshal_input_memchar_write,
},

SQMP
memchar-write
-------------

Provide writing interface for CirMemCharDriver. Write data to memory
char device.

Arguments:

- "device": the name of the char device, must be unique (json-string)
- "size": the memory size, in bytes, should be power of 2 (json-int)
- "data": the source data write to memory (json-string)
- "format": the data format write to memory, default is
utf8. (json-string, optional)
- Possible values: "utf8", "base64"

Example:

-> { "execute": "memchar-write",
"arguments": { "device": foo,
"size": 8,
"data": "abcdefgh",
"format": "utf8" } }
<- { "return": {} }

EQMP

{
Expand Down

0 comments on commit 1f590cf

Please sign in to comment.