diff options
| author | Anthony Liguori | 2011-10-31 21:05:40 +0100 |
|---|---|---|
| committer | Anthony Liguori | 2011-10-31 21:05:40 +0100 |
| commit | ff74c5a9a91c6dbf1017195462aa4176f7381240 (patch) | |
| tree | 4d365c66901ceab92858755069e68d6d1fe86b3d /linux-user/main.c | |
| parent | Merge remote-tracking branch 'kwolf/for-anthony' into staging (diff) | |
| parent | ppc64-linux-user: Fix syscall return type. (diff) | |
| download | qemu-ff74c5a9a91c6dbf1017195462aa4176f7381240.tar.gz qemu-ff74c5a9a91c6dbf1017195462aa4176f7381240.tar.xz qemu-ff74c5a9a91c6dbf1017195462aa4176f7381240.zip | |
Merge remote-tracking branch 'riku/linux-user-for-upstream' into staging
Diffstat (limited to 'linux-user/main.c')
| -rw-r--r-- | linux-user/main.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/linux-user/main.c b/linux-user/main.c index e7dad547b8..d1bbc577e5 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -1148,7 +1148,7 @@ void cpu_loop (CPUSPARCState *env) case TT_TFAULT: case TT_DFAULT: { - info.si_signo = SIGSEGV; + info.si_signo = TARGET_SIGSEGV; info.si_errno = 0; /* XXX: check env->error_code */ info.si_code = TARGET_SEGV_MAPERR; @@ -1166,7 +1166,7 @@ void cpu_loop (CPUSPARCState *env) case TT_TFAULT: case TT_DFAULT: { - info.si_signo = SIGSEGV; + info.si_signo = TARGET_SIGSEGV; info.si_errno = 0; /* XXX: check env->error_code */ info.si_code = TARGET_SEGV_MAPERR; @@ -1191,6 +1191,15 @@ void cpu_loop (CPUSPARCState *env) case EXCP_INTERRUPT: /* just indicate that signals should be handled asap */ break; + case TT_ILL_INSN: + { + info.si_signo = TARGET_SIGILL; + info.si_errno = 0; + info.si_code = TARGET_ILL_ILLOPC; + info._sifields._sigfault._addr = env->pc; + queue_signal(env, info.si_signo, &info); + } + break; case EXCP_DEBUG: { int sig; @@ -1332,7 +1341,7 @@ void cpu_loop(CPUPPCState *env) { target_siginfo_t info; int trapnr; - uint32_t ret; + target_ulong ret; for(;;) { cpu_exec_start(env); @@ -1695,27 +1704,20 @@ void cpu_loop(CPUPPCState *env) * PPC ABI uses overflow flag in cr0 to signal an error * in syscalls. */ -#if 0 - printf("syscall %d 0x%08x 0x%08x 0x%08x 0x%08x\n", env->gpr[0], - env->gpr[3], env->gpr[4], env->gpr[5], env->gpr[6]); -#endif env->crf[0] &= ~0x1; ret = do_syscall(env, env->gpr[0], env->gpr[3], env->gpr[4], env->gpr[5], env->gpr[6], env->gpr[7], env->gpr[8], 0, 0); - if (ret == (uint32_t)(-TARGET_QEMU_ESIGRETURN)) { + if (ret == (target_ulong)(-TARGET_QEMU_ESIGRETURN)) { /* Returning from a successful sigreturn syscall. Avoid corrupting register state. */ break; } - if (ret > (uint32_t)(-515)) { + if (ret > (target_ulong)(-515)) { env->crf[0] |= 0x1; ret = -ret; } env->gpr[3] = ret; -#if 0 - printf("syscall returned 0x%08x (%d)\n", ret, ret); -#endif break; case POWERPC_EXCP_STCX: if (do_store_exclusive(env)) { |
