• Al Viro's avatar
    alpha: fix FEN fault handling · d3c51b70
    Al Viro authored
    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, 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-code variant here is actually equivalent
    to !user_mode(regs).  Harder to follow, though...
    
    Reproducer above will crash any box where CLRFEN is not ignored by
    PAL (== any actual hardware, AFAICS; PAL used in qemu doesn't
    bother implementing that crap).
    
    Cc: stable@vger.kernel.org # all way back...
    Reviewed-by: default avatarRichard Henderson <rth@twiddle.net>
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: default avatarMatt Turner <mattst88@gmail.com>
    d3c51b70
traps.c 25.1 KB