Commit 1f590cf9 authored by Lei Li's avatar Lei Li Committed by Luiz Capitulino
Browse files

QAPI: Introduce memchar-write QMP command

parent 51767e7c
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -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

    {
+13 −0
Original line number Diff line number Diff line
@@ -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) {
+1 −0
Original line number Diff line number Diff line
@@ -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);
+38 −0
Original line number Diff line number Diff line
@@ -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:
#
+42 −0
Original line number Diff line number Diff line
@@ -2748,6 +2748,48 @@ fail:
    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];
Loading