For target/mips, the CPU type name is always the combination of the CPU model name and suffix. The CPU model names have been shown correctly in mips_cpu_list(), which fetches the CPU model names from the pre-defined array. It's different from other targets and lack of flexibility.
Implement mips_cpu_list() by fetching the CPU model names from the available CPU classes. Besides, the retrieved class needs to be validated before it's returned in mips_cpu_class_by_name(), as other targets do. Signed-off-by: Gavin Shan <gs...@redhat.com> --- target/mips/cpu-defs.c.inc | 9 --------- target/mips/cpu.c | 25 ++++++++++++++++++++++++- target/mips/sysemu/mips-qmp-cmds.c | 3 +-- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/target/mips/cpu-defs.c.inc b/target/mips/cpu-defs.c.inc index c0c389c59a..fbf787d8ce 100644 --- a/target/mips/cpu-defs.c.inc +++ b/target/mips/cpu-defs.c.inc @@ -1018,15 +1018,6 @@ const mips_def_t mips_defs[] = }; const int mips_defs_number = ARRAY_SIZE(mips_defs); -void mips_cpu_list(void) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(mips_defs); i++) { - qemu_printf("MIPS '%s'\n", mips_defs[i].name); - } -} - static void fpu_init (CPUMIPSState *env, const mips_def_t *def) { int i; diff --git a/target/mips/cpu.c b/target/mips/cpu.c index 63da1948fd..3431acbd99 100644 --- a/target/mips/cpu.c +++ b/target/mips/cpu.c @@ -532,7 +532,12 @@ static ObjectClass *mips_cpu_class_by_name(const char *cpu_model) typename = mips_cpu_type_name(cpu_model); oc = object_class_by_name(typename); g_free(typename); - return oc; + if (object_class_dynamic_cast(oc, TYPE_MIPS_CPU) && + !object_class_is_abstract(oc)) { + return oc; + } + + return NULL; } #ifndef CONFIG_USER_ONLY @@ -566,6 +571,24 @@ static const struct TCGCPUOps mips_tcg_ops = { }; #endif /* CONFIG_TCG */ +static void mips_cpu_list_entry(gpointer data, gpointer user_data) +{ + const char *typename = object_class_get_name(OBJECT_CLASS(data)); + char *model = cpu_model_from_type(typename); + + qemu_printf(" %s\n", model); + g_free(model); +} + +void mips_cpu_list(void) +{ + GSList *list; + list = object_class_get_list_sorted(TYPE_MIPS_CPU, false); + qemu_printf("Available CPUs:\n"); + g_slist_foreach(list, mips_cpu_list_entry, NULL); + g_slist_free(list); +} + static void mips_cpu_class_init(ObjectClass *c, void *data) { MIPSCPUClass *mcc = MIPS_CPU_CLASS(c); diff --git a/target/mips/sysemu/mips-qmp-cmds.c b/target/mips/sysemu/mips-qmp-cmds.c index 6db4626412..7340ac70ba 100644 --- a/target/mips/sysemu/mips-qmp-cmds.c +++ b/target/mips/sysemu/mips-qmp-cmds.c @@ -19,8 +19,7 @@ static void mips_cpu_add_definition(gpointer data, gpointer user_data) typename = object_class_get_name(oc); info = g_malloc0(sizeof(*info)); - info->name = g_strndup(typename, - strlen(typename) - strlen("-" TYPE_MIPS_CPU)); + info->name = cpu_model_from_type(typename); info->q_typename = g_strdup(typename); QAPI_LIST_PREPEND(*cpu_list, info); -- 2.41.0