mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 20:33:54 -06:00
target-or32: Add linux user support
Add QEMU OpenRISC linux user support. Signed-off-by: Jia Liu <proljc@gmail.com> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
a8720299f1
commit
d962783e98
8 changed files with 422 additions and 4 deletions
|
@ -2306,6 +2306,93 @@ done_syscall:
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef TARGET_OPENRISC
|
||||
|
||||
void cpu_loop(CPUOpenRISCState *env)
|
||||
{
|
||||
int trapnr, gdbsig;
|
||||
|
||||
for (;;) {
|
||||
trapnr = cpu_exec(env);
|
||||
gdbsig = 0;
|
||||
|
||||
switch (trapnr) {
|
||||
case EXCP_RESET:
|
||||
qemu_log("\nReset request, exit, pc is %#x\n", env->pc);
|
||||
exit(1);
|
||||
break;
|
||||
case EXCP_BUSERR:
|
||||
qemu_log("\nBus error, exit, pc is %#x\n", env->pc);
|
||||
gdbsig = SIGBUS;
|
||||
break;
|
||||
case EXCP_DPF:
|
||||
case EXCP_IPF:
|
||||
cpu_dump_state(env, stderr, fprintf, 0);
|
||||
gdbsig = TARGET_SIGSEGV;
|
||||
break;
|
||||
case EXCP_TICK:
|
||||
qemu_log("\nTick time interrupt pc is %#x\n", env->pc);
|
||||
break;
|
||||
case EXCP_ALIGN:
|
||||
qemu_log("\nAlignment pc is %#x\n", env->pc);
|
||||
gdbsig = SIGBUS;
|
||||
break;
|
||||
case EXCP_ILLEGAL:
|
||||
qemu_log("\nIllegal instructionpc is %#x\n", env->pc);
|
||||
gdbsig = SIGILL;
|
||||
break;
|
||||
case EXCP_INT:
|
||||
qemu_log("\nExternal interruptpc is %#x\n", env->pc);
|
||||
break;
|
||||
case EXCP_DTLBMISS:
|
||||
case EXCP_ITLBMISS:
|
||||
qemu_log("\nTLB miss\n");
|
||||
break;
|
||||
case EXCP_RANGE:
|
||||
qemu_log("\nRange\n");
|
||||
gdbsig = SIGSEGV;
|
||||
break;
|
||||
case EXCP_SYSCALL:
|
||||
env->pc += 4; /* 0xc00; */
|
||||
env->gpr[11] = do_syscall(env,
|
||||
env->gpr[11], /* return value */
|
||||
env->gpr[3], /* r3 - r7 are params */
|
||||
env->gpr[4],
|
||||
env->gpr[5],
|
||||
env->gpr[6],
|
||||
env->gpr[7],
|
||||
env->gpr[8], 0, 0);
|
||||
break;
|
||||
case EXCP_FPE:
|
||||
qemu_log("\nFloating point error\n");
|
||||
break;
|
||||
case EXCP_TRAP:
|
||||
qemu_log("\nTrap\n");
|
||||
gdbsig = SIGTRAP;
|
||||
break;
|
||||
case EXCP_NR:
|
||||
qemu_log("\nNR\n");
|
||||
break;
|
||||
default:
|
||||
qemu_log("\nqemu: unhandled CPU exception %#x - aborting\n",
|
||||
trapnr);
|
||||
cpu_dump_state(env, stderr, fprintf, 0);
|
||||
gdbsig = TARGET_SIGILL;
|
||||
break;
|
||||
}
|
||||
if (gdbsig) {
|
||||
gdb_handlesig(env, gdbsig);
|
||||
if (gdbsig != TARGET_SIGTRAP) {
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
process_pending_signals(env);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* TARGET_OPENRISC */
|
||||
|
||||
#ifdef TARGET_SH4
|
||||
void cpu_loop(CPUSH4State *env)
|
||||
{
|
||||
|
@ -3386,6 +3473,8 @@ int main(int argc, char **argv, char **envp)
|
|||
#else
|
||||
cpu_model = "24Kf";
|
||||
#endif
|
||||
#elif defined TARGET_OPENRISC
|
||||
cpu_model = "or1200";
|
||||
#elif defined(TARGET_PPC)
|
||||
#ifdef TARGET_PPC64
|
||||
cpu_model = "970fx";
|
||||
|
@ -3788,6 +3877,17 @@ int main(int argc, char **argv, char **envp)
|
|||
env->hflags |= MIPS_HFLAG_M16;
|
||||
}
|
||||
}
|
||||
#elif defined(TARGET_OPENRISC)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
env->gpr[i] = regs->gpr[i];
|
||||
}
|
||||
|
||||
env->sr = regs->sr;
|
||||
env->pc = regs->pc;
|
||||
}
|
||||
#elif defined(TARGET_SH4)
|
||||
{
|
||||
int i;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue