提交 3751d7c4 编写于 作者: P Paolo Bonzini

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: NPaolo Bonzini <pbonzini@redhat.com>
上级 f71e42a5
...@@ -822,15 +822,19 @@ int qemu_global_option(const char *str) ...@@ -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;
} }
...@@ -171,11 +171,13 @@ Set parameter @var{arg} for item @var{id} of type @var{group}\n" ...@@ -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= ...@@ -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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册