Commit 2bcb3fbc authored by Paul Burton's avatar Paul Burton Committed by Ralf Baechle

MIPS: Dumb MSA FP exception handler

This patch adds a simple handler for MSA FP exceptions which delivers a
SIGFPE to the running task. In the future it should probably be extended
to re-execute the instruction with the MSACSR.NX bit set in order to
generate results for any elements which did not cause an exception
before delivering the SIGFPE signal.
Signed-off-by: default avatarPaul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/6432/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 1db1af84
...@@ -475,6 +475,7 @@ NESTED(nmi_handler, PT_SIZE, sp) ...@@ -475,6 +475,7 @@ NESTED(nmi_handler, PT_SIZE, sp)
BUILD_HANDLER cpu cpu sti silent /* #11 */ BUILD_HANDLER cpu cpu sti silent /* #11 */
BUILD_HANDLER ov ov sti silent /* #12 */ BUILD_HANDLER ov ov sti silent /* #12 */
BUILD_HANDLER tr tr sti silent /* #13 */ BUILD_HANDLER tr tr sti silent /* #13 */
BUILD_HANDLER msa_fpe msa_fpe sti silent /* #14 */
BUILD_HANDLER fpe fpe fpe silent /* #15 */ BUILD_HANDLER fpe fpe fpe silent /* #15 */
BUILD_HANDLER ftlb ftlb none silent /* #16 */ BUILD_HANDLER ftlb ftlb none silent /* #16 */
BUILD_HANDLER msa msa sti silent /* #21 */ BUILD_HANDLER msa msa sti silent /* #21 */
......
...@@ -78,6 +78,7 @@ extern asmlinkage void handle_ri_rdhwr(void); ...@@ -78,6 +78,7 @@ extern asmlinkage void handle_ri_rdhwr(void);
extern asmlinkage void handle_cpu(void); extern asmlinkage void handle_cpu(void);
extern asmlinkage void handle_ov(void); extern asmlinkage void handle_ov(void);
extern asmlinkage void handle_tr(void); extern asmlinkage void handle_tr(void);
extern asmlinkage void handle_msa_fpe(void);
extern asmlinkage void handle_fpe(void); extern asmlinkage void handle_fpe(void);
extern asmlinkage void handle_ftlb(void); extern asmlinkage void handle_ftlb(void);
extern asmlinkage void handle_msa(void); extern asmlinkage void handle_msa(void);
...@@ -1250,6 +1251,16 @@ asmlinkage void do_cpu(struct pt_regs *regs) ...@@ -1250,6 +1251,16 @@ asmlinkage void do_cpu(struct pt_regs *regs)
exception_exit(prev_state); exception_exit(prev_state);
} }
asmlinkage void do_msa_fpe(struct pt_regs *regs)
{
enum ctx_state prev_state;
prev_state = exception_enter();
die_if_kernel("do_msa_fpe invoked from kernel context!", regs);
force_sig(SIGFPE, current);
exception_exit(prev_state);
}
asmlinkage void do_msa(struct pt_regs *regs) asmlinkage void do_msa(struct pt_regs *regs)
{ {
enum ctx_state prev_state; enum ctx_state prev_state;
...@@ -2106,6 +2117,7 @@ void __init trap_init(void) ...@@ -2106,6 +2117,7 @@ void __init trap_init(void)
set_except_vector(11, handle_cpu); set_except_vector(11, handle_cpu);
set_except_vector(12, handle_ov); set_except_vector(12, handle_ov);
set_except_vector(13, handle_tr); set_except_vector(13, handle_tr);
set_except_vector(14, handle_msa_fpe);
if (current_cpu_type() == CPU_R6000 || if (current_cpu_type() == CPU_R6000 ||
current_cpu_type() == CPU_R6000A) { current_cpu_type() == CPU_R6000A) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment