Commit eddf68a6ac4b5ca6eb1efbb69e50d04878a87aa5

Authored by j_mayer
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
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. */
@@ -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 }
@@ -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