From: Laszlo Ersek <lersek@redhat.com>
To: "Gabriel L. Somlo" <somlo@cmu.edu>, qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
pbonzini@redhat.com, kraxel@redhat.com,
jordan.l.justen@intel.com
Subject: Re: [Qemu-devel] [PATCH v4] fw_cfg: insert string blobs via qemu cmdline
Date: Wed, 14 Oct 2015 16:22:05 +0200 [thread overview]
Message-ID: <561E650D.3000208@redhat.com> (raw)
In-Reply-To: <1443544141-26568-1-git-send-email-somlo@cmu.edu>
Paolo,
On 09/29/15 18:29, Gabriel L. Somlo wrote:
> Allow users to provide custom fw_cfg blobs with ascii string
> payloads specified directly on the qemu command line.
>
> Suggested-by: Jordan Justen <jordan.l.justen@intel.com>
> Suggested-by: Laszlo Ersek <lersek@redhat.com>
> Signed-off-by: Gabriel Somlo <somlo@cmu.edu>
> Reviewd-by: Laszlo Ersek <lersek@redhat.com>
> ---
>
> New since v3: s/content/string/g for the option name, at Gerd's
> suggestion (to potentially allow for additional content
> types directly on the command line, should the need arise
> at a future date)
>
> Thanks,
> --Gabriel
>
> docs/specs/fw_cfg.txt | 15 +++++++++++++++
> qemu-options.hx | 7 ++++++-
> vl.c | 33 +++++++++++++++++++++++++++------
> 3 files changed, 48 insertions(+), 7 deletions(-)
I'm sure you're going to want to give me a hug for bringing this up, but
can you please pick this up? O:-)
Or maybe Peter can apply it directly?
Thanks!
Laszlo
> diff --git a/docs/specs/fw_cfg.txt b/docs/specs/fw_cfg.txt
> index b5f4b5d..a5ae930 100644
> --- a/docs/specs/fw_cfg.txt
> +++ b/docs/specs/fw_cfg.txt
> @@ -236,6 +236,21 @@ the following syntax:
> where <item_name> is the fw_cfg item name, and <path> is the location
> on the host file system of a file containing the data to be inserted.
>
> +Small enough items may be provided directly as strings on the command
> +line, using the syntax:
> +
> + -fw_cfg [name=]<item_name>,string=<string>
> +
> +The terminating NUL character of the content <string> will NOT be
> +included as part of the fw_cfg item data, which is consistent with
> +the absence of a NUL terminator for items inserted via the file option.
> +
> +Both <item_name> and, if applicable, the content <string> are passed
> +through by QEMU without any interpretation, expansion, or further
> +processing. Any such processing (potentially performed e.g., by the shell)
> +is outside of QEMU's responsibility; as such, using plain ASCII characters
> +is recommended.
> +
> NOTE: Users *SHOULD* choose item names beginning with the prefix "opt/"
> when using the "-fw_cfg" command line option, to avoid conflicting with
> item names used internally by QEMU. For instance:
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 328404c..408c5b4 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -2724,13 +2724,18 @@ ETEXI
>
> DEF("fw_cfg", HAS_ARG, QEMU_OPTION_fwcfg,
> "-fw_cfg [name=]<name>,file=<file>\n"
> - " add named fw_cfg entry from file\n",
> + " add named fw_cfg entry from file\n"
> + "-fw_cfg [name=]<name>,string=<str>\n"
> + " add named fw_cfg entry from string\n",
> QEMU_ARCH_ALL)
> STEXI
> @item -fw_cfg [name=]@var{name},file=@var{file}
> @findex -fw_cfg
> Add named fw_cfg entry from file. @var{name} determines the name of
> the entry in the fw_cfg file directory exposed to the guest.
> +
> +@item -fw_cfg [name=]@var{name},string=@var{str}
> +Add named fw_cfg entry from string.
> ETEXI
>
> DEF("serial", HAS_ARG, QEMU_OPTION_serial, \
> diff --git a/vl.c b/vl.c
> index e211f6a..854bd8b 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -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 */ }
> },
> @@ -2232,11 +2236,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");
> @@ -2244,8 +2253,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) {
> @@ -2256,9 +2272,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;
>
next prev parent reply other threads:[~2015-10-14 14:22 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-29 16:29 [Qemu-devel] [PATCH v4] fw_cfg: insert string blobs via qemu cmdline Gabriel L. Somlo
2015-10-14 14:22 ` Laszlo Ersek [this message]
2015-10-15 9:24 ` Gerd Hoffmann
2015-10-15 15:50 ` Laszlo Ersek
2015-10-15 17:59 ` Gabriel L. Somlo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=561E650D.3000208@redhat.com \
--to=lersek@redhat.com \
--cc=jordan.l.justen@intel.com \
--cc=kraxel@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=somlo@cmu.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.