diff options
| author | Richard Henderson <richard.henderson@linaro.org> | 2023-02-15 19:45:15 -1000 |
|---|---|---|
| committer | Laurent Vivier <laurent@vivier.eu> | 2023-03-10 20:45:47 +0100 |
| commit | 4ea3af392f85dc2e66059855266b3817b321dc90 (patch) | |
| tree | b5ecde2626d54ae6e503d38be4779060d5f02b0c /linux-user/sparc | |
| parent | 81f04cd34ccd3dab6c796a5fbc439a8061b04ef3 (diff) | |
| download | focaccia-qemu-4ea3af392f85dc2e66059855266b3817b321dc90.tar.gz focaccia-qemu-4ea3af392f85dc2e66059855266b3817b321dc90.zip | |
linux-user/sparc: Handle floating-point exceptions
Raise SIGFPE for ieee exceptions. The other types, such as FSR_FTT_UNIMPFPOP, should not appear, because we enable normal emulation of missing insns at the start of sparc_cpu_realizefn(). Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20230216054516.1267305-15-richard.henderson@linaro.org> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Diffstat (limited to 'linux-user/sparc')
| -rw-r--r-- | linux-user/sparc/cpu_loop.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/linux-user/sparc/cpu_loop.c b/linux-user/sparc/cpu_loop.c index 093358a39a..5a8a71e976 100644 --- a/linux-user/sparc/cpu_loop.c +++ b/linux-user/sparc/cpu_loop.c @@ -297,6 +297,28 @@ void cpu_loop (CPUSPARCState *env) restore_window(env); break; + case TT_FP_EXCP: + { + int code = TARGET_FPE_FLTUNK; + target_ulong fsr = env->fsr; + + if ((fsr & FSR_FTT_MASK) == FSR_FTT_IEEE_EXCP) { + if (fsr & FSR_NVC) { + code = TARGET_FPE_FLTINV; + } else if (fsr & FSR_OFC) { + code = TARGET_FPE_FLTOVF; + } else if (fsr & FSR_UFC) { + code = TARGET_FPE_FLTUND; + } else if (fsr & FSR_DZC) { + code = TARGET_FPE_FLTDIV; + } else if (fsr & FSR_NXC) { + code = TARGET_FPE_FLTRES; + } + } + force_sig_fault(TARGET_SIGFPE, code, env->pc); + } + break; + case EXCP_INTERRUPT: /* just indicate that signals should be handled asap */ break; |