diff options
author | Edgar E. Iglesias <edgar.iglesias@petalogix.com> | 2010-09-09 10:24:01 +0200 |
---|---|---|
committer | Edgar E. Iglesias <edgar.iglesias@gmail.com> | 2010-09-09 10:24:01 +0200 |
commit | b76da7e376954ff25e7f9b6e9313f40b8300bf19 (patch) | |
tree | 19fa61a4ce4eab27b7be697a9da02726cc434cc3 /linux-user | |
parent | 97694c57d73b150296c5f5333960eb4d56225cd7 (diff) |
microblaze: User-mode emulation of hw-excp signals
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@petalogix.com>
Diffstat (limited to 'linux-user')
-rw-r--r-- | linux-user/main.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/linux-user/main.c b/linux-user/main.c index fa29d7773a..69d050f91b 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -2233,6 +2233,37 @@ void cpu_loop (CPUState *env) env->regs[3] = ret; env->sregs[SR_PC] = env->regs[14]; break; + case EXCP_HW_EXCP: + env->regs[17] = env->sregs[SR_PC] + 4; + if (env->iflags & D_FLAG) { + env->sregs[SR_ESR] |= 1 << 12; + env->sregs[SR_PC] -= 4; + /* FIXME: if branch was immed, replay the imm aswell. */ + } + + env->iflags &= ~(IMM_FLAG | D_FLAG); + + switch (env->sregs[SR_ESR] & 31) { + case ESR_EC_FPU: + info.si_signo = SIGFPE; + info.si_errno = 0; + if (env->sregs[SR_FSR] & FSR_IO) { + info.si_code = TARGET_FPE_FLTINV; + } + if (env->sregs[SR_FSR] & FSR_DZ) { + info.si_code = TARGET_FPE_FLTDIV; + } + info._sifields._sigfault._addr = 0; + queue_signal(env, info.si_signo, &info); + break; + default: + printf ("Unhandled hw-exception: 0x%x\n", + env->sregs[SR_ESR] & 5); + cpu_dump_state(env, stderr, fprintf, 0); + exit (1); + break; + } + break; case EXCP_DEBUG: { int sig; |