vl: allow full-blown QemuOpts syntax for -global

-global does not work for drivers that have a dot in their name, such as
cfi.pflash01.  This is just a parsing limitation, because such globals
can be declared easily inside a -readconfig file.

To allow this usage, support the full QemuOpts key/value syntax for -global
too, for example "-global driver=cfi.pflash01,property=secure,value=on".
The two formats do not conflict, because the key/value syntax does not have
a period before the first equal sign.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2015-04-09 14:16:19 +02:00
parent f71e42a5c9
commit 3751d7c43f
2 changed files with 17 additions and 8 deletions

View File

@ -822,15 +822,19 @@ int qemu_global_option(const char *str)
QemuOpts *opts; QemuOpts *opts;
int rc, offset; int rc, offset;
rc = sscanf(str, "%63[^.].%63[^=]%n", driver, property, &offset); rc = sscanf(str, "%63[^.=].%63[^=]%n", driver, property, &offset);
if (rc < 2 || str[offset] != '=') { if (rc == 2 && str[offset] == '=') {
error_report("can't parse: \"%s\"", str); opts = qemu_opts_create(&qemu_global_opts, NULL, 0, &error_abort);
qemu_opt_set(opts, "driver", driver, &error_abort);
qemu_opt_set(opts, "property", property, &error_abort);
qemu_opt_set(opts, "value", str + offset + 1, &error_abort);
return 0;
}
opts = qemu_opts_parse(&qemu_global_opts, str, false);
if (!opts) {
return -1; return -1;
} }
opts = qemu_opts_create(&qemu_global_opts, NULL, 0, &error_abort);
qemu_opt_set(opts, "driver", driver, &error_abort);
qemu_opt_set(opts, "property", property, &error_abort);
qemu_opt_set(opts, "value", str + offset + 1, &error_abort);
return 0; return 0;
} }

View File

@ -171,11 +171,13 @@ Set parameter @var{arg} for item @var{id} of type @var{group}\n"
ETEXI ETEXI
DEF("global", HAS_ARG, QEMU_OPTION_global, DEF("global", HAS_ARG, QEMU_OPTION_global,
"-global driver.prop=value\n" "-global driver.property=value\n"
"-global driver=driver,property=property,value=value\n"
" set a global default for a driver property\n", " set a global default for a driver property\n",
QEMU_ARCH_ALL) QEMU_ARCH_ALL)
STEXI STEXI
@item -global @var{driver}.@var{prop}=@var{value} @item -global @var{driver}.@var{prop}=@var{value}
@itemx -global driver=@var{driver},property=@var{property},value=@var{value}
@findex -global @findex -global
Set default value of @var{driver}'s property @var{prop} to @var{value}, e.g.: Set default value of @var{driver}'s property @var{prop} to @var{value}, e.g.:
@ -186,6 +188,9 @@ qemu-system-i386 -global ide-drive.physical_block_size=4096 -drive file=file,if=
In particular, you can use this to set driver properties for devices which are In particular, you can use this to set driver properties for devices which are
created automatically by the machine model. To create a device which is not created automatically by the machine model. To create a device which is not
created automatically and set properties on it, use -@option{device}. created automatically and set properties on it, use -@option{device}.
The two syntaxes are equivalent. The longer one works for drivers whose name
contains a dot.
ETEXI ETEXI
DEF("boot", HAS_ARG, QEMU_OPTION_boot, DEF("boot", HAS_ARG, QEMU_OPTION_boot,