mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 23:33:54 -06:00
ColdFire target.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2196 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
223b8a40d1
commit
e6e5906b6e
32 changed files with 5227 additions and 12 deletions
|
@ -1412,6 +1412,98 @@ void cpu_loop (CPUState *env)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef TARGET_M68K
|
||||
|
||||
void cpu_loop(CPUM68KState *env)
|
||||
{
|
||||
int trapnr;
|
||||
unsigned int n;
|
||||
target_siginfo_t info;
|
||||
TaskState *ts = env->opaque;
|
||||
|
||||
for(;;) {
|
||||
trapnr = cpu_m68k_exec(env);
|
||||
switch(trapnr) {
|
||||
case EXCP_ILLEGAL:
|
||||
{
|
||||
if (ts->sim_syscalls) {
|
||||
uint16_t nr;
|
||||
nr = lduw(env->pc + 2);
|
||||
env->pc += 4;
|
||||
do_m68k_simcall(env, nr);
|
||||
} else {
|
||||
goto do_sigill;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EXCP_HALTED:
|
||||
/* Semihosing syscall. */
|
||||
env->pc += 2;
|
||||
do_m68k_semihosting(env, env->dregs[0]);
|
||||
break;
|
||||
case EXCP_LINEA:
|
||||
case EXCP_LINEF:
|
||||
case EXCP_UNSUPPORTED:
|
||||
do_sigill:
|
||||
info.si_signo = SIGILL;
|
||||
info.si_errno = 0;
|
||||
info.si_code = TARGET_ILL_ILLOPN;
|
||||
info._sifields._sigfault._addr = env->pc;
|
||||
queue_signal(info.si_signo, &info);
|
||||
break;
|
||||
case EXCP_TRAP0:
|
||||
{
|
||||
ts->sim_syscalls = 0;
|
||||
n = env->dregs[0];
|
||||
env->pc += 2;
|
||||
env->dregs[0] = do_syscall(env,
|
||||
n,
|
||||
env->dregs[1],
|
||||
env->dregs[2],
|
||||
env->dregs[3],
|
||||
env->dregs[4],
|
||||
env->dregs[5],
|
||||
env->dregs[6]);
|
||||
}
|
||||
break;
|
||||
case EXCP_INTERRUPT:
|
||||
/* just indicate that signals should be handled asap */
|
||||
break;
|
||||
case EXCP_ACCESS:
|
||||
{
|
||||
info.si_signo = SIGSEGV;
|
||||
info.si_errno = 0;
|
||||
/* XXX: check env->error_code */
|
||||
info.si_code = TARGET_SEGV_MAPERR;
|
||||
info._sifields._sigfault._addr = env->mmu.ar;
|
||||
queue_signal(info.si_signo, &info);
|
||||
}
|
||||
break;
|
||||
case EXCP_DEBUG:
|
||||
{
|
||||
int sig;
|
||||
|
||||
sig = gdb_handlesig (env, TARGET_SIGTRAP);
|
||||
if (sig)
|
||||
{
|
||||
info.si_signo = sig;
|
||||
info.si_errno = 0;
|
||||
info.si_code = TARGET_TRAP_BRKPT;
|
||||
queue_signal(info.si_signo, &info);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n",
|
||||
trapnr);
|
||||
cpu_dump_state(env, stderr, fprintf, 0);
|
||||
abort();
|
||||
}
|
||||
process_pending_signals(env);
|
||||
}
|
||||
}
|
||||
#endif /* TARGET_M68K */
|
||||
|
||||
void usage(void)
|
||||
{
|
||||
printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003-2005 Fabrice Bellard\n"
|
||||
|
@ -1685,6 +1777,35 @@ int main(int argc, char **argv)
|
|||
env->gpr[i] = regs->gpr[i];
|
||||
}
|
||||
}
|
||||
#elif defined(TARGET_M68K)
|
||||
{
|
||||
m68k_def_t *def;
|
||||
def = m68k_find_by_name("cfv4e");
|
||||
if (def == NULL) {
|
||||
cpu_abort(cpu_single_env,
|
||||
"Unable to find m68k CPU definition\n");
|
||||
}
|
||||
cpu_m68k_register(cpu_single_env, def);
|
||||
env->pc = regs->pc;
|
||||
env->dregs[0] = regs->d0;
|
||||
env->dregs[1] = regs->d1;
|
||||
env->dregs[2] = regs->d2;
|
||||
env->dregs[3] = regs->d3;
|
||||
env->dregs[4] = regs->d4;
|
||||
env->dregs[5] = regs->d5;
|
||||
env->dregs[6] = regs->d6;
|
||||
env->dregs[7] = regs->d7;
|
||||
env->aregs[0] = regs->a0;
|
||||
env->aregs[1] = regs->a1;
|
||||
env->aregs[2] = regs->a2;
|
||||
env->aregs[3] = regs->a3;
|
||||
env->aregs[4] = regs->a4;
|
||||
env->aregs[5] = regs->a5;
|
||||
env->aregs[6] = regs->a6;
|
||||
env->aregs[7] = regs->usp;
|
||||
env->sr = regs->sr;
|
||||
ts->sim_syscalls = 1;
|
||||
}
|
||||
#elif defined(TARGET_MIPS)
|
||||
{
|
||||
int i;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue