| From: Breno Leitao <leitao@debian.org> |
| Date: Wed, 9 Jan 2019 11:16:45 -0200 |
| Subject: powerpc/tm: Limit TM code inside PPC_TRANSACTIONAL_MEM |
| |
| commit 897bc3df8c5aebb54c32d831f917592e873d0559 upstream. |
| |
| Commit e1c3743e1a20 ("powerpc/tm: Set MSR[TS] just prior to recheckpoint") |
| moved a code block around and this block uses a 'msr' variable outside of |
| the CONFIG_PPC_TRANSACTIONAL_MEM, however the 'msr' variable is declared |
| inside a CONFIG_PPC_TRANSACTIONAL_MEM block, causing a possible error when |
| CONFIG_PPC_TRANSACTION_MEM is not defined. |
| |
| error: 'msr' undeclared (first use in this function) |
| |
| This is not causing a compilation error in the mainline kernel, because |
| 'msr' is being used as an argument of MSR_TM_ACTIVE(), which is defined as |
| the following when CONFIG_PPC_TRANSACTIONAL_MEM is *not* set: |
| |
| #define MSR_TM_ACTIVE(x) 0 |
| |
| This patch just fixes this issue avoiding the 'msr' variable usage outside |
| the CONFIG_PPC_TRANSACTIONAL_MEM block, avoiding trusting in the |
| MSR_TM_ACTIVE() definition. |
| |
| Reported-by: Christoph Biedl <linux-kernel.bfrz@manchmal.in-ulm.de> |
| Fixes: e1c3743e1a20 ("powerpc/tm: Set MSR[TS] just prior to recheckpoint") |
| Signed-off-by: Breno Leitao <leitao@debian.org> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| arch/powerpc/kernel/signal_64.c | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| --- a/arch/powerpc/kernel/signal_64.c |
| +++ b/arch/powerpc/kernel/signal_64.c |
| @@ -707,11 +707,12 @@ int sys_rt_sigreturn(unsigned long r3, u |
| if (restore_tm_sigcontexts(regs, &uc->uc_mcontext, |
| &uc_transact->uc_mcontext)) |
| goto badframe; |
| - } |
| + } else |
| #endif |
| - /* Fall through, for non-TM restore */ |
| - if (!MSR_TM_ACTIVE(msr)) { |
| + { |
| /* |
| + * Fall through, for non-TM restore |
| + * |
| * Unset MSR[TS] on the thread regs since MSR from user |
| * context does not have MSR active, and recheckpoint was |
| * not called since restore_tm_sigcontexts() was not called |