On 06/09/20 19:07, Philippe Mathieu-Daudé wrote: > The 'gen_id' argument refers to a QOM object able to produce > data consumable by the fw_cfg device. The producer object must > implement the FW_CFG_DATA_GENERATOR interface. > > Signed-off-by: Philippe Mathieu-Daudé <phi...@redhat.com> > --- > v8: addressed Laszlo's comments > - fixed 2-space indent > - do not return 0 on failure > --- > softmmu/vl.c | 25 +++++++++++++++++-------- > 1 file changed, 17 insertions(+), 8 deletions(-) > > diff --git a/softmmu/vl.c b/softmmu/vl.c > index 05d1a4cb6b..a9bce2a1b1 100644 > --- a/softmmu/vl.c > +++ b/softmmu/vl.c > @@ -489,6 +489,11 @@ static QemuOptsList qemu_fw_cfg_opts = { > .name = "string", > .type = QEMU_OPT_STRING, > .help = "Sets content of the blob to be inserted from a string", > + }, { > + .name = "gen_id", > + .type = QEMU_OPT_STRING, > + .help = "Sets id of the object generating the fw_cfg blob " > + "to be inserted", > }, > { /* end of list */ } > }, > @@ -2020,7 +2025,7 @@ static int parse_fw_cfg(void *opaque, QemuOpts *opts, > Error **errp) > { > gchar *buf; > size_t size; > - const char *name, *file, *str; > + const char *name, *file, *str, *gen_id; > FWCfgState *fw_cfg = (FWCfgState *) opaque; > > if (fw_cfg == NULL) { > @@ -2030,14 +2035,13 @@ static int parse_fw_cfg(void *opaque, QemuOpts *opts, > Error **errp) > name = qemu_opt_get(opts, "name"); > file = qemu_opt_get(opts, "file"); > str = qemu_opt_get(opts, "string"); > + gen_id = qemu_opt_get(opts, "gen_id"); > > - /* we need name and either a file or the content string */ > - if (!(nonempty_str(name) && (nonempty_str(file) || nonempty_str(str)))) { > - error_setg(errp, "invalid argument(s)"); > - return -1; > - } > - if (nonempty_str(file) && nonempty_str(str)) { > - error_setg(errp, "file and string are mutually exclusive"); > + /* we need the name, and exactly one of: file, content string, gen_id */ > + if (!nonempty_str(name) || > + nonempty_str(file) + nonempty_str(str) + nonempty_str(gen_id) != 1) { > + error_setg(errp, "name, plus exactly one of file," > + " string and gen_id, are needed"); > return -1; > } > if (strlen(name) > FW_CFG_MAX_FILE_PATH - 1) { > @@ -2052,6 +2056,11 @@ static int parse_fw_cfg(void *opaque, QemuOpts *opts, > Error **errp) > if (nonempty_str(str)) { > size = strlen(str); /* NUL terminator NOT included in fw_cfg blob */ > buf = g_memdup(str, size); > + } else if (nonempty_str(gen_id)) { > + size_t fw_cfg_size; > + > + fw_cfg_size = fw_cfg_add_from_generator(fw_cfg, name, gen_id, errp); > + return (fw_cfg_size > 0) ? 0 : -1; > } else { > GError *err = NULL; > if (!g_file_get_contents(file, &buf, &size, &err)) { >
Reviewed-by: Laszlo Ersek <ler...@redhat.com>