Commit 666713c0711abbc591a867b5ff31fbc6ba53bf28
1 parent
a350db85
Sparc32: refactor CPU init
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
1 changed file
with
30 additions
and
45 deletions
hw/sun4m.c
| @@ -530,14 +530,37 @@ static void ram_register_devices(void) | @@ -530,14 +530,37 @@ static void ram_register_devices(void) | ||
| 530 | 530 | ||
| 531 | device_init(ram_register_devices); | 531 | device_init(ram_register_devices); |
| 532 | 532 | ||
| 533 | +static CPUState *cpu_devinit(const char *cpu_model, unsigned int id, | ||
| 534 | + uint64_t prom_addr, qemu_irq **cpu_irqs) | ||
| 535 | +{ | ||
| 536 | + CPUState *env; | ||
| 537 | + | ||
| 538 | + env = cpu_init(cpu_model); | ||
| 539 | + if (!env) { | ||
| 540 | + fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n"); | ||
| 541 | + exit(1); | ||
| 542 | + } | ||
| 543 | + | ||
| 544 | + cpu_sparc_set_id(env, id); | ||
| 545 | + if (id == 0) { | ||
| 546 | + qemu_register_reset(main_cpu_reset, env); | ||
| 547 | + } else { | ||
| 548 | + qemu_register_reset(secondary_cpu_reset, env); | ||
| 549 | + env->halted = 1; | ||
| 550 | + } | ||
| 551 | + *cpu_irqs = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS); | ||
| 552 | + env->prom_addr = prom_addr; | ||
| 553 | + | ||
| 554 | + return env; | ||
| 555 | +} | ||
| 556 | + | ||
| 533 | static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | 557 | static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, |
| 534 | const char *boot_device, | 558 | const char *boot_device, |
| 535 | const char *kernel_filename, | 559 | const char *kernel_filename, |
| 536 | const char *kernel_cmdline, | 560 | const char *kernel_cmdline, |
| 537 | const char *initrd_filename, const char *cpu_model) | 561 | const char *initrd_filename, const char *cpu_model) |
| 538 | - | ||
| 539 | { | 562 | { |
| 540 | - CPUState *env, *envs[MAX_CPUS]; | 563 | + CPUState *envs[MAX_CPUS]; |
| 541 | unsigned int i; | 564 | unsigned int i; |
| 542 | void *iommu, *espdma, *ledma, *nvram; | 565 | void *iommu, *espdma, *ledma, *nvram; |
| 543 | qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq, | 566 | qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq, |
| @@ -555,21 +578,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | @@ -555,21 +578,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 555 | cpu_model = hwdef->default_cpu_model; | 578 | cpu_model = hwdef->default_cpu_model; |
| 556 | 579 | ||
| 557 | for(i = 0; i < smp_cpus; i++) { | 580 | for(i = 0; i < smp_cpus; i++) { |
| 558 | - env = cpu_init(cpu_model); | ||
| 559 | - if (!env) { | ||
| 560 | - fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n"); | ||
| 561 | - exit(1); | ||
| 562 | - } | ||
| 563 | - cpu_sparc_set_id(env, i); | ||
| 564 | - envs[i] = env; | ||
| 565 | - if (i == 0) { | ||
| 566 | - qemu_register_reset(main_cpu_reset, env); | ||
| 567 | - } else { | ||
| 568 | - qemu_register_reset(secondary_cpu_reset, env); | ||
| 569 | - env->halted = 1; | ||
| 570 | - } | ||
| 571 | - cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS); | ||
| 572 | - env->prom_addr = hwdef->slavio_base; | 581 | + envs[i] = cpu_devinit(cpu_model, i, hwdef->slavio_base, &cpu_irqs[i]); |
| 573 | } | 582 | } |
| 574 | 583 | ||
| 575 | for (i = smp_cpus; i < MAX_CPUS; i++) | 584 | for (i = smp_cpus; i < MAX_CPUS; i++) |
| @@ -1293,7 +1302,7 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, | @@ -1293,7 +1302,7 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 1293 | const char *kernel_cmdline, | 1302 | const char *kernel_cmdline, |
| 1294 | const char *initrd_filename, const char *cpu_model) | 1303 | const char *initrd_filename, const char *cpu_model) |
| 1295 | { | 1304 | { |
| 1296 | - CPUState *env, *envs[MAX_CPUS]; | 1305 | + CPUState *envs[MAX_CPUS]; |
| 1297 | unsigned int i; | 1306 | unsigned int i; |
| 1298 | void *iounits[MAX_IOUNITS], *espdma, *ledma, *nvram, *sbi; | 1307 | void *iounits[MAX_IOUNITS], *espdma, *ledma, *nvram, *sbi; |
| 1299 | qemu_irq *cpu_irqs[MAX_CPUS], *sbi_irq, *sbi_cpu_irq, | 1308 | qemu_irq *cpu_irqs[MAX_CPUS], *sbi_irq, *sbi_cpu_irq, |
| @@ -1306,22 +1315,8 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, | @@ -1306,22 +1315,8 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 1306 | if (!cpu_model) | 1315 | if (!cpu_model) |
| 1307 | cpu_model = hwdef->default_cpu_model; | 1316 | cpu_model = hwdef->default_cpu_model; |
| 1308 | 1317 | ||
| 1309 | - for (i = 0; i < smp_cpus; i++) { | ||
| 1310 | - env = cpu_init(cpu_model); | ||
| 1311 | - if (!env) { | ||
| 1312 | - fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n"); | ||
| 1313 | - exit(1); | ||
| 1314 | - } | ||
| 1315 | - cpu_sparc_set_id(env, i); | ||
| 1316 | - envs[i] = env; | ||
| 1317 | - if (i == 0) { | ||
| 1318 | - qemu_register_reset(main_cpu_reset, env); | ||
| 1319 | - } else { | ||
| 1320 | - qemu_register_reset(secondary_cpu_reset, env); | ||
| 1321 | - env->halted = 1; | ||
| 1322 | - } | ||
| 1323 | - cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS); | ||
| 1324 | - env->prom_addr = hwdef->slavio_base; | 1318 | + for(i = 0; i < smp_cpus; i++) { |
| 1319 | + envs[i] = cpu_devinit(cpu_model, i, hwdef->slavio_base, &cpu_irqs[i]); | ||
| 1325 | } | 1320 | } |
| 1326 | 1321 | ||
| 1327 | for (i = smp_cpus; i < MAX_CPUS; i++) | 1322 | for (i = smp_cpus; i < MAX_CPUS; i++) |
| @@ -1493,17 +1488,7 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, | @@ -1493,17 +1488,7 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 1493 | if (!cpu_model) | 1488 | if (!cpu_model) |
| 1494 | cpu_model = hwdef->default_cpu_model; | 1489 | cpu_model = hwdef->default_cpu_model; |
| 1495 | 1490 | ||
| 1496 | - env = cpu_init(cpu_model); | ||
| 1497 | - if (!env) { | ||
| 1498 | - fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n"); | ||
| 1499 | - exit(1); | ||
| 1500 | - } | ||
| 1501 | - | ||
| 1502 | - cpu_sparc_set_id(env, 0); | ||
| 1503 | - | ||
| 1504 | - qemu_register_reset(main_cpu_reset, env); | ||
| 1505 | - cpu_irqs = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS); | ||
| 1506 | - env->prom_addr = hwdef->slavio_base; | 1491 | + env = cpu_devinit(cpu_model, 0, hwdef->slavio_base, &cpu_irqs); |
| 1507 | 1492 | ||
| 1508 | /* set up devices */ | 1493 | /* set up devices */ |
| 1509 | ram_init(0, RAM_size, hwdef->max_mem); | 1494 | ram_init(0, RAM_size, hwdef->max_mem); |