QAPI: Introduce memchar-read QMP command

Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
Lei Li 2013-01-25 00:03:21 +08:00 committed by Luiz Capitulino
parent 1f590cf945
commit 49b6d7220b
6 changed files with 159 additions and 0 deletions

View File

@ -855,6 +855,27 @@ STEXI
Provide writing interface for CirMemCharDriver. Write @var{data}
to char device 'memory'.
ETEXI
{
.name = "memchar_read",
.args_type = "device:s,size:i",
.params = "device size",
.help = "Provide read interface for CirMemCharDriver. Read from"
"it and return the data with size.",
.mhandler.cmd = hmp_memchar_read,
},
STEXI
@item memchar_read @var{device}
@findex memchar_read
Provide read interface for CirMemCharDriver. Read from char device
'memory' and return the data.
@var{size} is the size of data want to read from. Refer to unencoded
size of the raw data, would adjust to the init size of the memchar
if the requested size is larger than it.
ETEXI
{

21
hmp.c
View File

@ -675,6 +675,27 @@ void hmp_memchar_write(Monitor *mon, const QDict *qdict)
hmp_handle_error(mon, &errp);
}
void hmp_memchar_read(Monitor *mon, const QDict *qdict)
{
uint32_t size = qdict_get_int(qdict, "size");
const char *chardev = qdict_get_str(qdict, "device");
MemCharRead *meminfo;
Error *errp = NULL;
meminfo = qmp_memchar_read(chardev, size, false, 0, &errp);
if (errp) {
monitor_printf(mon, "%s\n", error_get_pretty(errp));
error_free(errp);
return;
}
if (meminfo->count > 0) {
monitor_printf(mon, "%s\n", meminfo->data);
}
qapi_free_MemCharRead(meminfo);
}
static void hmp_cont_cb(void *opaque, int err)
{
if (!err) {

1
hmp.h
View File

@ -44,6 +44,7 @@ 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_memchar_read(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);

View File

@ -362,6 +362,42 @@
'data': {'device': 'str', 'size': 'int', 'data': 'str',
'*format': 'DataFormat'} }
##
# @MemCharRead
#
# Result of QMP command memchar-read.
#
# @data: The data read from memchar as string.
#
# @count: The numbers of bytes read from.
#
# Since: 1.4
##
{ 'type': 'MemCharRead',
'data': { 'data': 'str', 'count': 'int' } }
##
# @memchar-read:
#
# Provide read interface for memchardev. Read from the char
# device 'memory' and return the data.
#
# @device: the name of the memory char device.
#
# @size: the size to read in bytes.
#
# @format: #optional the format of the data want to read from
# memchardev, by default is 'utf8'.
#
# Returns: @MemCharRead
# If @device is not a valid memchr device, DeviceNotFound
#
# Since: 1.4
##
{ 'command': 'memchar-read',
'data': {'device': 'str', 'size': 'int', '*format': 'DataFormat'},
'returns': 'MemCharRead' }
##
# @CommandInfo:
#

View File

@ -2790,6 +2790,53 @@ void qmp_memchar_write(const char *device, int64_t size,
}
}
MemCharRead *qmp_memchar_read(const char *device, int64_t size,
bool has_format, enum DataFormat format,
Error **errp)
{
CharDriverState *chr;
guchar *read_data;
MemCharRead *meminfo;
size_t count;
chr = qemu_chr_find(device);
if (!chr) {
error_set(errp, QERR_DEVICE_NOT_FOUND, device);
return NULL;
}
if (qemu_is_chr(chr, "memory")) {
error_setg(errp,"%s is not memory char device", device);
return NULL;
}
if (size <= 0) {
error_setg(errp, "size must be greater than zero");
return NULL;
}
meminfo = g_malloc0(sizeof(MemCharRead));
count = qemu_chr_cirmem_count(chr);
if (count == 0) {
meminfo->data = g_strdup("");
return meminfo;
}
size = size > count ? count : size;
read_data = g_malloc0(size + 1);
meminfo->count = cirmem_chr_read(chr, read_data, size);
if (has_format && (format == DATA_FORMAT_BASE64)) {
meminfo->data = g_base64_encode(read_data, (size_t)meminfo->count);
} else {
meminfo->data = (char *)read_data;
}
return meminfo;
}
QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename)
{
char host[65], port[33], width[8], height[8];

View File

@ -496,6 +496,39 @@ Example:
"format": "utf8" } }
<- { "return": {} }
EQMP
{
.name = "memchar-read",
.args_type = "device:s,size:i,format:s?",
.mhandler.cmd_new = qmp_marshal_input_memchar_read,
},
SQMP
memchar-read
-------------
Provide read interface for CirMemCharDriver. Read from the char
device memory and return the data with size.
Arguments:
- "device": the name of the char device, must be unique (json-string)
- "size": the memory size wanted to read in bytes (refer to unencoded
size of the raw data), would adjust to the init size of the
memchar if the requested size is larger than it. (json-int)
- "format": the data format write to memchardev, default is
utf8. (json-string, optional)
- Possible values: "utf8", "base64"
Example:
-> { "execute": "memchar-read",
"arguments": { "device": foo,
"size": 1000,
"format": "utf8" } }
<- { "return": { "data": "data string...", "count": 1000 } }
EQMP
{