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 | ||