examples configuring with '--enable-kvm --disable-tcg' - before
$ qemu-system-x86_64 -accel help Possible accelerators: kvm, xen, hax, tcg $ qemu-system-x86_64 -accel tcg qemu-system-x86_64: -machine accel=tcg: No accelerator found # qemu-system-x86_64 -accel hax qemu-system-x86_64: -machine accel=hax: No accelerator found - after $ qemu-system-x86_64 -accel help Possible accelerators: xen kvm Suggested-by: Eduardo Habkost <ehabk...@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <f4...@amsat.org> --- since RFC: - use much cleaner object_class_get_list(TYPE_ACCEL, false) vl.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/vl.c b/vl.c index ec299099ff..0f13641715 100644 --- a/vl.c +++ b/vl.c @@ -2764,6 +2764,39 @@ static gint machine_class_cmp(gconstpointer a, gconstpointer b) exit(!name || !is_help_option(name)); } +static void accel_list_entry(gpointer data, gpointer user_data) +{ + ObjectClass *oc = data; + const char *typename = object_class_get_name(oc); + int len; + + if (!qtest_driver() && !g_strcmp0(typename, ACCEL_CLASS_NAME("qtest"))) { + return; /* used by test cases */ + } + + len = strlen(typename) - strlen("-" TYPE_ACCEL); + if (len > 0) { + error_printf(" %.*s\n", len, typename); + } +} + +static void accel_parse(const char *name, QemuOpts *accel_opts) +{ + const char *optarg = qemu_opt_get(accel_opts, "accel"); + GSList *list; + + if (!is_help_option(optarg)) { + return; + } + + list = object_class_get_list(TYPE_ACCEL, false); + error_printf("Possible accelerators:\n"); + g_slist_foreach(list, accel_list_entry, NULL); + g_slist_free(list); + + exit(0); +} + void qemu_add_exit_notifier(Notifier *notify) { notifier_list_add(&exit_notifiers, notify); @@ -3881,11 +3914,7 @@ int main(int argc, char **argv, char **envp) case QEMU_OPTION_accel: accel_opts = qemu_opts_parse_noisily(qemu_find_opts("accel"), optarg, true); - optarg = qemu_opt_get(accel_opts, "accel"); - if (!optarg || is_help_option(optarg)) { - error_printf("Possible accelerators: kvm, xen, hax, tcg\n"); - exit(0); - } + accel_parse(optarg, accel_opts); opts = qemu_opts_create(qemu_find_opts("machine"), NULL, false, &error_abort); qemu_opt_set(opts, "accel", optarg, &error_abort); -- 2.15.0.rc2