Commit eddf68a6ac4b5ca6eb1efbb69e50d04878a87aa5
1 parent
7a3148a9
Integrate Alpha target in Qemu core.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2601 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
8 changed files
with
92 additions
and
1 deletions
cpu-all.h
| @@ -748,6 +748,13 @@ void page_unprotect_range(target_ulong data, target_ulong data_size); | @@ -748,6 +748,13 @@ void page_unprotect_range(target_ulong data, target_ulong data_size); | ||
| 748 | #define cpu_gen_code cpu_sh4_gen_code | 748 | #define cpu_gen_code cpu_sh4_gen_code |
| 749 | #define cpu_signal_handler cpu_sh4_signal_handler | 749 | #define cpu_signal_handler cpu_sh4_signal_handler |
| 750 | 750 | ||
| 751 | +#elif defined(TARGET_ALPHA) | ||
| 752 | +#define CPUState CPUAlphaState | ||
| 753 | +#define cpu_init cpu_alpha_init | ||
| 754 | +#define cpu_exec cpu_alpha_exec | ||
| 755 | +#define cpu_gen_code cpu_alpha_gen_code | ||
| 756 | +#define cpu_signal_handler cpu_alpha_signal_handler | ||
| 757 | + | ||
| 751 | #else | 758 | #else |
| 752 | 759 | ||
| 753 | #error unsupported target CPU | 760 | #error unsupported target CPU |
cpu-exec.c
| @@ -40,7 +40,8 @@ int tb_invalidated_flag; | @@ -40,7 +40,8 @@ int tb_invalidated_flag; | ||
| 40 | //#define DEBUG_EXEC | 40 | //#define DEBUG_EXEC |
| 41 | //#define DEBUG_SIGNAL | 41 | //#define DEBUG_SIGNAL |
| 42 | 42 | ||
| 43 | -#if defined(TARGET_ARM) || defined(TARGET_SPARC) || defined(TARGET_M68K) | 43 | +#if defined(TARGET_ARM) || defined(TARGET_SPARC) || defined(TARGET_M68K) || \ |
| 44 | + defined(TARGET_ALPHA) | ||
| 44 | /* XXX: unify with i386 target */ | 45 | /* XXX: unify with i386 target */ |
| 45 | void cpu_loop_exit(void) | 46 | void cpu_loop_exit(void) |
| 46 | { | 47 | { |
| @@ -202,6 +203,10 @@ static inline TranslationBlock *tb_find_fast(void) | @@ -202,6 +203,10 @@ static inline TranslationBlock *tb_find_fast(void) | ||
| 202 | flags = env->sr & (SR_MD | SR_RB); | 203 | flags = env->sr & (SR_MD | SR_RB); |
| 203 | cs_base = 0; /* XXXXX */ | 204 | cs_base = 0; /* XXXXX */ |
| 204 | pc = env->pc; | 205 | pc = env->pc; |
| 206 | +#elif defined(TARGET_ALPHA) | ||
| 207 | + flags = env->ps; | ||
| 208 | + cs_base = 0; | ||
| 209 | + pc = env->pc; | ||
| 205 | #else | 210 | #else |
| 206 | #error unsupported CPU | 211 | #error unsupported CPU |
| 207 | #endif | 212 | #endif |
| @@ -291,6 +296,14 @@ int cpu_exec(CPUState *env1) | @@ -291,6 +296,14 @@ int cpu_exec(CPUState *env1) | ||
| 291 | return EXCP_HALTED; | 296 | return EXCP_HALTED; |
| 292 | } | 297 | } |
| 293 | } | 298 | } |
| 299 | +#elif defined(TARGET_ALPHA) | ||
| 300 | + if (env1->halted) { | ||
| 301 | + if (env1->interrupt_request & CPU_INTERRUPT_HARD) { | ||
| 302 | + env1->halted = 0; | ||
| 303 | + } else { | ||
| 304 | + return EXCP_HALTED; | ||
| 305 | + } | ||
| 306 | + } | ||
| 294 | #endif | 307 | #endif |
| 295 | 308 | ||
| 296 | cpu_single_env = env1; | 309 | cpu_single_env = env1; |
| @@ -324,6 +337,8 @@ int cpu_exec(CPUState *env1) | @@ -324,6 +337,8 @@ int cpu_exec(CPUState *env1) | ||
| 324 | #elif defined(TARGET_MIPS) | 337 | #elif defined(TARGET_MIPS) |
| 325 | #elif defined(TARGET_SH4) | 338 | #elif defined(TARGET_SH4) |
| 326 | /* XXXXX */ | 339 | /* XXXXX */ |
| 340 | +#elif defined(TARGET_ALPHA) | ||
| 341 | + env_to_regs(); | ||
| 327 | #else | 342 | #else |
| 328 | #error unsupported target CPU | 343 | #error unsupported target CPU |
| 329 | #endif | 344 | #endif |
| @@ -372,6 +387,8 @@ int cpu_exec(CPUState *env1) | @@ -372,6 +387,8 @@ int cpu_exec(CPUState *env1) | ||
| 372 | do_interrupt(env); | 387 | do_interrupt(env); |
| 373 | #elif defined(TARGET_SH4) | 388 | #elif defined(TARGET_SH4) |
| 374 | do_interrupt(env); | 389 | do_interrupt(env); |
| 390 | +#elif defined(TARGET_ALPHA) | ||
| 391 | + do_interrupt(env); | ||
| 375 | #endif | 392 | #endif |
| 376 | } | 393 | } |
| 377 | env->exception_index = -1; | 394 | env->exception_index = -1; |
| @@ -518,6 +535,10 @@ int cpu_exec(CPUState *env1) | @@ -518,6 +535,10 @@ int cpu_exec(CPUState *env1) | ||
| 518 | } | 535 | } |
| 519 | #elif defined(TARGET_SH4) | 536 | #elif defined(TARGET_SH4) |
| 520 | /* XXXXX */ | 537 | /* XXXXX */ |
| 538 | +#elif defined(TARGET_ALPHA) | ||
| 539 | + if (interrupt_request & CPU_INTERRUPT_HARD) { | ||
| 540 | + do_interrupt(env); | ||
| 541 | + } | ||
| 521 | #endif | 542 | #endif |
| 522 | /* Don't use the cached interupt_request value, | 543 | /* Don't use the cached interupt_request value, |
| 523 | do_interrupt may have updated the EXITTB flag. */ | 544 | do_interrupt may have updated the EXITTB flag. */ |
| @@ -586,6 +607,8 @@ int cpu_exec(CPUState *env1) | @@ -586,6 +607,8 @@ int cpu_exec(CPUState *env1) | ||
| 586 | cpu_dump_state(env, logfile, fprintf, 0); | 607 | cpu_dump_state(env, logfile, fprintf, 0); |
| 587 | #elif defined(TARGET_SH4) | 608 | #elif defined(TARGET_SH4) |
| 588 | cpu_dump_state(env, logfile, fprintf, 0); | 609 | cpu_dump_state(env, logfile, fprintf, 0); |
| 610 | +#elif defined(TARGET_ALPHA) | ||
| 611 | + cpu_dump_state(env, logfile, fprintf, 0); | ||
| 589 | #else | 612 | #else |
| 590 | #error unsupported target CPU | 613 | #error unsupported target CPU |
| 591 | #endif | 614 | #endif |
| @@ -778,6 +801,7 @@ int cpu_exec(CPUState *env1) | @@ -778,6 +801,7 @@ int cpu_exec(CPUState *env1) | ||
| 778 | | env->cc_dest | (env->cc_x << 4); | 801 | | env->cc_dest | (env->cc_x << 4); |
| 779 | #elif defined(TARGET_MIPS) | 802 | #elif defined(TARGET_MIPS) |
| 780 | #elif defined(TARGET_SH4) | 803 | #elif defined(TARGET_SH4) |
| 804 | +#elif defined(TARGET_ALPHA) | ||
| 781 | /* XXXXX */ | 805 | /* XXXXX */ |
| 782 | #else | 806 | #else |
| 783 | #error unsupported target CPU | 807 | #error unsupported target CPU |
| @@ -1164,6 +1188,51 @@ static inline int handle_cpu_signal(unsigned long pc, unsigned long address, | @@ -1164,6 +1188,51 @@ static inline int handle_cpu_signal(unsigned long pc, unsigned long address, | ||
| 1164 | /* never comes here */ | 1188 | /* never comes here */ |
| 1165 | return 1; | 1189 | return 1; |
| 1166 | } | 1190 | } |
| 1191 | + | ||
| 1192 | +#elif defined (TARGET_ALPHA) | ||
| 1193 | +static inline int handle_cpu_signal(unsigned long pc, unsigned long address, | ||
| 1194 | + int is_write, sigset_t *old_set, | ||
| 1195 | + void *puc) | ||
| 1196 | +{ | ||
| 1197 | + TranslationBlock *tb; | ||
| 1198 | + int ret; | ||
| 1199 | + | ||
| 1200 | + if (cpu_single_env) | ||
| 1201 | + env = cpu_single_env; /* XXX: find a correct solution for multithread */ | ||
| 1202 | +#if defined(DEBUG_SIGNAL) | ||
| 1203 | + printf("qemu: SIGSEGV pc=0x%08lx address=%08lx w=%d oldset=0x%08lx\n", | ||
| 1204 | + pc, address, is_write, *(unsigned long *)old_set); | ||
| 1205 | +#endif | ||
| 1206 | + /* XXX: locking issue */ | ||
| 1207 | + if (is_write && page_unprotect(h2g(address), pc, puc)) { | ||
| 1208 | + return 1; | ||
| 1209 | + } | ||
| 1210 | + | ||
| 1211 | + /* see if it is an MMU fault */ | ||
| 1212 | + ret = cpu_alpha_handle_mmu_fault(env, address, is_write, 1, 0); | ||
| 1213 | + if (ret < 0) | ||
| 1214 | + return 0; /* not an MMU fault */ | ||
| 1215 | + if (ret == 0) | ||
| 1216 | + return 1; /* the MMU fault was handled without causing real CPU fault */ | ||
| 1217 | + | ||
| 1218 | + /* now we have a real cpu fault */ | ||
| 1219 | + tb = tb_find_pc(pc); | ||
| 1220 | + if (tb) { | ||
| 1221 | + /* the PC is inside the translated code. It means that we have | ||
| 1222 | + a virtual CPU fault */ | ||
| 1223 | + cpu_restore_state(tb, env, pc, puc); | ||
| 1224 | + } | ||
| 1225 | +#if 0 | ||
| 1226 | + printf("PF exception: NIP=0x%08x error=0x%x %p\n", | ||
| 1227 | + env->nip, env->error_code, tb); | ||
| 1228 | +#endif | ||
| 1229 | + /* we restore the process signal mask as the sigreturn should | ||
| 1230 | + do it (XXX: use sigsetjmp) */ | ||
| 1231 | + sigprocmask(SIG_SETMASK, old_set, NULL); | ||
| 1232 | + cpu_loop_exit(); | ||
| 1233 | + /* never comes here */ | ||
| 1234 | + return 1; | ||
| 1235 | +} | ||
| 1167 | #else | 1236 | #else |
| 1168 | #error unsupported target CPU | 1237 | #error unsupported target CPU |
| 1169 | #endif | 1238 | #endif |
dis-asm.h
| @@ -181,6 +181,7 @@ enum bfd_architecture | @@ -181,6 +181,7 @@ enum bfd_architecture | ||
| 181 | #define bfd_mach_sh4al_dsp 0x4d | 181 | #define bfd_mach_sh4al_dsp 0x4d |
| 182 | #define bfd_mach_sh5 0x50 | 182 | #define bfd_mach_sh5 0x50 |
| 183 | bfd_arch_alpha, /* Dec Alpha */ | 183 | bfd_arch_alpha, /* Dec Alpha */ |
| 184 | +#define bfd_mach_alpha 1 | ||
| 184 | bfd_arch_arm, /* Advanced Risc Machines ARM */ | 185 | bfd_arch_arm, /* Advanced Risc Machines ARM */ |
| 185 | #define bfd_mach_arm_2 1 | 186 | #define bfd_mach_arm_2 1 |
| 186 | #define bfd_mach_arm_2a 2 | 187 | #define bfd_mach_arm_2a 2 |
| @@ -377,6 +378,7 @@ extern int print_insn_d10v PARAMS ((bfd_vma, disassemble_info*)); | @@ -377,6 +378,7 @@ extern int print_insn_d10v PARAMS ((bfd_vma, disassemble_info*)); | ||
| 377 | extern int print_insn_v850 PARAMS ((bfd_vma, disassemble_info*)); | 378 | extern int print_insn_v850 PARAMS ((bfd_vma, disassemble_info*)); |
| 378 | extern int print_insn_tic30 PARAMS ((bfd_vma, disassemble_info*)); | 379 | extern int print_insn_tic30 PARAMS ((bfd_vma, disassemble_info*)); |
| 379 | extern int print_insn_ppc PARAMS ((bfd_vma, disassemble_info*)); | 380 | extern int print_insn_ppc PARAMS ((bfd_vma, disassemble_info*)); |
| 381 | +extern int print_insn_alpha PARAMS ((bfd_vma, disassemble_info*)); | ||
| 380 | 382 | ||
| 381 | #if 0 | 383 | #if 0 |
| 382 | /* Fetch the disassembler for a given BFD, if that support is available. */ | 384 | /* Fetch the disassembler for a given BFD, if that support is available. */ |
disas.c
| @@ -197,6 +197,9 @@ void target_disas(FILE *out, target_ulong code, target_ulong size, int flags) | @@ -197,6 +197,9 @@ void target_disas(FILE *out, target_ulong code, target_ulong size, int flags) | ||
| 197 | #elif defined(TARGET_SH4) | 197 | #elif defined(TARGET_SH4) |
| 198 | disasm_info.mach = bfd_mach_sh4; | 198 | disasm_info.mach = bfd_mach_sh4; |
| 199 | print_insn = print_insn_sh; | 199 | print_insn = print_insn_sh; |
| 200 | +#elif defined(TARGET_ALPHA) | ||
| 201 | + disasm_info.mach = bfd_mach_alpha; | ||
| 202 | + print_insn = print_insn_alpha; | ||
| 200 | #else | 203 | #else |
| 201 | fprintf(out, "0x" TARGET_FMT_lx | 204 | fprintf(out, "0x" TARGET_FMT_lx |
| 202 | ": Asm output not supported on this arch\n", code); | 205 | ": Asm output not supported on this arch\n", code); |
exec-all.h
| @@ -572,6 +572,8 @@ static inline target_ulong get_phys_addr_code(CPUState *env, target_ulong addr) | @@ -572,6 +572,8 @@ static inline target_ulong get_phys_addr_code(CPUState *env, target_ulong addr) | ||
| 572 | is_user = ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR); | 572 | is_user = ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR); |
| 573 | #elif defined (TARGET_SH4) | 573 | #elif defined (TARGET_SH4) |
| 574 | is_user = ((env->sr & SR_MD) == 0); | 574 | is_user = ((env->sr & SR_MD) == 0); |
| 575 | +#elif defined (TARGET_ALPHA) | ||
| 576 | + is_user = ((env->ps >> 3) & 3); | ||
| 575 | #else | 577 | #else |
| 576 | #error unimplemented CPU | 578 | #error unimplemented CPU |
| 577 | #endif | 579 | #endif |
softmmu_header.h
| @@ -63,6 +63,8 @@ | @@ -63,6 +63,8 @@ | ||
| 63 | #define CPU_MEM_INDEX ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR) | 63 | #define CPU_MEM_INDEX ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR) |
| 64 | #elif defined (TARGET_SH4) | 64 | #elif defined (TARGET_SH4) |
| 65 | #define CPU_MEM_INDEX ((env->sr & SR_MD) == 0) | 65 | #define CPU_MEM_INDEX ((env->sr & SR_MD) == 0) |
| 66 | +#elif defined (TARGET_ALPHA) | ||
| 67 | +#define CPU_MEM_INDEX ((env->ps >> 3) & 3) | ||
| 66 | #else | 68 | #else |
| 67 | #error unsupported CPU | 69 | #error unsupported CPU |
| 68 | #endif | 70 | #endif |
| @@ -82,6 +84,8 @@ | @@ -82,6 +84,8 @@ | ||
| 82 | #define CPU_MEM_INDEX ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR) | 84 | #define CPU_MEM_INDEX ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR) |
| 83 | #elif defined (TARGET_SH4) | 85 | #elif defined (TARGET_SH4) |
| 84 | #define CPU_MEM_INDEX ((env->sr & SR_MD) == 0) | 86 | #define CPU_MEM_INDEX ((env->sr & SR_MD) == 0) |
| 87 | +#elif defined (TARGET_ALPHA) | ||
| 88 | +#define CPU_MEM_INDEX ((env->ps >> 3) & 3) | ||
| 85 | #else | 89 | #else |
| 86 | #error unsupported CPU | 90 | #error unsupported CPU |
| 87 | #endif | 91 | #endif |
translate-all.c
| @@ -308,6 +308,8 @@ int cpu_restore_state(TranslationBlock *tb, | @@ -308,6 +308,8 @@ int cpu_restore_state(TranslationBlock *tb, | ||
| 308 | env->PC = gen_opc_pc[j]; | 308 | env->PC = gen_opc_pc[j]; |
| 309 | env->hflags &= ~MIPS_HFLAG_BMASK; | 309 | env->hflags &= ~MIPS_HFLAG_BMASK; |
| 310 | env->hflags |= gen_opc_hflags[j]; | 310 | env->hflags |= gen_opc_hflags[j]; |
| 311 | +#elif defined(TARGET_ALPHA) | ||
| 312 | + env->pc = gen_opc_pc[j]; | ||
| 311 | #endif | 313 | #endif |
| 312 | return 0; | 314 | return 0; |
| 313 | } | 315 | } |
vl.c
| @@ -6707,6 +6707,8 @@ void register_machines(void) | @@ -6707,6 +6707,8 @@ void register_machines(void) | ||
| 6707 | qemu_register_machine(&realview_machine); | 6707 | qemu_register_machine(&realview_machine); |
| 6708 | #elif defined(TARGET_SH4) | 6708 | #elif defined(TARGET_SH4) |
| 6709 | qemu_register_machine(&shix_machine); | 6709 | qemu_register_machine(&shix_machine); |
| 6710 | +#elif defined(TARGET_ALPHA) | ||
| 6711 | + /* XXX: TODO */ | ||
| 6710 | #else | 6712 | #else |
| 6711 | #error unsupported CPU | 6713 | #error unsupported CPU |
| 6712 | #endif | 6714 | #endif |