|
From: | Richard Henderson |
Subject: | Re: [PATCH v2 1/2] linux-user/s390x: signal with SIGFPE on compare-and-trap |
Date: | Thu, 8 Jul 2021 10:08:01 -0700 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 |
On 7/7/21 6:42 AM, Jonathan Albrecht wrote:
+ sig = TARGET_SIGFPE; + if ((n & 0x03) == 0) { + /* An IEEE exception, simulated or otherwise. */ if (n & 0x80) { n = TARGET_FPE_FLTINV; } else if (n & 0x40) { @@ -121,13 +123,12 @@ void cpu_loop(CPUS390XState *env) n = TARGET_FPE_FLTUND; } else if (n & 0x08) { n = TARGET_FPE_FLTRES; - } else { - /* ??? Quantum exception; BFP, DFP error. */ - goto do_sigill_opn; } - sig = TARGET_SIGFPE; - goto do_signal_pc; + } else { + /* compare-and-trap */ + n = 0; }
Nearly, but not quite. Replace the ??? Quantum exception with n = 0, otherwise si_code will be garbage for that case.
The structure of the kernel code is if (n != 0) { /* do_fp_trap */ si_code = 0; if ((n & 3) == 0) { /* select on bits 6 & 7 */ } raise sigfpe w/ si_code } else { raise sigill }The comment for compare-and-trap is misleading, because there are lots of entries in "Figure 6-2. Data-exception codes (DXC)" which arrive there and are not compare-and-trap.
As a general comment, I think a single switch over DXC would be cleaner for both kernel and qemu. It seems like giving different si_code for e.g. "0x40 IEEE division by zero" and "0x43 Simulated IEEE division by zero" is actively incorrect.
r~
[Prev in Thread] | Current Thread | [Next in Thread] |