diff options
author | Andreas Färber <afaerber@suse.de> | 2013-01-05 15:15:30 +0100 |
---|---|---|
committer | Andreas Färber <afaerber@suse.de> | 2013-02-16 14:50:57 +0100 |
commit | 6d1bbc6273d45520c5ce6475186bfa30d8afb47c (patch) | |
tree | 94cbc3b1f80f3e9d01eff253ce922b494907c61a | |
parent | 9c23169e8cd54b490d55221b6498d42966f964f3 (diff) |
target-m68k: Introduce QOM realizefn for M68kCPU
Introduce realizefn and set realized = true in cpu_m68k_init().
Split off GDB registration to a new m68k_cpu_init_gdb() so that it can
be called from the realizefn.
Signed-off-by: Andreas Färber <afaerber@suse.de>
-rw-r--r-- | target-m68k/cpu-qom.h | 2 | ||||
-rw-r--r-- | target-m68k/cpu.c | 16 | ||||
-rw-r--r-- | target-m68k/cpu.h | 1 | ||||
-rw-r--r-- | target-m68k/helper.c | 14 |
4 files changed, 29 insertions, 4 deletions
diff --git a/target-m68k/cpu-qom.h b/target-m68k/cpu-qom.h index 170daa7c96..20e5684552 100644 --- a/target-m68k/cpu-qom.h +++ b/target-m68k/cpu-qom.h @@ -33,6 +33,7 @@ /** * M68kCPUClass: + * @parent_realize: The parent class' realize handler. * @parent_reset: The parent class' reset handler. * * A Motorola 68k CPU model. @@ -42,6 +43,7 @@ typedef struct M68kCPUClass { CPUClass parent_class; /*< public >*/ + DeviceRealize parent_realize; void (*parent_reset)(CPUState *cpu); } M68kCPUClass; diff --git a/target-m68k/cpu.c b/target-m68k/cpu.c index c71f715174..e3eaffc9ed 100644 --- a/target-m68k/cpu.c +++ b/target-m68k/cpu.c @@ -139,6 +139,19 @@ static const M68kCPUInfo m68k_cpus[] = { { .name = "any", .instance_init = any_cpu_initfn }, }; +static void m68k_cpu_realizefn(DeviceState *dev, Error **errp) +{ + M68kCPU *cpu = M68K_CPU(dev); + M68kCPUClass *mcc = M68K_CPU_GET_CLASS(dev); + + m68k_cpu_init_gdb(cpu); + + cpu_reset(CPU(cpu)); + qemu_init_vcpu(&cpu->env); + + mcc->parent_realize(dev, errp); +} + static void m68k_cpu_initfn(Object *obj) { M68kCPU *cpu = M68K_CPU(obj); @@ -158,6 +171,9 @@ static void m68k_cpu_class_init(ObjectClass *c, void *data) CPUClass *cc = CPU_CLASS(c); DeviceClass *dc = DEVICE_CLASS(c); + mcc->parent_realize = dc->realize; + dc->realize = m68k_cpu_realizefn; + mcc->parent_reset = cc->reset; cc->reset = m68k_cpu_reset; diff --git a/target-m68k/cpu.h b/target-m68k/cpu.h index adaf56c471..94937c4fd7 100644 --- a/target-m68k/cpu.h +++ b/target-m68k/cpu.h @@ -116,6 +116,7 @@ typedef struct CPUM68KState { #include "cpu-qom.h" void m68k_tcg_init(void); +void m68k_cpu_init_gdb(M68kCPU *cpu); CPUM68KState *cpu_m68k_init(const char *cpu_model); int cpu_m68k_exec(CPUM68KState *s); void do_interrupt(CPUM68KState *env1); diff --git a/target-m68k/helper.c b/target-m68k/helper.c index 5ddcd707fd..3ae6fa0492 100644 --- a/target-m68k/helper.c +++ b/target-m68k/helper.c @@ -120,15 +120,21 @@ CPUM68KState *cpu_m68k_init(const char *cpu_model) env->cpu_model_str = cpu_model; register_m68k_insns(env); + + object_property_set_bool(OBJECT(cpu), true, "realized", NULL); + + return env; +} + +void m68k_cpu_init_gdb(M68kCPU *cpu) +{ + CPUM68KState *env = &cpu->env; + if (m68k_feature(env, M68K_FEATURE_CF_FPU)) { gdb_register_coprocessor(env, fpu_gdb_get_reg, fpu_gdb_set_reg, 11, "cf-fp.xml", 18); } /* TODO: Add [E]MAC registers. */ - - cpu_reset(ENV_GET_CPU(env)); - qemu_init_vcpu(env); - return env; } void cpu_m68k_flush_flags(CPUM68KState *env, int cc_op) |