aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/signal_32.c
diff options
context:
space:
mode:
authorAnton Blanchard <anton@samba.org>2015-10-28 20:44:02 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2015-11-30 21:52:25 -0500
commita7d623d4d053ccb0cdfad210bced2ec25ddf69a2 (patch)
treeb1bcf400b9c53c66d483bb641f98fb6e2f270bf9 /arch/powerpc/kernel/signal_32.c
parent98da581e0846f6d932a4bc46a55458140e20478a (diff)
powerpc: Move part of giveup_vsx into c
Move the MSR modification into c. Removing it from the assembly function will allow us to avoid costly MSR writes by batching them up. Check the FP and VMX bits before calling the relevant giveup_*() function. This makes giveup_vsx() and flush_vsx_to_thread() perform more like their sister functions, and allows us to use flush_vsx_to_thread() in the signal code. Move the check_if_tm_restore_required() check in. Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc/kernel/signal_32.c')
-rw-r--r--arch/powerpc/kernel/signal_32.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
index 3cd7a32c8ff4..4022cbb7e2d6 100644
--- a/arch/powerpc/kernel/signal_32.c
+++ b/arch/powerpc/kernel/signal_32.c
@@ -458,7 +458,7 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,
458 * contains valid data 458 * contains valid data
459 */ 459 */
460 if (current->thread.used_vsr && ctx_has_vsx_region) { 460 if (current->thread.used_vsr && ctx_has_vsx_region) {
461 __giveup_vsx(current); 461 flush_vsx_to_thread(current);
462 if (copy_vsx_to_user(&frame->mc_vsregs, current)) 462 if (copy_vsx_to_user(&frame->mc_vsregs, current))
463 return 1; 463 return 1;
464 msr |= MSR_VSX; 464 msr |= MSR_VSX;
@@ -606,7 +606,7 @@ static int save_tm_user_regs(struct pt_regs *regs,
606 * contains valid data 606 * contains valid data
607 */ 607 */
608 if (current->thread.used_vsr) { 608 if (current->thread.used_vsr) {
609 __giveup_vsx(current); 609 flush_vsx_to_thread(current);
610 if (copy_vsx_to_user(&frame->mc_vsregs, current)) 610 if (copy_vsx_to_user(&frame->mc_vsregs, current))
611 return 1; 611 return 1;
612 if (msr & MSR_VSX) { 612 if (msr & MSR_VSX) {