• Nicholas Piggin's avatar
    powerpc/64s: Mask SRR0 before checking against the masked NIP · aee101d7
    Nicholas Piggin authored
    Commit 314f6c23 ("powerpc/64s: Mask NIP before checking against
    SRR0") masked off the low 2 bits of the NIP value in the interrupt
    stack frame in case they are non-zero and mis-compare against a SRR0
    register value of a CPU which always reads back 0 from the 2 low bits
    which are reserved.
    
    This now causes the opposite problem that an implementation which does
    implement those bits in SRR0 will mis-compare against the masked NIP
    value in which they have been cleared. QEMU is one such implementation,
    and this is allowed by the architecture.
    
    This can be triggered by sigfuz by setting low bits of PT_NIP in the
    signal context.
    
    Fix this for now by masking the SRR0 bits as well. Cleaner is probably
    to sanitise these values before putting them in registers or stack, but
    this is the quick and backportable fix.
    
    Fixes: 314f6c23 ("powerpc/64s: Mask NIP before checking against SRR0")
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20220117134403.2995059-1-npiggin@gmail.com
    aee101d7
interrupt_64.S 16.4 KB