Index: linux-user/main.c =================================================================== RCS file: /cvsroot/qemu/qemu/linux-user/main.c,v retrieving revision 1.61 diff -u -r1.61 main.c --- linux-user/main.c 19 Feb 2005 17:25:31 -0000 1.61 +++ linux-user/main.c 22 Feb 2005 14:54:46 -0000 @@ -325,17 +325,40 @@ { TaskState *ts = env->opaque; uint32_t opcode; + int rc; /* we handle the FPU emulation here, as Linux */ /* we get the opcode */ opcode = ldl_raw((uint8_t *)env->regs[15]); - if (EmulateAll(opcode, &ts->fpa, env->regs) == 0) { + /* copied from softfloat library */ + enum { + float_flag_invalid = 1, + float_flag_divbyzero = 2, + float_flag_overflow = 4, + float_flag_underflow = 8, + float_flag_inexact = 16 + }; + + if ((rc=EmulateAll(opcode, &ts->fpa, env->regs)) == 0) { info.si_signo = SIGILL; info.si_errno = 0; info.si_code = TARGET_ILL_ILLOPN; info._sifields._sigfault._addr = env->regs[15]; queue_signal(info.si_signo, &info); + } else if (rc < 0 && rc != -float_flag_inexact) { + info.si_signo = SIGFPE; + info.si_errno = 0; + switch(-rc) + { + case float_flag_invalid: info.si_code = TARGET_FPE_FLTINV; break; + case float_flag_divbyzero: info.si_code = TARGET_FPE_FLTDIV ; break; + case float_flag_overflow: info.si_code = TARGET_FPE_FLTOVF; break; + case float_flag_underflow: info.si_code = TARGET_FPE_FLTUND ; break; + default: break; + } + info._sifields._sigfault._addr = env->regs[15]; + queue_signal(info.si_signo, &info); } else { /* increment PC */ env->regs[15] += 4; Index: target-arm/nwfpe/fpa11.c =================================================================== RCS file: /cvsroot/qemu/qemu/target-arm/nwfpe/fpa11.c,v retrieving revision 1.1 diff -u -r1.1 fpa11.c --- target-arm/nwfpe/fpa11.c 16 Feb 2004 21:43:58 -0000 1.1 +++ target-arm/nwfpe/fpa11.c 22 Feb 2005 14:54:46 -0000 @@ -185,6 +185,11 @@ } // restore_flags(flags); + if(nRc == 1 && float_exception_flags) + { + //printf("fef 0x%x\n",float_exception_flags); + nRc=-float_exception_flags; + } //printf("returning %d\n",nRc); return(nRc);