Loading hmp-commands.hx +18 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading hmp.c +13 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading hmp.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading qapi-schema.json +38 −0 Original line number Diff line number Diff line Loading @@ -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: # Loading qemu-char.c +42 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
hmp-commands.hx +18 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading
hmp.c +13 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading
hmp.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
qapi-schema.json +38 −0 Original line number Diff line number Diff line Loading @@ -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: # Loading
qemu-char.c +42 −0 Original line number Diff line number Diff line Loading @@ -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