Skip to content
  • Michael Neuling's avatar
    powerpc/tm: Fix FP and VMX register corruption · f48e91e8
    Michael Neuling authored
    In commit dc310669 ("powerpc: tm: Always use fp_state and vr_state
    to store live registers"), a section of code was removed that copied
    the current state to checkpointed state. That code should not have been
    removed.
    
    When an FP (Floating Point) unavailable is taken inside a transaction,
    we need to abort the transaction. This is because at the time of the
    tbegin, the FP state is bogus so the state stored in the checkpointed
    registers is incorrect. To fix this, we treclaim (to get the
    checkpointed GPRs) and then copy the thread_struct FP live state into
    the checkpointed state. We then trecheckpoint so that the FP state is
    correctly restored into the CPU.
    
    The copying of the FP registers from live to checkpointed is what was
    missing.
    
    This simplifies the logic slightly from the original patch.
    tm_reclaim_thread() will now always write the checkpointed FP
    state. Either the checkpointed FP state will be written as part of
    the actual treclaim (in tm.S), or it'll be a copy of the live
    state. Which one we use is based on MSR[FP] from userspace.
    
    Similarly for VMX.
    
    Fixes: dc310669
    
     ("powerpc: tm: Always use fp_state and vr_state to store live registers")
    Cc: stable@vger.kernel.org # 4.9+
    Signed-off-by: default avatarMichael Neuling <mikey@neuling.org>
    Reviewed-by: default avatar <cyrilbur@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    f48e91e8