diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2006-02-20 19:02:24 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-03-20 04:13:48 -0500 |
commit | 4e74ae800bafe79d4aaa529bc5d52425757c0115 (patch) | |
tree | b6d0a52da8a316eadaa5651ffa73ea3e3435d59e /arch/sparc64 | |
parent | f5deb807b8cd5c8fe48cbb4f7f5dd70cfbdb1178 (diff) |
[SPARC64]: Handle unimplemented FPU square-root on Niagara.
The math-emu code only expects unfinished fpop traps when
emulating FPU sqrt instructions on pre-Niagara chips.
On Niagara we can get unimplemented fpop, so handle that.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64')
-rw-r--r-- | arch/sparc64/math-emu/math.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/arch/sparc64/math-emu/math.c b/arch/sparc64/math-emu/math.c index 2ae05cd7b773..a93a3664c854 100644 --- a/arch/sparc64/math-emu/math.c +++ b/arch/sparc64/math-emu/math.c | |||
@@ -206,9 +206,30 @@ int do_mathemu(struct pt_regs *regs, struct fpustate *f) | |||
206 | case FSTOQ: TYPE(3,3,1,1,1,0,0); break; | 206 | case FSTOQ: TYPE(3,3,1,1,1,0,0); break; |
207 | case FDTOQ: TYPE(3,3,1,2,1,0,0); break; | 207 | case FDTOQ: TYPE(3,3,1,2,1,0,0); break; |
208 | case FQTOI: TYPE(3,1,0,3,1,0,0); break; | 208 | case FQTOI: TYPE(3,1,0,3,1,0,0); break; |
209 | |||
210 | /* We can get either unimplemented or unfinished | ||
211 | * for these cases. Pre-Niagara systems generate | ||
212 | * unfinished fpop for SUBNORMAL cases, and Niagara | ||
213 | * always gives unimplemented fpop for fsqrt{s,d}. | ||
214 | */ | ||
215 | case FSQRTS: { | ||
216 | unsigned long x = current_thread_info()->xfsr[0]; | ||
217 | |||
218 | x = (x >> 14) & 0xf; | ||
219 | TYPE(x,1,1,1,1,0,0); | ||
220 | printk("math-emu: type is %08x\n", type); | ||
221 | break; | ||
222 | } | ||
223 | |||
224 | case FSQRTD: { | ||
225 | unsigned long x = current_thread_info()->xfsr[0]; | ||
226 | |||
227 | x = (x >> 14) & 0xf; | ||
228 | TYPE(x,2,1,2,1,0,0); | ||
229 | break; | ||
230 | } | ||
231 | |||
209 | /* SUBNORMAL - ftt == 2 */ | 232 | /* SUBNORMAL - ftt == 2 */ |
210 | case FSQRTS: TYPE(2,1,1,1,1,0,0); break; | ||
211 | case FSQRTD: TYPE(2,2,1,2,1,0,0); break; | ||
212 | case FADDD: | 233 | case FADDD: |
213 | case FSUBD: | 234 | case FSUBD: |
214 | case FMULD: | 235 | case FMULD: |