• Breno Leitao's avatar
    powerpc/tm: Unset MSR[TS] if not recheckpointing · 6f5b9f01
    Breno Leitao authored
    There is a TM Bad Thing bug that can be caused when you return from a
    signal context in a suspended transaction but with ucontext MSR[TS] unset.
    
    This forces regs->msr[TS] to be set at syscall entrance (since the CPU
    state is transactional). It also calls treclaim() to flush the transaction
    state, which is done based on the live (mfmsr) MSR state.
    
    Since user context MSR[TS] is not set, then restore_tm_sigcontexts() is not
    called, thus, not executing recheckpoint, keeping the CPU state as not
    transactional. When calling rfid, SRR1 will have MSR[TS] set, but the CPU
    state is non transactional, causing the TM Bad Thing with the following
    stack:
    
    	[   33.862316] Bad kernel stack pointer 3fffd9dce3e0 at c00000000000c47c
    	cpu 0x8: Vector: 700 (Program Check) at [c00000003ff7fd40]
    	    pc: c00000000000c47c: fast_exception_return+0xac/0xb4
    	    lr: 00003fff865f442c
    	    sp: 3fffd9dce3e0
    	   msr: 8000000102a03031
    	  current = 0xc00000041f68b700
    	  paca    = 0xc00000000fb84800   softe: 0        irq_happened: 0x01
    	    pid   = 1721, comm = tm-signal-sigre
    	Linux version 4.9.0-3-powerpc64le (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18) ) #1 SMP Debian 4.9.30-2+deb9u2 (2017-06-26)
    	WARNING: exception is not recoverable, can't continue
    
    The same problem happens on 32-bits signal handler, and the fix is very
    similar, if tm_recheckpoint() is not executed, then regs->msr[TS] should be
    zeroed.
    
    This patch also fixes a sparse warning related to lack of indentation when
    CONFIG_PPC_TRANSACTIONAL_MEM is set.
    
    Fixes: 2b0a576d ("powerpc: Add new transactional memory state to the signal context")
    CC: Stable <stable@vger.kernel.org>	# 3.10+
    Signed-off-by: default avatarBreno Leitao <leitao@debian.org>
    Tested-by: default avatarMichal Suchánek <msuchanek@suse.de>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    6f5b9f01
signal_32.c 41.9 KB