]> git.baikalelectronics.ru Git - kernel.git/commit
MIPS: Fix FCSR Cause bit handling for correct SIGFPE issue
authorMaciej W. Rozycki <macro@imgtec.com>
Fri, 28 Oct 2016 07:21:03 +0000 (08:21 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Fri, 4 Nov 2016 00:28:41 +0000 (01:28 +0100)
commit14e33d82dafea5437756b05e0e2118d5ed124092
treebdfad3f7a9ce39cc48edd2a1cff8c89a0549c60a
parentc173d846dd8111858085dd4144af1560524568d5
MIPS: Fix FCSR Cause bit handling for correct SIGFPE issue

Sanitize FCSR Cause bit handling, following a trail of past attempts:

* commit f41e39eb7ea5 ("MIPS: ptrace: Fix FP context restoration FCSR
regression"),

* commit b637f29ca7bc ("MIPS: Always clear FCSR cause bits after
emulation"),

* commit 6fcb56324c9c ("MIPS: Clear [MSA]FPE CSR.Cause after
notify_die()"),

* commit 24efa48aa91e ("MIPS: Prevent user from setting FCSR cause
bits"),

* commit b54d2901517d ("Properly handle branch delay slots in connection
with signals.").

Specifically do not mask these bits out in ptrace(2) processing and send
a SIGFPE signal instead whenever a matching pair of an FCSR Cause and
Enable bit is seen as execution of an affected context is about to
resume.  Only then clear Cause bits, and even then do not clear any bits
that are set but masked with the respective Enable bits.  Adjust Cause
bit clearing throughout code likewise, except within the FPU emulator
proper where they are set according to IEEE 754 exceptions raised as the
operation emulated executed.  Do so so that any IEEE 754 exceptions
subject to their default handling are recorded like with operations
executed by FPU hardware.

Signed-off-by: Maciej W. Rozycki <macro@imgtec.com>
Cc: Paul Burton <paul.burton@imgtec.com>
Cc: James Hogan <james.hogan@imgtec.com>
Cc: linux-mips@linux-mips.org
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/14460/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/include/asm/fpu_emulator.h
arch/mips/include/asm/switch_to.h
arch/mips/kernel/mips-r2-to-r6-emul.c
arch/mips/kernel/ptrace.c
arch/mips/kernel/traps.c