diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-08-18 14:11:03 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-08-18 14:11:03 -0400 |
commit | 039a8e38473323ed9f6c4415b4c3a36777efac34 (patch) | |
tree | 315d9235076a263249b8ee365b3eed51b13ab6b5 | |
parent | 42833468027770b8b731e3d9620165873439d237 (diff) | |
parent | 5a69aec945d27e78abac9fd032533d3aaebf7c1e (diff) |
Merge tag 'powerpc-4.13-7' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
Pull powerpc fixes from Michael Ellerman:
"A bug in the VSX register saving that could cause userspace FP/VMX
register corruption.
Never seen to happen (that we know of), was found by code inspection,
but still tagged for stable given the consequences"
* tag 'powerpc-4.13-7' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
powerpc: Fix VSX enabling/flushing to also test MSR_FP and MSR_VEC
-rw-r--r-- | arch/powerpc/kernel/process.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index ec480966f9bf..1f0fd361e09b 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -362,7 +362,8 @@ void enable_kernel_vsx(void) | |||
362 | 362 | ||
363 | cpumsr = msr_check_and_set(MSR_FP|MSR_VEC|MSR_VSX); | 363 | cpumsr = msr_check_and_set(MSR_FP|MSR_VEC|MSR_VSX); |
364 | 364 | ||
365 | if (current->thread.regs && (current->thread.regs->msr & MSR_VSX)) { | 365 | if (current->thread.regs && |
366 | (current->thread.regs->msr & (MSR_VSX|MSR_VEC|MSR_FP))) { | ||
366 | check_if_tm_restore_required(current); | 367 | check_if_tm_restore_required(current); |
367 | /* | 368 | /* |
368 | * If a thread has already been reclaimed then the | 369 | * If a thread has already been reclaimed then the |
@@ -386,7 +387,7 @@ void flush_vsx_to_thread(struct task_struct *tsk) | |||
386 | { | 387 | { |
387 | if (tsk->thread.regs) { | 388 | if (tsk->thread.regs) { |
388 | preempt_disable(); | 389 | preempt_disable(); |
389 | if (tsk->thread.regs->msr & MSR_VSX) { | 390 | if (tsk->thread.regs->msr & (MSR_VSX|MSR_VEC|MSR_FP)) { |
390 | BUG_ON(tsk != current); | 391 | BUG_ON(tsk != current); |
391 | giveup_vsx(tsk); | 392 | giveup_vsx(tsk); |
392 | } | 393 | } |