diff options
author | Andreas Färber <afaerber@suse.de> | 2013-01-23 11:17:14 +0100 |
---|---|---|
committer | Andreas Färber <afaerber@suse.de> | 2013-01-27 14:52:05 +0100 |
commit | bd039ce0094f3724a87a193c846ee8468ce652b0 (patch) | |
tree | 4ab008106e68fb70734fedd2a0e5a7961be63c1d /target-openrisc/cpu.c | |
parent | bc5b2da32ba54d991e8669b14a771afb3a67f408 (diff) |
target-openrisc: Detect attempt to instantiate non-CPU type in cpu_init()
Consolidate model checking into a new openrisc_cpu_class_by_name().
If the name matches an existing type, also check whether that type is
actually (a sub-type of) TYPE_OPENRISC_CPU.
This fixes, e.g., -cpu open_eth asserting.
Cc: qemu-stable@nongnu.org
Signed-off-by: Andreas Färber <afaerber@suse.de>
Diffstat (limited to 'target-openrisc/cpu.c')
-rw-r--r-- | target-openrisc/cpu.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/target-openrisc/cpu.c b/target-openrisc/cpu.c index 7a55112bf1..e23100fa09 100644 --- a/target-openrisc/cpu.c +++ b/target-openrisc/cpu.c @@ -88,6 +88,22 @@ static void openrisc_cpu_initfn(Object *obj) } /* CPU models */ + +static ObjectClass *openrisc_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_OPENRISC_CPU)) { + return NULL; + } + return oc; +} + static void or1200_initfn(Object *obj) { OpenRISCCPU *cpu = OPENRISC_CPU(obj); @@ -120,6 +136,8 @@ static void openrisc_cpu_class_init(ObjectClass *oc, void *data) occ->parent_reset = cc->reset; cc->reset = openrisc_cpu_reset; + + cc->class_by_name = openrisc_cpu_class_by_name; } static void cpu_register(const OpenRISCCPUInfo *info) @@ -158,11 +176,13 @@ static void openrisc_cpu_register_types(void) OpenRISCCPU *cpu_openrisc_init(const char *cpu_model) { OpenRISCCPU *cpu; + ObjectClass *oc; - if (!object_class_by_name(cpu_model)) { + oc = openrisc_cpu_class_by_name(cpu_model); + if (oc == NULL) { return NULL; } - cpu = OPENRISC_CPU(object_new(cpu_model)); + cpu = OPENRISC_CPU(object_new(object_class_get_name(oc))); cpu->env.cpu_model_str = cpu_model; openrisc_cpu_realize(OBJECT(cpu), NULL); |