diff options
author | Andreas Färber <afaerber@suse.de> | 2013-01-23 12:07:17 +0100 |
---|---|---|
committer | Andreas Färber <afaerber@suse.de> | 2013-01-27 23:33:25 +0100 |
commit | d89e12188d50f7f8a894027789f32fa7ba6226ad (patch) | |
tree | e10fc11fa7f82fc4c85dfba0ef4426f292df5542 | |
parent | bd039ce0094f3724a87a193c846ee8468ce652b0 (diff) | |
download | qemu-d89e12188d50f7f8a894027789f32fa7ba6226ad.tar.gz qemu-d89e12188d50f7f8a894027789f32fa7ba6226ad.tar.bz2 qemu-d89e12188d50f7f8a894027789f32fa7ba6226ad.zip |
target-unicore32: Detect attempt to instantiate non-CPU type in cpu_init()
Consolidate model checking into a new uc32_cpu_class_by_name().
If the name matches an existing type, also check whether that type is
actually (a sub-type of) TYPE_UNICORE32_CPU.
This fixes, e.g., -cpu puv3_dma asserting.
Cc: qemu-stable@nongnu.org
Signed-off-by: Andreas Färber <afaerber@suse.de>
-rw-r--r-- | target-unicore32/cpu.c | 23 | ||||
-rw-r--r-- | target-unicore32/helper.c | 6 |
2 files changed, 27 insertions, 2 deletions
diff --git a/target-unicore32/cpu.c b/target-unicore32/cpu.c index 884c101010..9239d49511 100644 --- a/target-unicore32/cpu.c +++ b/target-unicore32/cpu.c @@ -22,6 +22,21 @@ static inline void set_feature(CPUUniCore32State *env, int feature) /* CPU models */ +static ObjectClass *uc32_cpu_class_by_name(const char *cpu_model) +{ + ObjectClass *oc; + + if (cpu_model == NULL) { + return NULL; + } + + oc = object_class_by_name(cpu_model); + if (oc != NULL && !object_class_dynamic_cast(oc, TYPE_UNICORE32_CPU)) { + oc = NULL; + } + return oc; +} + typedef struct UniCore32CPUInfo { const char *name; void (*instance_init)(Object *obj); @@ -80,6 +95,13 @@ static void uc32_cpu_initfn(Object *obj) tlb_flush(env, 1); } +static void uc32_cpu_class_init(ObjectClass *oc, void *data) +{ + CPUClass *cc = CPU_CLASS(oc); + + cc->class_by_name = uc32_cpu_class_by_name; +} + static void uc32_register_cpu_type(const UniCore32CPUInfo *info) { TypeInfo type_info = { @@ -98,6 +120,7 @@ static const TypeInfo uc32_cpu_type_info = { .instance_init = uc32_cpu_initfn, .abstract = true, .class_size = sizeof(UniCore32CPUClass), + .class_init = uc32_cpu_class_init, }; static void uc32_cpu_register_types(void) diff --git a/target-unicore32/helper.c b/target-unicore32/helper.c index 5359538ea5..183b5b3577 100644 --- a/target-unicore32/helper.c +++ b/target-unicore32/helper.c @@ -29,12 +29,14 @@ CPUUniCore32State *uc32_cpu_init(const char *cpu_model) { UniCore32CPU *cpu; CPUUniCore32State *env; + ObjectClass *oc; static int inited = 1; - if (object_class_by_name(cpu_model) == NULL) { + oc = cpu_class_by_name(TYPE_UNICORE32_CPU, cpu_model); + if (oc == NULL) { return NULL; } - cpu = UNICORE32_CPU(object_new(cpu_model)); + cpu = UNICORE32_CPU(object_new(object_class_get_name(oc))); env = &cpu->env; if (inited) { |