xtensa: add trap handler for division by zero
authorMax Filippov <jcmvbkbc@gmail.com>
Fri, 13 May 2022 10:40:54 +0000 (03:40 -0700)
committerMax Filippov <jcmvbkbc@gmail.com>
Fri, 13 May 2022 15:43:36 +0000 (08:43 -0700)
Add c-level handler for the division by zero exception and kill the task
if it was thrown from the kernel space or send SIGFPE otherwise.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
arch/xtensa/kernel/traps.c

index 138a86fbe9d70e9d99e2cc6b204f591feeab88b6..24d11b44fa572d5bfbfa36282781c1f6060797ea 100644 (file)
@@ -49,6 +49,7 @@
  */
 
 static void do_illegal_instruction(struct pt_regs *regs);
+static void do_div0(struct pt_regs *regs);
 static void do_interrupt(struct pt_regs *regs);
 #if XTENSA_FAKE_NMI
 static void do_nmi(struct pt_regs *regs);
@@ -95,7 +96,7 @@ static dispatch_init_table_t __initdata dispatch_init_table[] = {
 #ifdef SUPPORT_WINDOWED
 { EXCCAUSE_ALLOCA,             USER|KRNL, fast_alloca },
 #endif
-/* EXCCAUSE_INTEGER_DIVIDE_BY_ZERO unhandled */
+{ EXCCAUSE_INTEGER_DIVIDE_BY_ZERO, 0,     do_div0 },
 /* EXCCAUSE_PRIVILEGED unhandled */
 #if XCHAL_UNALIGNED_LOAD_EXCEPTION || XCHAL_UNALIGNED_STORE_EXCEPTION
 #ifdef CONFIG_XTENSA_UNALIGNED_USER
@@ -307,6 +308,11 @@ static void do_illegal_instruction(struct pt_regs *regs)
        force_sig(SIGILL);
 }
 
+static void do_div0(struct pt_regs *regs)
+{
+       __die_if_kernel("Unhandled division by 0 in kernel", regs, SIGKILL);
+       force_sig_fault(SIGFPE, FPE_INTDIV, (void __user *)regs->pc);
+}
 
 /*
  * Handle unaligned memory accesses from user space. Kill task.