diff options
Diffstat (limited to 'arch/powerpc/kernel/fpu.S')
| -rw-r--r-- | arch/powerpc/kernel/fpu.S | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/fpu.S b/arch/powerpc/kernel/fpu.S index 563d445ff584..51fd78da25b7 100644 --- a/arch/powerpc/kernel/fpu.S +++ b/arch/powerpc/kernel/fpu.S | |||
| @@ -48,7 +48,7 @@ _GLOBAL(load_up_fpu) | |||
| 48 | addi r4,r4,THREAD /* want last_task_used_math->thread */ | 48 | addi r4,r4,THREAD /* want last_task_used_math->thread */ |
| 49 | SAVE_32FPRS(0, r4) | 49 | SAVE_32FPRS(0, r4) |
| 50 | mffs fr0 | 50 | mffs fr0 |
| 51 | stfd fr0,THREAD_FPSCR-4(r4) | 51 | stfd fr0,THREAD_FPSCR(r4) |
| 52 | LDL r5,PT_REGS(r4) | 52 | LDL r5,PT_REGS(r4) |
| 53 | tophys(r5,r5) | 53 | tophys(r5,r5) |
| 54 | LDL r4,_MSR-STACK_FRAME_OVERHEAD(r5) | 54 | LDL r4,_MSR-STACK_FRAME_OVERHEAD(r5) |
| @@ -71,7 +71,7 @@ _GLOBAL(load_up_fpu) | |||
| 71 | or r12,r12,r4 | 71 | or r12,r12,r4 |
| 72 | std r12,_MSR(r1) | 72 | std r12,_MSR(r1) |
| 73 | #endif | 73 | #endif |
| 74 | lfd fr0,THREAD_FPSCR-4(r5) | 74 | lfd fr0,THREAD_FPSCR(r5) |
| 75 | mtfsf 0xff,fr0 | 75 | mtfsf 0xff,fr0 |
| 76 | REST_32FPRS(0, r5) | 76 | REST_32FPRS(0, r5) |
| 77 | #ifndef CONFIG_SMP | 77 | #ifndef CONFIG_SMP |
| @@ -104,7 +104,7 @@ _GLOBAL(giveup_fpu) | |||
| 104 | CMPI 0,r5,0 | 104 | CMPI 0,r5,0 |
| 105 | SAVE_32FPRS(0, r3) | 105 | SAVE_32FPRS(0, r3) |
| 106 | mffs fr0 | 106 | mffs fr0 |
| 107 | stfd fr0,THREAD_FPSCR-4(r3) | 107 | stfd fr0,THREAD_FPSCR(r3) |
| 108 | beq 1f | 108 | beq 1f |
| 109 | LDL r4,_MSR-STACK_FRAME_OVERHEAD(r5) | 109 | LDL r4,_MSR-STACK_FRAME_OVERHEAD(r5) |
| 110 | li r3,MSR_FP|MSR_FE0|MSR_FE1 | 110 | li r3,MSR_FP|MSR_FE0|MSR_FE1 |
| @@ -117,3 +117,28 @@ _GLOBAL(giveup_fpu) | |||
| 117 | STL r5,OFF(last_task_used_math)(r4) | 117 | STL r5,OFF(last_task_used_math)(r4) |
| 118 | #endif /* CONFIG_SMP */ | 118 | #endif /* CONFIG_SMP */ |
| 119 | blr | 119 | blr |
| 120 | |||
| 121 | /* | ||
| 122 | * These are used in the alignment trap handler when emulating | ||
| 123 | * single-precision loads and stores. | ||
| 124 | * We restore and save the fpscr so the task gets the same result | ||
| 125 | * and exceptions as if the cpu had performed the load or store. | ||
| 126 | */ | ||
| 127 | |||
| 128 | _GLOBAL(cvt_fd) | ||
| 129 | lfd 0,THREAD_FPSCR(r5) /* load up fpscr value */ | ||
| 130 | mtfsf 0xff,0 | ||
| 131 | lfs 0,0(r3) | ||
| 132 | stfd 0,0(r4) | ||
| 133 | mffs 0 | ||
| 134 | stfd 0,THREAD_FPSCR(r5) /* save new fpscr value */ | ||
| 135 | blr | ||
| 136 | |||
| 137 | _GLOBAL(cvt_df) | ||
| 138 | lfd 0,THREAD_FPSCR(r5) /* load up fpscr value */ | ||
| 139 | mtfsf 0xff,0 | ||
| 140 | lfd 0,0(r3) | ||
| 141 | stfs 0,0(r4) | ||
| 142 | mffs 0 | ||
| 143 | stfd 0,THREAD_FPSCR(r5) /* save new fpscr value */ | ||
| 144 | blr | ||
