linux/arch/powerpc
Breno Leitao d412deb85a powerpc/tm: Unset MSR[TS] if not recheckpointing
commit 6f5b9f018f upstream.

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: 2b0a576d15 ("powerpc: Add new transactional memory state to the signal context")
CC: Stable <stable@vger.kernel.org>	# 3.10+
Signed-off-by: Breno Leitao <leitao@debian.org>
Tested-by: Michal Suchánek <msuchanek@suse.de>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2019-01-09 17:46:00 +01:00
..
boot powerpc/boot: Fix build failures with -j 1 2018-12-06 16:10:15 +11:00
configs powerpc/config: Enable CONFIG_PRINTK_TIME 2018-10-03 15:40:06 +10:00
crypto powerpc updates for 4.19 2018-08-17 11:32:50 -07:00
include powerpc/bpf: Fix broken uapi for BPF_PROG_TYPE_PERF_EVENT 2018-12-07 23:19:04 +11:00
kernel powerpc/tm: Unset MSR[TS] if not recheckpointing 2019-01-09 17:46:00 +01:00
kvm KVM: PPC: Book3S HV: Fix race between kvm_unmap_hva_range and MMU mode switch 2019-01-09 17:45:55 +01:00
lib memblock: stop using implicit alignment to SMP_CACHE_BYTES 2018-10-31 08:54:16 -07:00
math-emu License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mm powerpc/mm: Fallback to RAM if the altmap is unusable 2018-12-09 21:33:21 +11:00
net bpf: powerpc64: optimize JIT passes for bpf function calls 2018-12-03 23:47:05 +01:00
oprofile powerpc updates for 4.20 2018-10-26 14:36:21 -07:00
perf powerpc/8xx: Use patch_site for perf counters setup 2018-10-26 21:58:58 +11:00
platforms powerpc/papr_scm: Use ibm,unit-guid as the iset cookie 2018-12-09 21:32:51 +11:00
purgatory powerpc updates for 4.19 2018-08-17 11:32:50 -07:00
sysdev memblock: stop using implicit alignment to SMP_CACHE_BYTES 2018-10-31 08:54:16 -07:00
tools powerpc: Add a checkpatch wrapper with our preferred settings 2018-08-07 21:49:25 +10:00
xmon powerpc/xmon: Relax frame size for clang 2018-10-31 20:39:25 +11:00
Kbuild powerpc: Add -Werror at arch/powerpc level 2018-10-19 00:56:17 +11:00
Kconfig Kbuild updates for v4.20 (2nd) 2018-11-03 10:47:33 -07:00
Kconfig.debug powerpc: remove redundant 'default n' from Kconfig-s 2018-10-13 22:21:25 +11:00
Makefile kbuild: replace cc-name test with CONFIG_CC_IS_CLANG 2018-11-02 22:49:00 +09:00
Makefile.postlink License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00