提交 68d98d3e 编写于 作者: A Anthony Liguori

vl: add -object option to create QOM objects from the command line

This will create a new QOM object in the '/objects' path.  Note that properties
are set in order which allows for simple objects to be initialized entirely
with this option and then realized.

This option is roughly equivalent to -device but for things that are not
devices.
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 6801038b
...@@ -682,6 +682,15 @@ static QemuOptsList qemu_add_fd_opts = { ...@@ -682,6 +682,15 @@ static QemuOptsList qemu_add_fd_opts = {
}, },
}; };
static QemuOptsList qemu_object_opts = {
.name = "object",
.implied_opt_name = "qom-type",
.head = QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head),
.desc = {
{ }
},
};
static QemuOptsList *vm_config_groups[32] = { static QemuOptsList *vm_config_groups[32] = {
&qemu_drive_opts, &qemu_drive_opts,
&qemu_chardev_opts, &qemu_chardev_opts,
...@@ -699,6 +708,7 @@ static QemuOptsList *vm_config_groups[32] = { ...@@ -699,6 +708,7 @@ static QemuOptsList *vm_config_groups[32] = {
&qemu_iscsi_opts, &qemu_iscsi_opts,
&qemu_sandbox_opts, &qemu_sandbox_opts,
&qemu_add_fd_opts, &qemu_add_fd_opts,
&qemu_object_opts,
NULL, NULL,
}; };
......
...@@ -2904,6 +2904,14 @@ DEF("no-kvm-irqchip", HAS_ARG, QEMU_OPTION_no_kvm_irqchip, "", QEMU_ARCH_I386) ...@@ -2904,6 +2904,14 @@ DEF("no-kvm-irqchip", HAS_ARG, QEMU_OPTION_no_kvm_irqchip, "", QEMU_ARCH_I386)
HXCOMM Deprecated (ignored) HXCOMM Deprecated (ignored)
DEF("tdf", 0, QEMU_OPTION_tdf,"", QEMU_ARCH_ALL) DEF("tdf", 0, QEMU_OPTION_tdf,"", QEMU_ARCH_ALL)
DEF("object", HAS_ARG, QEMU_OPTION_object,
"-object TYPENAME[,PROP1=VALUE1,...]\n"
" create an new object of type TYPENAME setting properties\n"
" in the order they are specified. Note that the 'id'\n"
" property must be set. These objects are placed in the\n"
" '/objects' path.\n",
QEMU_ARCH_ALL)
HXCOMM This is the last statement. Insert new options before this line! HXCOMM This is the last statement. Insert new options before this line!
STEXI STEXI
@end table @end table
......
...@@ -168,6 +168,7 @@ int main(int argc, char **argv) ...@@ -168,6 +168,7 @@ int main(int argc, char **argv)
#include "osdep.h" #include "osdep.h"
#include "ui/qemu-spice.h" #include "ui/qemu-spice.h"
#include "qapi/string-input-visitor.h"
//#define DEBUG_NET //#define DEBUG_NET
//#define DEBUG_SLIRP //#define DEBUG_SLIRP
...@@ -2476,6 +2477,53 @@ static void free_and_trace(gpointer mem) ...@@ -2476,6 +2477,53 @@ static void free_and_trace(gpointer mem)
free(mem); free(mem);
} }
static int object_set_property(const char *name, const char *value, void *opaque)
{
Object *obj = OBJECT(opaque);
StringInputVisitor *siv;
Error *local_err = NULL;
if (strcmp(name, "qom-type") == 0 || strcmp(name, "id") == 0) {
return 0;
}
siv = string_input_visitor_new(value);
object_property_set(obj, string_input_get_visitor(siv), name, &local_err);
string_input_visitor_cleanup(siv);
if (local_err) {
qerror_report_err(local_err);
error_free(local_err);
return -1;
}
return 0;
}
static int object_create(QemuOpts *opts, void *opaque)
{
const char *type = qemu_opt_get(opts, "qom-type");
const char *id = qemu_opts_id(opts);
Object *obj;
g_assert(type != NULL);
if (id == NULL) {
qerror_report(QERR_MISSING_PARAMETER, "id");
return -1;
}
obj = object_new(type);
if (qemu_opt_foreach(opts, object_set_property, obj, 1) < 0) {
return -1;
}
object_property_add_child(container_get(object_get_root(), "/objects"),
id, obj, NULL);
return 0;
}
int main(int argc, char **argv, char **envp) int main(int argc, char **argv, char **envp)
{ {
int i; int i;
...@@ -3473,6 +3521,9 @@ int main(int argc, char **argv, char **envp) ...@@ -3473,6 +3521,9 @@ int main(int argc, char **argv, char **envp)
exit(1); exit(1);
#endif #endif
break; break;
case QEMU_OPTION_object:
opts = qemu_opts_parse(qemu_find_opts("object"), optarg, 1);
break;
default: default:
os_parse_cmd_args(popt->index, optarg); os_parse_cmd_args(popt->index, optarg);
} }
...@@ -3508,6 +3559,11 @@ int main(int argc, char **argv, char **envp) ...@@ -3508,6 +3559,11 @@ int main(int argc, char **argv, char **envp)
qemu_set_version(machine->hw_version); qemu_set_version(machine->hw_version);
} }
if (qemu_opts_foreach(qemu_find_opts("object"),
object_create, NULL, 0) != 0) {
exit(1);
}
/* Init CPU def lists, based on config /* Init CPU def lists, based on config
* - Must be called after all the qemu_read_config_file() calls * - Must be called after all the qemu_read_config_file() calls
* - Must be called before list_cpus() * - Must be called before list_cpus()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册