@@ -261,6 +261,10 @@ static void host_memory_backend_init(Object *obj)
HostMemPolicy_lookup,
host_memory_backend_get_policy,
host_memory_backend_set_policy, NULL);
+ object_property_set_description(obj, "policy",
+ "Data format: one of "
+ HostMemPolicy_value_str,
+ &error_abort);
}
MemoryRegion *
@@ -382,6 +382,10 @@ qcrypto_secret_class_init(ObjectClass *oc, void *data)
qcrypto_secret_prop_get_format,
qcrypto_secret_prop_set_format,
NULL);
+ object_class_property_set_description(oc, "format",
+ "Data format: one of "
+ QCryptoSecretFormat_value_str,
+ &error_abort);
object_class_property_add_str(oc, "data",
qcrypto_secret_prop_get_data,
qcrypto_secret_prop_set_data,
@@ -237,6 +237,10 @@ qcrypto_tls_creds_class_init(ObjectClass *oc, void *data)
qcrypto_tls_creds_prop_get_endpoint,
qcrypto_tls_creds_prop_set_endpoint,
NULL);
+ object_class_property_set_description(oc, "endpoint",
+ "Data format: one of "
+ QCryptoTLSCredsEndpoint_value_str,
+ &error_abort);
object_class_property_add_str(oc, "priority",
qcrypto_tls_creds_prop_get_priority,
qcrypto_tls_creds_prop_set_priority,
@@ -165,4 +165,6 @@ int user_creatable_add_opts_foreach(void *opaque,
*/
void user_creatable_del(const char *id, Error **errp);
+int user_creatable_help_func(void *opaque, QemuOpts *opts, Error **errp);
+
#endif
@@ -182,6 +182,10 @@ static void netfilter_init(Object *obj)
NetFilterDirection_lookup,
netfilter_get_direction, netfilter_set_direction,
NULL);
+ object_property_set_description(obj, "queue",
+ "Data format: one of "
+ NetFilterDirection_value_str,
+ &error_abort);
object_property_add_str(obj, "status",
netfilter_get_status, netfilter_set_status,
NULL);
@@ -3759,7 +3759,9 @@ DEF("object", HAS_ARG, QEMU_OPTION_object,
" create a 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",
+ " '/objects' path.\n"
+ " Use '-object help' to print available backend types and\n"
+ " '-object typename,help' to print relevant properties.\n",
QEMU_ARCH_ALL)
STEXI
@item -object @var{typename}[,@var{prop1}=@var{value1},...]
@@ -3769,6 +3771,9 @@ in the order they are specified. Note that the 'id'
property must be set. These objects are placed in the
'/objects' path.
+Use @code{-object help} to print available backend types and
+@code{-object @var{typename},help} to print relevant properties.
+
@table @option
@item -object memory-backend-file,id=@var{id},size=@var{size},mem-path=@var{dir},share=@var{on|off}
@@ -5,6 +5,7 @@
#include "qapi-visit.h"
#include "qapi/qmp-output-visitor.h"
#include "qapi/opts-visitor.h"
+#include "qemu/help_option.h"
void user_creatable_complete(Object *obj, Error **errp)
{
@@ -212,6 +213,53 @@ void user_creatable_del(const char *id, Error **errp)
object_unparent(obj);
}
+int user_creatable_help_func(void *opaque, QemuOpts *opts, Error **errp)
+{
+ char *type = NULL;
+ Object *obj = NULL;
+ ObjectProperty *prop;
+ ObjectPropertyIterator iter;
+
+ type = qemu_opt_get(opts, "qom-type");
+ if (type && is_help_option(type)) {
+ GSList *list;
+ printf("Available object backend types:\n");
+ for (list = object_class_get_list(TYPE_USER_CREATABLE, false); \
+ list; \
+ list = list->next) {
+ const char *name;
+ name = object_class_get_name(OBJECT_CLASS(list->data));
+ printf("%s\n", name);
+ }
+ g_slist_free(list);
+ goto out;
+ }
+
+ if (!type || !qemu_opt_has_help_opt(opts)) {
+ return 0;
+ }
+
+ if (!object_class_by_name(type)) {
+ printf("invalid object type: %s\n", type);
+ goto out;
+ }
+ obj = object_new(type);
+ object_property_iter_init(&iter, obj);
+
+ while ((prop = object_property_iter_next(&iter))) {
+ if (prop->description) {
+ printf("%s (%s, %s)\n", prop->name, prop->type, prop->description);
+ } else {
+ printf("%s (%s)\n", prop->name, prop->type);
+ }
+ }
+
+out:
+ g_free(type);
+ object_unref(obj);
+ return 1;
+}
+
static void register_types(void)
{
static const TypeInfo uc_interface_info = {
@@ -4090,6 +4090,11 @@ int main(int argc, char **argv, char **envp)
exit(0);
}
+ if (qemu_opts_foreach(qemu_find_opts("object"), user_creatable_help_func,
+ NULL, NULL)) {
+ exit(1);
+ }
+
if (!trace_init_backends()) {
exit(1);
}
'-object help' prints available user creatable backends. '-object $typename,help' prints relevant properties. Signed-off-by: Lin Ma <lma@suse.com> --- backends/hostmem.c | 4 ++++ crypto/secret.c | 4 ++++ crypto/tlscreds.c | 4 ++++ include/qom/object_interfaces.h | 2 ++ net/filter.c | 4 ++++ qemu-options.hx | 7 +++++- qom/object_interfaces.c | 48 +++++++++++++++++++++++++++++++++++++++++ vl.c | 5 +++++ 8 files changed, 77 insertions(+), 1 deletion(-)