Message ID | 20230907003553.1636896-14-gshan@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Unified CPU type check | expand |
On 9/6/23 21:35, Gavin Shan wrote: > 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 typo: "condition" > of "@oc == NULL" to object_class_dynamic_cast(). > > Signed-off-by: Gavin Shan <gshan@redhat.com> > --- Tested with "-cpu help" and "query-cpu-definitions". LGTM Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.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);
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);
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 <gshan@redhat.com> --- target/riscv/cpu.c | 23 +++++++++++++---------- target/riscv/riscv-qmp-cmds.c | 3 +-- 2 files changed, 14 insertions(+), 12 deletions(-)