Skip to content

Commit

Permalink
powerpc: Fix VSX enabling/flushing to also test MSR_FP and MSR_VEC
Browse files Browse the repository at this point in the history
VSX uses a combination of the old vector registers, the old FP
registers and new "second halves" of the FP registers.

Thus when we need to see the VSX state in the thread struct
(flush_vsx_to_thread()) or when we'll use the VSX in the kernel
(enable_kernel_vsx()) we need to ensure they are all flushed into
the thread struct if either of them is individually enabled.

Unfortunately we only tested if the whole VSX was enabled, not if they
were individually enabled.

Fixes: 72cd7b4 ("powerpc: Uncomment and make enable_kernel_vsx() routine available")
Cc: [email protected] # v4.3+
Signed-off-by: Benjamin Herrenschmidt <[email protected]>
Signed-off-by: Michael Ellerman <[email protected]>
  • Loading branch information
ozbenh authored and mpe committed Aug 16, 2017
1 parent 96ea91e commit 5a69aec
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions arch/powerpc/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,8 @@ void enable_kernel_vsx(void)

cpumsr = msr_check_and_set(MSR_FP|MSR_VEC|MSR_VSX);

if (current->thread.regs && (current->thread.regs->msr & MSR_VSX)) {
if (current->thread.regs &&
(current->thread.regs->msr & (MSR_VSX|MSR_VEC|MSR_FP))) {
check_if_tm_restore_required(current);
/*
* If a thread has already been reclaimed then the
Expand All @@ -386,7 +387,7 @@ void flush_vsx_to_thread(struct task_struct *tsk)
{
if (tsk->thread.regs) {
preempt_disable();
if (tsk->thread.regs->msr & MSR_VSX) {
if (tsk->thread.regs->msr & (MSR_VSX|MSR_VEC|MSR_FP)) {
BUG_ON(tsk != current);
giveup_vsx(tsk);
}
Expand Down

0 comments on commit 5a69aec

Please sign in to comment.