Commit c1fa0768 authored by Gustavo Romero's avatar Gustavo Romero Committed by Michael Ellerman

powerpc/tm: Flush TM only if CPU has TM feature

Commit cd63f3cf ("powerpc/tm: Fix saving of TM SPRs in core dump")
added code to access TM SPRs in flush_tmregs_to_thread(). However
flush_tmregs_to_thread() does not check if TM feature is available on
CPU before trying to access TM SPRs in order to copy live state to
thread structures. flush_tmregs_to_thread() is indeed guarded by
CONFIG_PPC_TRANSACTIONAL_MEM but it might be the case that kernel
was compiled with CONFIG_PPC_TRANSACTIONAL_MEM enabled and ran on
a CPU without TM feature available, thus rendering the execution
of TM instructions that are treated by the CPU as illegal instructions.

The fix is just to add proper checking in flush_tmregs_to_thread()
if CPU has the TM feature before accessing any TM-specific resource,
returning immediately if TM is no available on the CPU. Adding
that checking in flush_tmregs_to_thread() instead of in places
where it is called, like in vsr_get() and vsr_set(), is better because
avoids the same problem cropping up elsewhere.

Cc: stable@vger.kernel.org # v4.13+
Fixes: cd63f3cf ("powerpc/tm: Fix saving of TM SPRs in core dump")
Signed-off-by: default avatarGustavo Romero <gromero@linux.vnet.ibm.com>
Reviewed-by: default avatarCyril Bur <cyrilbur@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 4917fcb5
...@@ -131,7 +131,7 @@ static void flush_tmregs_to_thread(struct task_struct *tsk) ...@@ -131,7 +131,7 @@ static void flush_tmregs_to_thread(struct task_struct *tsk)
* in the appropriate thread structures from live. * in the appropriate thread structures from live.
*/ */
if (tsk != current) if ((!cpu_has_feature(CPU_FTR_TM)) || (tsk != current))
return; return;
if (MSR_TM_SUSPENDED(mfmsr())) { if (MSR_TM_SUSPENDED(mfmsr())) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment