From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60705) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bA0mg-0003xq-Vs for qemu-devel@nongnu.org; Mon, 06 Jun 2016 16:06:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bA0ma-0006xk-RX for qemu-devel@nongnu.org; Mon, 06 Jun 2016 16:06:01 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60457) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bA0ma-0006xe-KE for qemu-devel@nongnu.org; Mon, 06 Jun 2016 16:05:56 -0400 From: Eduardo Habkost Date: Mon, 6 Jun 2016 17:05:38 -0300 Message-Id: <1465243543-889-2-git-send-email-ehabkost@redhat.com> In-Reply-To: <1465243543-889-1-git-send-email-ehabkost@redhat.com> References: <1465243543-889-1-git-send-email-ehabkost@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH v2 1/6] target-i386: List CPU models using subclass list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Jiri Denemark , =?UTF-8?q?Andreas=20F=C3=A4rber?= , Igor Mammedov , libvir-list@redhat.com Instead of using the builtin_x86_defs array, use the QOM subclass list to list CPU models on "-cpu ?" and "query-cpu-definitions". Signed-off-by: Andreas F=C3=A4rber [ehabkost: copied code from a patch by Andreas: "target-i386: QOM'ify CPU", from March 2012] Signed-off-by: Eduardo Habkost --- target-i386/cpu-qom.h | 4 ++ target-i386/cpu.c | 111 +++++++++++++++++++++++++++++++++++++-------= ------ 2 files changed, 86 insertions(+), 29 deletions(-) diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h index 5dde658..e724004 100644 --- a/target-i386/cpu-qom.h +++ b/target-i386/cpu-qom.h @@ -63,6 +63,10 @@ typedef struct X86CPUClass { =20 bool kvm_required; =20 + /* Optional description of CPU model. + * If unavailable, cpu_def->model_id is used */ + const char *model_description; + DeviceRealize parent_realize; void (*parent_reset)(CPUState *cpu); } X86CPUClass; diff --git a/target-i386/cpu.c b/target-i386/cpu.c index a62d731..aaa239a 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -678,6 +678,14 @@ static ObjectClass *x86_cpu_class_by_name(const char= *cpu_model) return oc; } =20 +static char *x86_cpu_class_get_model_name(X86CPUClass *cc) +{ + const char *class_name =3D object_class_get_name(OBJECT_CLASS(cc)); + assert(g_str_has_suffix(class_name, X86_CPU_TYPE_SUFFIX)); + return g_strndup(class_name, + strlen(class_name) - strlen(X86_CPU_TYPE_SUFFIX)); +} + struct X86CPUDefinition { const char *name; uint32_t level; @@ -1531,6 +1539,9 @@ static void host_x86_cpu_class_init(ObjectClass *oc= , void *data) cpu_x86_fill_model_id(host_cpudef.model_id); =20 xcc->cpu_def =3D &host_cpudef; + xcc->model_description =3D + "KVM processor with all supported host features " + "(only available in KVM mode)"; =20 /* level, xlevel, xlevel2, and the feature words are initialized on * instance_init, because they require KVM to be initialized. @@ -2022,23 +2033,62 @@ static void listflags(FILE *f, fprintf_function p= rint, const char **featureset) } } =20 -/* generate CPU information. */ +/* Sort alphabetically by type name, listing kvm_required models last. *= / +static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b) +{ + ObjectClass *class_a =3D (ObjectClass *)a; + ObjectClass *class_b =3D (ObjectClass *)b; + X86CPUClass *cc_a =3D X86_CPU_CLASS(class_a); + X86CPUClass *cc_b =3D X86_CPU_CLASS(class_b); + const char *name_a, *name_b; + + if (cc_a->kvm_required !=3D cc_b->kvm_required) { + /* kvm_required items go last */ + return cc_a->kvm_required ? 1 : -1; + } else { + name_a =3D object_class_get_name(class_a); + name_b =3D object_class_get_name(class_b); + return strcmp(name_a, name_b); + } +} + +static GSList *get_sorted_cpu_model_list(void) +{ + GSList *list =3D object_class_get_list(TYPE_X86_CPU, false); + list =3D g_slist_sort(list, x86_cpu_list_compare); + return list; +} + +static void x86_cpu_list_entry(gpointer data, gpointer user_data) +{ + ObjectClass *oc =3D data; + X86CPUClass *cc =3D X86_CPU_CLASS(oc); + CPUListState *s =3D user_data; + char *name =3D x86_cpu_class_get_model_name(cc); + const char *desc =3D cc->model_description; + if (!desc) { + desc =3D cc->cpu_def->model_id; + } + + (*s->cpu_fprintf)(s->file, "x86 %16s %-48s\n", + name, desc); + g_free(name); +} + +/* list available CPU models and flags */ void x86_cpu_list(FILE *f, fprintf_function cpu_fprintf) { - X86CPUDefinition *def; - char buf[256]; int i; + CPUListState s =3D { + .file =3D f, + .cpu_fprintf =3D cpu_fprintf, + }; + GSList *list; =20 - for (i =3D 0; i < ARRAY_SIZE(builtin_x86_defs); i++) { - def =3D &builtin_x86_defs[i]; - snprintf(buf, sizeof(buf), "%s", def->name); - (*cpu_fprintf)(f, "x86 %16s %-48s\n", buf, def->model_id); - } -#ifdef CONFIG_KVM - (*cpu_fprintf)(f, "x86 %16s %-48s\n", "host", - "KVM processor with all supported host features " - "(only available in KVM mode)"); -#endif + (*cpu_fprintf)(f, "Available CPUs:\n"); + list =3D get_sorted_cpu_model_list(); + g_slist_foreach(list, x86_cpu_list_entry, &s); + g_slist_free(list); =20 (*cpu_fprintf)(f, "\nRecognized CPUID flags:\n"); for (i =3D 0; i < ARRAY_SIZE(feature_word_info); i++) { @@ -2050,26 +2100,29 @@ void x86_cpu_list(FILE *f, fprintf_function cpu_f= printf) } } =20 -CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp) +static void x86_cpu_definition_entry(gpointer data, gpointer user_data) { - CpuDefinitionInfoList *cpu_list =3D NULL; - X86CPUDefinition *def; - int i; - - for (i =3D 0; i < ARRAY_SIZE(builtin_x86_defs); i++) { - CpuDefinitionInfoList *entry; - CpuDefinitionInfo *info; + ObjectClass *oc =3D data; + X86CPUClass *cc =3D X86_CPU_CLASS(oc); + CpuDefinitionInfoList **cpu_list =3D user_data; + CpuDefinitionInfoList *entry; + CpuDefinitionInfo *info; =20 - def =3D &builtin_x86_defs[i]; - info =3D g_malloc0(sizeof(*info)); - info->name =3D g_strdup(def->name); + info =3D g_malloc0(sizeof(*info)); + info->name =3D x86_cpu_class_get_model_name(cc); =20 - entry =3D g_malloc0(sizeof(*entry)); - entry->value =3D info; - entry->next =3D cpu_list; - cpu_list =3D entry; - } + entry =3D g_malloc0(sizeof(*entry)); + entry->value =3D info; + entry->next =3D *cpu_list; + *cpu_list =3D entry; +} =20 +CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp) +{ + CpuDefinitionInfoList *cpu_list =3D NULL; + GSList *list =3D get_sorted_cpu_model_list(); + g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list); + g_slist_free(list); return cpu_list; } =20 --=20 2.5.5