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: Paul Burton <paul.burton@imgtec.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/6432/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
1db1af84d6
commit
2bcb3fbc3f
|
@ -475,6 +475,7 @@ NESTED(nmi_handler, PT_SIZE, sp)
|
|||
BUILD_HANDLER cpu cpu sti silent /* #11 */
|
||||
BUILD_HANDLER ov ov sti silent /* #12 */
|
||||
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 ftlb ftlb none silent /* #16 */
|
||||
BUILD_HANDLER msa msa sti silent /* #21 */
|
||||
|
|
|
@ -78,6 +78,7 @@ extern asmlinkage void handle_ri_rdhwr(void);
|
|||
extern asmlinkage void handle_cpu(void);
|
||||
extern asmlinkage void handle_ov(void);
|
||||
extern asmlinkage void handle_tr(void);
|
||||
extern asmlinkage void handle_msa_fpe(void);
|
||||
extern asmlinkage void handle_fpe(void);
|
||||
extern asmlinkage void handle_ftlb(void);
|
||||
extern asmlinkage void handle_msa(void);
|
||||
|
@ -1250,6 +1251,16 @@ out:
|
|||
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)
|
||||
{
|
||||
enum ctx_state prev_state;
|
||||
|
@ -2106,6 +2117,7 @@ void __init trap_init(void)
|
|||
set_except_vector(11, handle_cpu);
|
||||
set_except_vector(12, handle_ov);
|
||||
set_except_vector(13, handle_tr);
|
||||
set_except_vector(14, handle_msa_fpe);
|
||||
|
||||
if (current_cpu_type() == CPU_R6000 ||
|
||||
current_cpu_type() == CPU_R6000A) {
|
||||
|
|
Loading…
Reference in a new issue