To cope with upcoming PReP machines and as a first step towards pending qdev'ification of the ppc CPU, move CPU initialization to a helper function, similar to pc_new_cpu().
Cc: Hervé Poussineau <hpous...@reactos.org> Signed-off-by: Andreas Färber <andreas.faer...@web.de> --- hw/ppc_prep.c | 47 +++++++++++++++++++++++++++++++---------------- 1 files changed, 31 insertions(+), 16 deletions(-) diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c index 0e9cfc2..b3efd3c 100644 --- a/hw/ppc_prep.c +++ b/hw/ppc_prep.c @@ -525,6 +525,36 @@ static void cpu_request_exit(void *opaque, int irq, int level) } } +static void prep_cpu_reset(void *opaque) +{ + CPUState *env = opaque; + + cpu_reset(env); +} + +static CPUState *ppc_prep_new_cpu(const char *cpu_model) +{ + CPUState *env; + + env = cpu_init(cpu_model); + if (!env) { + fprintf(stderr, "Unable to find PowerPC CPU definition\n"); + exit(1); + } + if (PPC_INPUT(env) != PPC_FLAGS_INPUT_6xx) { + hw_error("Only 6xx bus is supported on PREP machine\n"); + } + if (env->flags & POWERPC_FLAG_RTC_CLK) { + /* POWER / PowerPC 601 RTC clock frequency is 7.8125 MHz */ + cpu_ppc_tb_init(env, 7812500UL); + } else { + /* Set time-base frequency to 100 Mhz */ + cpu_ppc_tb_init(env, 100UL * 1000UL * 1000UL); + } + qemu_register_reset(prep_cpu_reset, env); + return env; +} + /* PowerPC PREP hardware initialisation */ static void ppc_prep_init (ram_addr_t ram_size, const char *boot_device, @@ -557,19 +587,7 @@ static void ppc_prep_init (ram_addr_t ram_size, if (cpu_model == NULL) cpu_model = "602"; for (i = 0; i < smp_cpus; i++) { - env = cpu_init(cpu_model); - if (!env) { - fprintf(stderr, "Unable to find PowerPC CPU definition\n"); - exit(1); - } - if (env->flags & POWERPC_FLAG_RTC_CLK) { - /* POWER / PowerPC 601 RTC clock frequency is 7.8125 MHz */ - cpu_ppc_tb_init(env, 7812500UL); - } else { - /* Set time-base frequency to 100 Mhz */ - cpu_ppc_tb_init(env, 100UL * 1000UL * 1000UL); - } - qemu_register_reset((QEMUResetHandler*)&cpu_reset, env); + env = ppc_prep_new_cpu(cpu_model); } /* allocate RAM */ @@ -644,9 +662,6 @@ static void ppc_prep_init (ram_addr_t ram_size, } isa_mem_base = 0xc0000000; - if (PPC_INPUT(env) != PPC_FLAGS_INPUT_6xx) { - hw_error("Only 6xx bus is supported on PREP machine\n"); - } i8259 = i8259_init(first_cpu->irq_inputs[PPC6xx_INPUT_INT]); pci_bus = pci_prep_init(i8259); /* Hmm, prep has no pci-isa bridge ??? */ -- 1.7.5.3