Commit fe33cc710327455a55bd4f44bc7aa69661cc7878
1 parent
00af685f
Fix PowerPC initialisation and first reset:
reset must occur after we defined the CPU features. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3317 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
20 additions
and
12 deletions
hw/ppc_chrp.c
| @@ -327,9 +327,6 @@ static void ppc_chrp_init (int ram_size, int vga_ram_size, int boot_device, | @@ -327,9 +327,6 @@ static void ppc_chrp_init (int ram_size, int vga_ram_size, int boot_device, | ||
| 327 | 327 | ||
| 328 | /* init CPUs */ | 328 | /* init CPUs */ |
| 329 | env = cpu_init(); | 329 | env = cpu_init(); |
| 330 | - qemu_register_reset(&cpu_ppc_reset, env); | ||
| 331 | - register_savevm("cpu", 0, 3, cpu_save, cpu_load, env); | ||
| 332 | - | ||
| 333 | if (cpu_model == NULL) | 330 | if (cpu_model == NULL) |
| 334 | cpu_model = "default"; | 331 | cpu_model = "default"; |
| 335 | ppc_find_by_name(cpu_model, &def); | 332 | ppc_find_by_name(cpu_model, &def); |
| @@ -338,9 +335,12 @@ static void ppc_chrp_init (int ram_size, int vga_ram_size, int boot_device, | @@ -338,9 +335,12 @@ static void ppc_chrp_init (int ram_size, int vga_ram_size, int boot_device, | ||
| 338 | } | 335 | } |
| 339 | for (i = 0; i < smp_cpus; i++) { | 336 | for (i = 0; i < smp_cpus; i++) { |
| 340 | cpu_ppc_register(env, def); | 337 | cpu_ppc_register(env, def); |
| 338 | + cpu_ppc_reset(env); | ||
| 341 | /* Set time-base frequency to 100 Mhz */ | 339 | /* Set time-base frequency to 100 Mhz */ |
| 342 | cpu_ppc_tb_init(env, 100UL * 1000UL * 1000UL); | 340 | cpu_ppc_tb_init(env, 100UL * 1000UL * 1000UL); |
| 343 | env->osi_call = vga_osi_call; | 341 | env->osi_call = vga_osi_call; |
| 342 | + qemu_register_reset(&cpu_ppc_reset, env); | ||
| 343 | + register_savevm("cpu", 0, 3, cpu_save, cpu_load, env); | ||
| 344 | envs[i] = env; | 344 | envs[i] = env; |
| 345 | } | 345 | } |
| 346 | 346 |
hw/ppc_prep.c
| @@ -26,6 +26,9 @@ | @@ -26,6 +26,9 @@ | ||
| 26 | //#define HARD_DEBUG_PPC_IO | 26 | //#define HARD_DEBUG_PPC_IO |
| 27 | //#define DEBUG_PPC_IO | 27 | //#define DEBUG_PPC_IO |
| 28 | 28 | ||
| 29 | +/* SMP is not enabled, for now */ | ||
| 30 | +#define MAX_CPUS 1 | ||
| 31 | + | ||
| 29 | #define BIOS_FILENAME "ppc_rom.bin" | 32 | #define BIOS_FILENAME "ppc_rom.bin" |
| 30 | #define KERNEL_LOAD_ADDR 0x01000000 | 33 | #define KERNEL_LOAD_ADDR 0x01000000 |
| 31 | #define INITRD_LOAD_ADDR 0x01800000 | 34 | #define INITRD_LOAD_ADDR 0x01800000 |
| @@ -521,7 +524,7 @@ static void ppc_prep_init (int ram_size, int vga_ram_size, int boot_device, | @@ -521,7 +524,7 @@ static void ppc_prep_init (int ram_size, int vga_ram_size, int boot_device, | ||
| 521 | const char *initrd_filename, | 524 | const char *initrd_filename, |
| 522 | const char *cpu_model) | 525 | const char *cpu_model) |
| 523 | { | 526 | { |
| 524 | - CPUState *env; | 527 | + CPUState *env, *envs[MAX_CPUS]; |
| 525 | char buf[1024]; | 528 | char buf[1024]; |
| 526 | m48t59_t *nvram; | 529 | m48t59_t *nvram; |
| 527 | int PPC_io_memory; | 530 | int PPC_io_memory; |
| @@ -539,20 +542,22 @@ static void ppc_prep_init (int ram_size, int vga_ram_size, int boot_device, | @@ -539,20 +542,22 @@ static void ppc_prep_init (int ram_size, int vga_ram_size, int boot_device, | ||
| 539 | linux_boot = (kernel_filename != NULL); | 542 | linux_boot = (kernel_filename != NULL); |
| 540 | 543 | ||
| 541 | /* init CPUs */ | 544 | /* init CPUs */ |
| 542 | - | ||
| 543 | env = cpu_init(); | 545 | env = cpu_init(); |
| 544 | - qemu_register_reset(&cpu_ppc_reset, env); | ||
| 545 | - register_savevm("cpu", 0, 3, cpu_save, cpu_load, env); | ||
| 546 | - | ||
| 547 | if (cpu_model == NULL) | 546 | if (cpu_model == NULL) |
| 548 | cpu_model = "default"; | 547 | cpu_model = "default"; |
| 549 | ppc_find_by_name(cpu_model, &def); | 548 | ppc_find_by_name(cpu_model, &def); |
| 550 | if (def == NULL) { | 549 | if (def == NULL) { |
| 551 | cpu_abort(env, "Unable to find PowerPC CPU definition\n"); | 550 | cpu_abort(env, "Unable to find PowerPC CPU definition\n"); |
| 552 | } | 551 | } |
| 553 | - cpu_ppc_register(env, def); | ||
| 554 | - /* Set time-base frequency to 100 Mhz */ | ||
| 555 | - cpu_ppc_tb_init(env, 100UL * 1000UL * 1000UL); | 552 | + for (i = 0; i < smp_cpus; i++) { |
| 553 | + cpu_ppc_register(env, def); | ||
| 554 | + cpu_ppc_reset(env); | ||
| 555 | + /* Set time-base frequency to 100 Mhz */ | ||
| 556 | + cpu_ppc_tb_init(env, 100UL * 1000UL * 1000UL); | ||
| 557 | + qemu_register_reset(&cpu_ppc_reset, env); | ||
| 558 | + register_savevm("cpu", 0, 3, cpu_save, cpu_load, env); | ||
| 559 | + envs[i] = env; | ||
| 560 | + } | ||
| 556 | 561 | ||
| 557 | /* allocate RAM */ | 562 | /* allocate RAM */ |
| 558 | cpu_register_physical_memory(0, ram_size, IO_MEM_RAM); | 563 | cpu_register_physical_memory(0, ram_size, IO_MEM_RAM); |
target-ppc/helper.c
| @@ -2789,7 +2789,11 @@ void cpu_ppc_reset (void *opaque) | @@ -2789,7 +2789,11 @@ void cpu_ppc_reset (void *opaque) | ||
| 2789 | msr_fp = 1; /* Allow floating point exceptions */ | 2789 | msr_fp = 1; /* Allow floating point exceptions */ |
| 2790 | msr_pr = 1; | 2790 | msr_pr = 1; |
| 2791 | #else | 2791 | #else |
| 2792 | +#if defined(TARGET_PPC64) | ||
| 2793 | + env->nip = 0x00000100; | ||
| 2794 | +#else | ||
| 2792 | env->nip = 0xFFFFFFFC; | 2795 | env->nip = 0xFFFFFFFC; |
| 2796 | +#endif | ||
| 2793 | ppc_tlb_invalidate_all(env); | 2797 | ppc_tlb_invalidate_all(env); |
| 2794 | #endif | 2798 | #endif |
| 2795 | do_compute_hflags(env); | 2799 | do_compute_hflags(env); |
| @@ -2810,7 +2814,6 @@ CPUPPCState *cpu_ppc_init (void) | @@ -2810,7 +2814,6 @@ CPUPPCState *cpu_ppc_init (void) | ||
| 2810 | if (!env) | 2814 | if (!env) |
| 2811 | return NULL; | 2815 | return NULL; |
| 2812 | cpu_exec_init(env); | 2816 | cpu_exec_init(env); |
| 2813 | - cpu_ppc_reset(env); | ||
| 2814 | 2817 | ||
| 2815 | return env; | 2818 | return env; |
| 2816 | } | 2819 | } |