@@ -157,13 +157,23 @@ static void avr_cpu_initfn(Object *obj)
static ObjectClass *avr_cpu_class_by_name(const char *cpu_model)
{
ObjectClass *oc;
+ char *typename;
oc = object_class_by_name(cpu_model);
- if (object_class_dynamic_cast(oc, TYPE_AVR_CPU) == NULL ||
- object_class_is_abstract(oc)) {
- oc = NULL;
+ if (object_class_dynamic_cast(oc, TYPE_AVR_CPU) &&
+ !object_class_is_abstract(oc)) {
+ return oc;
}
- return oc;
+
+ typename = g_strdup_printf(AVR_CPU_TYPE_NAME("%s"), cpu_model);
+ oc = object_class_by_name(typename);
+ g_free(typename);
+ if (object_class_dynamic_cast(oc, TYPE_AVR_CPU) &&
+ !object_class_is_abstract(oc)) {
+ return oc;
+ }
+
+ return NULL;
}
static void avr_cpu_dump_state(CPUState *cs, FILE *f, int flags)
@@ -366,14 +376,17 @@ typedef struct AVRCPUInfo {
static void avr_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", typename);
+ qemu_printf(" %s\n", model);
+ g_free(model);
}
void avr_cpu_list(void)
{
GSList *list;
list = object_class_get_list_sorted(TYPE_AVR_CPU, false);
+ qemu_printf("Available CPUs:\n");
g_slist_foreach(list, avr_cpu_list_entry, NULL);
g_slist_free(list);
}
For target/avr, the CPU model name is resolved as same to the CPU type name in avr_cpu_class_by_name(). Actually, the CPU model name is the combination of the CPU model name and suffix. Support the resolution from the combination of CPU model name and suffix to the CPU type name in avr_cpu_class_by_name(), and use the generic helper cpu_model_from_type() to show CPU model names in cpu_list(), with adjusted format to match with other targets. Signed-off-by: Gavin Shan <gshan@redhat.com> --- target/avr/cpu.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-)