diff options
| author | Peter Maydell | 2015-10-20 12:45:23 +0200 |
|---|---|---|
| committer | Peter Maydell | 2015-10-20 12:45:23 +0200 |
| commit | df8197836844275ef805c9031008eb3b20a89b83 (patch) | |
| tree | 2b44346f27a01ca6bc6216dc84d5e03c30cc7148 /vl.c | |
| parent | Merge remote-tracking branch 'remotes/kraxel/tags/pull-usb-20151020-1' into s... (diff) | |
| parent | fw_cfg: Define a static signature to be returned on DMA port reads (diff) | |
| download | qemu-df8197836844275ef805c9031008eb3b20a89b83.tar.gz qemu-df8197836844275ef805c9031008eb3b20a89b83.tar.xz qemu-df8197836844275ef805c9031008eb3b20a89b83.zip | |
Merge remote-tracking branch 'remotes/kraxel/tags/pull-fw_cfg-20151020-1' into staging
fw_cfg: add dma interface, add strings via cmdline.
# gpg: Signature made Tue 20 Oct 2015 07:07:34 BST using RSA key ID D3E87138
# gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
# gpg: aka "Gerd Hoffmann <gerd@kraxel.org>"
# gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>"
* remotes/kraxel/tags/pull-fw_cfg-20151020-1:
fw_cfg: Define a static signature to be returned on DMA port reads
Enable fw_cfg DMA interface for x86
Enable fw_cfg DMA interface for ARM
Implement fw_cfg DMA interface
fw_cfg DMA interface documentation
fw_cfg: document fw_cfg_modify_iXX() update functions
fw_cfg: insert string blobs via qemu cmdline
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'vl.c')
| -rw-r--r-- | vl.c | 33 |
1 files changed, 27 insertions, 6 deletions
@@ -512,6 +512,10 @@ static QemuOptsList qemu_fw_cfg_opts = { .type = QEMU_OPT_STRING, .help = "Sets the name of the file from which\n" "the fw_cfg blob will be loaded", + }, { + .name = "string", + .type = QEMU_OPT_STRING, + .help = "Sets content of the blob to be inserted from a string", }, { /* end of list */ } }, @@ -2239,11 +2243,16 @@ char *qemu_find_file(int type, const char *name) return NULL; } +static inline bool nonempty_str(const char *str) +{ + return str && *str; +} + static int parse_fw_cfg(void *opaque, QemuOpts *opts, Error **errp) { gchar *buf; size_t size; - const char *name, *file; + const char *name, *file, *str; if (opaque == NULL) { error_report("fw_cfg device not available"); @@ -2251,8 +2260,15 @@ static int parse_fw_cfg(void *opaque, QemuOpts *opts, Error **errp) } name = qemu_opt_get(opts, "name"); file = qemu_opt_get(opts, "file"); - if (name == NULL || *name == '\0' || file == NULL || *file == '\0') { - error_report("invalid argument value"); + str = qemu_opt_get(opts, "string"); + + /* we need name and either a file or the content string */ + if (!(nonempty_str(name) && (nonempty_str(file) || nonempty_str(str)))) { + error_report("invalid argument(s)"); + return -1; + } + if (nonempty_str(file) && nonempty_str(str)) { + error_report("file and string are mutually exclusive"); return -1; } if (strlen(name) > FW_CFG_MAX_FILE_PATH - 1) { @@ -2263,9 +2279,14 @@ static int parse_fw_cfg(void *opaque, QemuOpts *opts, Error **errp) error_report("WARNING: externally provided fw_cfg item names " "should be prefixed with \"opt/\"!"); } - if (!g_file_get_contents(file, &buf, &size, NULL)) { - error_report("can't load %s", file); - return -1; + if (nonempty_str(str)) { + size = strlen(str); /* NUL terminator NOT included in fw_cfg blob */ + buf = g_memdup(str, size); + } else { + if (!g_file_get_contents(file, &buf, &size, NULL)) { + error_report("can't load %s", file); + return -1; + } } fw_cfg_add_file((FWCfgState *)opaque, name, buf, size); return 0; |
