diff options
Diffstat (limited to 'arch/ppc64/kernel')
-rw-r--r-- | arch/ppc64/kernel/align.c | 4 | ||||
-rw-r--r-- | arch/ppc64/kernel/head.S | 59 | ||||
-rw-r--r-- | arch/ppc64/kernel/misc.S | 51 | ||||
-rw-r--r-- | arch/ppc64/kernel/signal.c | 2 |
4 files changed, 5 insertions, 111 deletions
diff --git a/arch/ppc64/kernel/align.c b/arch/ppc64/kernel/align.c index 330e7ef81427..256d5b592aa1 100644 --- a/arch/ppc64/kernel/align.c +++ b/arch/ppc64/kernel/align.c | |||
@@ -313,7 +313,7 @@ fix_alignment(struct pt_regs *regs) | |||
313 | /* Doing stfs, have to convert to single */ | 313 | /* Doing stfs, have to convert to single */ |
314 | preempt_disable(); | 314 | preempt_disable(); |
315 | enable_kernel_fp(); | 315 | enable_kernel_fp(); |
316 | cvt_df(¤t->thread.fpr[reg], (float *)&data.v[4], ¤t->thread.fpscr); | 316 | cvt_df(¤t->thread.fpr[reg], (float *)&data.v[4], ¤t->thread); |
317 | disable_kernel_fp(); | 317 | disable_kernel_fp(); |
318 | preempt_enable(); | 318 | preempt_enable(); |
319 | } | 319 | } |
@@ -349,7 +349,7 @@ fix_alignment(struct pt_regs *regs) | |||
349 | /* Doing lfs, have to convert to double */ | 349 | /* Doing lfs, have to convert to double */ |
350 | preempt_disable(); | 350 | preempt_disable(); |
351 | enable_kernel_fp(); | 351 | enable_kernel_fp(); |
352 | cvt_fd((float *)&data.v[4], ¤t->thread.fpr[reg], ¤t->thread.fpscr); | 352 | cvt_fd((float *)&data.v[4], ¤t->thread.fpr[reg], ¤t->thread); |
353 | disable_kernel_fp(); | 353 | disable_kernel_fp(); |
354 | preempt_enable(); | 354 | preempt_enable(); |
355 | } | 355 | } |
diff --git a/arch/ppc64/kernel/head.S b/arch/ppc64/kernel/head.S index f58af9c246cb..929f9f42cf7a 100644 --- a/arch/ppc64/kernel/head.S +++ b/arch/ppc64/kernel/head.S | |||
@@ -81,7 +81,7 @@ _stext: | |||
81 | _GLOBAL(__start) | 81 | _GLOBAL(__start) |
82 | /* NOP this out unconditionally */ | 82 | /* NOP this out unconditionally */ |
83 | BEGIN_FTR_SECTION | 83 | BEGIN_FTR_SECTION |
84 | b .__start_initialization_multiplatform | 84 | b .__start_initialization_multiplatform |
85 | END_FTR_SECTION(0, 1) | 85 | END_FTR_SECTION(0, 1) |
86 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | 86 | #endif /* CONFIG_PPC_MULTIPLATFORM */ |
87 | 87 | ||
@@ -747,6 +747,7 @@ bad_stack: | |||
747 | * any task or sent any task a signal, you should use | 747 | * any task or sent any task a signal, you should use |
748 | * ret_from_except or ret_from_except_lite instead of this. | 748 | * ret_from_except or ret_from_except_lite instead of this. |
749 | */ | 749 | */ |
750 | .globl fast_exception_return | ||
750 | fast_exception_return: | 751 | fast_exception_return: |
751 | ld r12,_MSR(r1) | 752 | ld r12,_MSR(r1) |
752 | ld r11,_NIP(r1) | 753 | ld r11,_NIP(r1) |
@@ -858,62 +859,6 @@ fp_unavailable_common: | |||
858 | bl .kernel_fp_unavailable_exception | 859 | bl .kernel_fp_unavailable_exception |
859 | BUG_OPCODE | 860 | BUG_OPCODE |
860 | 861 | ||
861 | /* | ||
862 | * load_up_fpu(unused, unused, tsk) | ||
863 | * Disable FP for the task which had the FPU previously, | ||
864 | * and save its floating-point registers in its thread_struct. | ||
865 | * Enables the FPU for use in the kernel on return. | ||
866 | * On SMP we know the fpu is free, since we give it up every | ||
867 | * switch (ie, no lazy save of the FP registers). | ||
868 | * On entry: r13 == 'current' && last_task_used_math != 'current' | ||
869 | */ | ||
870 | _STATIC(load_up_fpu) | ||
871 | mfmsr r5 /* grab the current MSR */ | ||
872 | ori r5,r5,MSR_FP | ||
873 | mtmsrd r5 /* enable use of fpu now */ | ||
874 | isync | ||
875 | /* | ||
876 | * For SMP, we don't do lazy FPU switching because it just gets too | ||
877 | * horrendously complex, especially when a task switches from one CPU | ||
878 | * to another. Instead we call giveup_fpu in switch_to. | ||
879 | * | ||
880 | */ | ||
881 | #ifndef CONFIG_SMP | ||
882 | ld r3,last_task_used_math@got(r2) | ||
883 | ld r4,0(r3) | ||
884 | cmpdi 0,r4,0 | ||
885 | beq 1f | ||
886 | /* Save FP state to last_task_used_math's THREAD struct */ | ||
887 | addi r4,r4,THREAD | ||
888 | SAVE_32FPRS(0, r4) | ||
889 | mffs fr0 | ||
890 | stfd fr0,THREAD_FPSCR(r4) | ||
891 | /* Disable FP for last_task_used_math */ | ||
892 | ld r5,PT_REGS(r4) | ||
893 | ld r4,_MSR-STACK_FRAME_OVERHEAD(r5) | ||
894 | li r6,MSR_FP|MSR_FE0|MSR_FE1 | ||
895 | andc r4,r4,r6 | ||
896 | std r4,_MSR-STACK_FRAME_OVERHEAD(r5) | ||
897 | 1: | ||
898 | #endif /* CONFIG_SMP */ | ||
899 | /* enable use of FP after return */ | ||
900 | ld r4,PACACURRENT(r13) | ||
901 | addi r5,r4,THREAD /* Get THREAD */ | ||
902 | ld r4,THREAD_FPEXC_MODE(r5) | ||
903 | ori r12,r12,MSR_FP | ||
904 | or r12,r12,r4 | ||
905 | std r12,_MSR(r1) | ||
906 | lfd fr0,THREAD_FPSCR(r5) | ||
907 | mtfsf 0xff,fr0 | ||
908 | REST_32FPRS(0, r5) | ||
909 | #ifndef CONFIG_SMP | ||
910 | /* Update last_task_used_math to 'current' */ | ||
911 | subi r4,r5,THREAD /* Back to 'current' */ | ||
912 | std r4,0(r3) | ||
913 | #endif /* CONFIG_SMP */ | ||
914 | /* restore registers and return */ | ||
915 | b fast_exception_return | ||
916 | |||
917 | .align 7 | 862 | .align 7 |
918 | .globl altivec_unavailable_common | 863 | .globl altivec_unavailable_common |
919 | altivec_unavailable_common: | 864 | altivec_unavailable_common: |
diff --git a/arch/ppc64/kernel/misc.S b/arch/ppc64/kernel/misc.S index a33448c2bd91..9cae3d5c40e6 100644 --- a/arch/ppc64/kernel/misc.S +++ b/arch/ppc64/kernel/misc.S | |||
@@ -451,25 +451,6 @@ _GLOBAL(_outsl_ns) | |||
451 | sync | 451 | sync |
452 | blr | 452 | blr |
453 | 453 | ||
454 | |||
455 | _GLOBAL(cvt_fd) | ||
456 | lfd 0,0(r5) /* load up fpscr value */ | ||
457 | mtfsf 0xff,0 | ||
458 | lfs 0,0(r3) | ||
459 | stfd 0,0(r4) | ||
460 | mffs 0 /* save new fpscr value */ | ||
461 | stfd 0,0(r5) | ||
462 | blr | ||
463 | |||
464 | _GLOBAL(cvt_df) | ||
465 | lfd 0,0(r5) /* load up fpscr value */ | ||
466 | mtfsf 0xff,0 | ||
467 | lfd 0,0(r3) | ||
468 | stfs 0,0(r4) | ||
469 | mffs 0 /* save new fpscr value */ | ||
470 | stfd 0,0(r5) | ||
471 | blr | ||
472 | |||
473 | /* | 454 | /* |
474 | * identify_cpu and calls setup_cpu | 455 | * identify_cpu and calls setup_cpu |
475 | * In: r3 = base of the cpu_specs array | 456 | * In: r3 = base of the cpu_specs array |
@@ -655,38 +636,6 @@ _GLOBAL(disable_kernel_fp) | |||
655 | isync | 636 | isync |
656 | blr | 637 | blr |
657 | 638 | ||
658 | /* | ||
659 | * giveup_fpu(tsk) | ||
660 | * Disable FP for the task given as the argument, | ||
661 | * and save the floating-point registers in its thread_struct. | ||
662 | * Enables the FPU for use in the kernel on return. | ||
663 | */ | ||
664 | _GLOBAL(giveup_fpu) | ||
665 | mfmsr r5 | ||
666 | ori r5,r5,MSR_FP | ||
667 | mtmsrd r5 /* enable use of fpu now */ | ||
668 | isync | ||
669 | cmpdi 0,r3,0 | ||
670 | beqlr- /* if no previous owner, done */ | ||
671 | addi r3,r3,THREAD /* want THREAD of task */ | ||
672 | ld r5,PT_REGS(r3) | ||
673 | cmpdi 0,r5,0 | ||
674 | SAVE_32FPRS(0, r3) | ||
675 | mffs fr0 | ||
676 | stfd fr0,THREAD_FPSCR(r3) | ||
677 | beq 1f | ||
678 | ld r4,_MSR-STACK_FRAME_OVERHEAD(r5) | ||
679 | li r3,MSR_FP|MSR_FE0|MSR_FE1 | ||
680 | andc r4,r4,r3 /* disable FP for previous task */ | ||
681 | std r4,_MSR-STACK_FRAME_OVERHEAD(r5) | ||
682 | 1: | ||
683 | #ifndef CONFIG_SMP | ||
684 | li r5,0 | ||
685 | ld r4,last_task_used_math@got(r2) | ||
686 | std r5,0(r4) | ||
687 | #endif /* CONFIG_SMP */ | ||
688 | blr | ||
689 | |||
690 | #ifdef CONFIG_ALTIVEC | 639 | #ifdef CONFIG_ALTIVEC |
691 | 640 | ||
692 | #if 0 /* this has no callers for now */ | 641 | #if 0 /* this has no callers for now */ |
diff --git a/arch/ppc64/kernel/signal.c b/arch/ppc64/kernel/signal.c index 347112cca3c0..ec9d0984b6a0 100644 --- a/arch/ppc64/kernel/signal.c +++ b/arch/ppc64/kernel/signal.c | |||
@@ -133,7 +133,7 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | |||
133 | flush_fp_to_thread(current); | 133 | flush_fp_to_thread(current); |
134 | 134 | ||
135 | /* Make sure signal doesn't get spurrious FP exceptions */ | 135 | /* Make sure signal doesn't get spurrious FP exceptions */ |
136 | current->thread.fpscr = 0; | 136 | current->thread.fpscr.val = 0; |
137 | 137 | ||
138 | #ifdef CONFIG_ALTIVEC | 138 | #ifdef CONFIG_ALTIVEC |
139 | err |= __put_user(v_regs, &sc->v_regs); | 139 | err |= __put_user(v_regs, &sc->v_regs); |