mirror of https://github.com/xqemu/xqemu.git
microblaze: User-mode emulation of hw-excp signals
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@petalogix.com>
This commit is contained in:
parent
97694c57d7
commit
b76da7e376
|
@ -2233,6 +2233,37 @@ void cpu_loop (CPUState *env)
|
||||||
env->regs[3] = ret;
|
env->regs[3] = ret;
|
||||||
env->sregs[SR_PC] = env->regs[14];
|
env->sregs[SR_PC] = env->regs[14];
|
||||||
break;
|
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:
|
case EXCP_DEBUG:
|
||||||
{
|
{
|
||||||
int sig;
|
int sig;
|
||||||
|
|
Loading…
Reference in New Issue