For target/riscv, the CPU type name is always the combination of the CPU model name and suffix. The CPU model names have been correctly shown in riscv_cpu_list_entry() and riscv_cpu_add_definition()
Use generic helper cpu_mdoel_from_type() to show the CPU model names in the above two functions, and adjusted format of the output from riscv_cpu_list_entry() to match with other targets. Besides, the function riscv_cpu_class_by_name() is improved by renaming @cpuname to @model since it's for the CPU model name, and merging the condtion of "@oc == NULL" to object_class_dynamic_cast(). Signed-off-by: Gavin Shan <gs...@redhat.com> --- target/riscv/cpu.c | 23 +++++++++++++---------- target/riscv/riscv-qmp-cmds.c | 3 +-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 6b93b04453..a525e24c5a 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -612,18 +612,19 @@ static ObjectClass *riscv_cpu_class_by_name(const char *cpu_model) { ObjectClass *oc; char *typename; - char **cpuname; + char **model; - cpuname = g_strsplit(cpu_model, ",", 1); - typename = g_strdup_printf(RISCV_CPU_TYPE_NAME("%s"), cpuname[0]); + model = g_strsplit(cpu_model, ",", 1); + typename = g_strdup_printf(RISCV_CPU_TYPE_NAME("%s"), model[0]); oc = object_class_by_name(typename); - g_strfreev(cpuname); + g_strfreev(model); g_free(typename); - if (!oc || !object_class_dynamic_cast(oc, TYPE_RISCV_CPU) || - object_class_is_abstract(oc)) { - return NULL; + if (object_class_dynamic_cast(oc, TYPE_RISCV_CPU) && + !object_class_is_abstract(oc)) { + return oc; } - return oc; + + return NULL; } static void riscv_cpu_dump_state(CPUState *cs, FILE *f, int flags) @@ -2211,9 +2212,10 @@ static gint riscv_cpu_list_compare(gconstpointer a, gconstpointer b) static void riscv_cpu_list_entry(gpointer data, gpointer user_data) { const char *typename = object_class_get_name(OBJECT_CLASS(data)); - int len = strlen(typename) - strlen(RISCV_CPU_TYPE_SUFFIX); + char *model = cpu_model_from_type(typename); - qemu_printf("%.*s\n", len, typename); + qemu_printf(" %s\n", model); + g_free(model); } void riscv_cpu_list(void) @@ -2222,6 +2224,7 @@ void riscv_cpu_list(void) list = object_class_get_list(TYPE_RISCV_CPU, false); list = g_slist_sort(list, riscv_cpu_list_compare); + qemu_printf("Available CPUs:\n"); g_slist_foreach(list, riscv_cpu_list_entry, NULL); g_slist_free(list); } diff --git a/target/riscv/riscv-qmp-cmds.c b/target/riscv/riscv-qmp-cmds.c index 5ecff1afb3..22f728673f 100644 --- a/target/riscv/riscv-qmp-cmds.c +++ b/target/riscv/riscv-qmp-cmds.c @@ -35,8 +35,7 @@ static void riscv_cpu_add_definition(gpointer data, gpointer user_data) const char *typename = object_class_get_name(oc); ObjectClass *dyn_class; - info->name = g_strndup(typename, - strlen(typename) - strlen("-" TYPE_RISCV_CPU)); + info->name = cpu_model_from_type(typename); info->q_typename = g_strdup(typename); dyn_class = object_class_dynamic_cast(oc, TYPE_RISCV_DYNAMIC_CPU); -- 2.41.0