lkml.org 
[lkml]   [2017]   [Oct]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 26/64] powerpc/tm: Flush TM only if CPU has TM feature
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Gustavo Romero <gromero@linux.vnet.ibm.com>

    commit c1fa0768a8713b135848f78fd43ffc208d8ded70 upstream.

    Commit cd63f3c ("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.

    Fixes: cd63f3c ("powerpc/tm: Fix saving of TM SPRs in core dump")
    Signed-off-by: Gustavo Romero <gromero@linux.vnet.ibm.com>
    Reviewed-by: Cyril Bur <cyrilbur@gmail.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
    index 07cd22e35405..f52ad5bb7109 100644
    --- a/arch/powerpc/kernel/ptrace.c
    +++ b/arch/powerpc/kernel/ptrace.c
    @@ -131,7 +131,7 @@ static void flush_tmregs_to_thread(struct task_struct *tsk)
    * in the appropriate thread structures from live.
    */

    - if (tsk != current)
    + if ((!cpu_has_feature(CPU_FTR_TM)) || (tsk != current))
    return;

    if (MSR_TM_SUSPENDED(mfmsr())) {

    \
     
     \ /
      Last update: 2017-10-03 15:06    [W:4.064 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site