aboutsummaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2025-05-17 13:27:48 +0200
committerHelge Deller <deller@gmx.de>2025-05-17 13:52:40 +0200
commitebd394948de4e868cb8fc5b265a8a18f0935dce1 (patch)
tree81e9fa3c996af205a6c71ef60385ddb5f8f732be /python
parentb4b49cf39dba5f993ad925f204cb820aacfc8e45 (diff)
downloadqemu-ebd394948de4e868cb8fc5b265a8a18f0935dce1.zip
qemu-ebd394948de4e868cb8fc5b265a8a18f0935dce1.tar.gz
qemu-ebd394948de4e868cb8fc5b265a8a18f0935dce1.tar.bz2
target/hppa: Fix FPE exceptions
Implement FP exception register #1 (lower 32-bits of 64-bit fr[0]). A proper implementation is necessary to allow the Linux kernel in system mode and the qemu linux-user to send proper si_code values on SIGFPE signal. Always set the T-bit on taken exception, and merge over- and underflow in system mode to just set overflow bit to mimic the behaviour I tested on a physical machine. The test program below can be used to verify correct behaviour. Note that behaviour on SIGFPE may vary on different platforms. The program should always detect the correct signal, but it may or may not be able to sucessfully continue afterwards. #define _GNU_SOURCE #include <signal.h> #include <stdio.h> #include <fenv.h> #include <float.h> static void fpe_func(int sig, siginfo_t *i, void *v) { sigset_t set; sigemptyset(&set); sigaddset(&set, SIGFPE); sigprocmask(SIG_UNBLOCK, &set, NULL); printf("GOT signal %d with si_code %ld\n", sig, i->si_code); } int main(int argc, char *argv[]) { struct sigaction action = { .sa_sigaction = fpe_func, .sa_flags = SA_RESTART|SA_SIGINFO }; sigaction(SIGFPE, &action, 0); feenableexcept(FE_OVERFLOW | FE_UNDERFLOW); double x = DBL_MIN; return printf("%lf\n", argc > 1 ? 1.7976931348623158E308*1.7976931348623158E308 : x / 10); } Signed-off-by: Helge Deller <deller@gmx.de>
Diffstat (limited to 'python')
0 files changed, 0 insertions, 0 deletions