]> git.itanic.dy.fi Git - linux-stable/commit
alpha: fix FEN fault handling
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 7 Jan 2023 00:25:59 +0000 (19:25 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 11 Jan 2023 20:34:43 +0000 (15:34 -0500)
commit977a3009547dad4a5bc95d91be4a58c9f7eedac0
treeb4e252eb5e3eddcb2ec5cc335906288f0ad22ce7
parentb7bfaa761d760e72a969d116517eaa12e404c262
alpha: fix FEN fault handling

Type 3 instruction fault (FPU insn with FPU disabled) is handled
by quietly enabling FPU and returning.  Which is fine, except that
we need to do that both for fault in userland and in the kernel;
the latter *can* legitimately happen - all it takes is this:

.global _start
_start:
        call_pal 0xae
lda $0, 0
ldq $0, 0($0)

- call_pal CLRFEN to clear "FPU enabled" flag and arrange for
a signal delivery (SIGSEGV in this case).

Fixed by moving the handling of type 3 into the common part of
do_entIF(), before we check for kernel vs. user mode.

Incidentally, the check for kernel mode is unidiomatic; the normal
way to do that is !user_mode(regs).  The difference is that
the open-coded variant treats any of bits 63..3 of regs->ps being
set as "it's user mode" while the normal approach is to check just
the bit 3.  PS is a 4-bit register and regs->ps always will have
bits 63..4 clear, so the open-coded variant here is actually equivalent
to !user_mode(regs).  Harder to follow, though...

Cc: stable@vger.kernel.org
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/alpha/kernel/traps.c