aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ppc/kernel/align.c
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2005-05-01 11:58:40 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-01 11:58:40 -0400
commit443a848cd30eb5bb5c1038e6371d83404775dcfc (patch)
treef61d62eebf19498395257a7cddee828c4edfa876 /arch/ppc/kernel/align.c
parentf1c55dea0bb2df94aa2b01b0871cb02f2e206676 (diff)
[PATCH] ppc32: refactor FPU exception handling
Moved common FPU exception handling code out of head.S so it can be used by several of the sub-architectures that might of a full PowerPC FPU. Also, uses new CONFIG_PPC_FPU define to fix alignment exception handling for floating point load/store instructions to only occur if we have a hardware FPU. Signed-off-by: Jason McMullan <jason.mcmullan@timesys.com> Signed-off-by: Kumar Gala <kumar.gala@freescale.com> Signed-off-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/ppc/kernel/align.c')
-rw-r--r--arch/ppc/kernel/align.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/ppc/kernel/align.c b/arch/ppc/kernel/align.c
index 79c929475037..40d356c66c41 100644
--- a/arch/ppc/kernel/align.c
+++ b/arch/ppc/kernel/align.c
@@ -368,16 +368,24 @@ fix_alignment(struct pt_regs *regs)
368 368
369 /* Single-precision FP load and store require conversions... */ 369 /* Single-precision FP load and store require conversions... */
370 case LD+F+S: 370 case LD+F+S:
371#ifdef CONFIG_PPC_FPU
371 preempt_disable(); 372 preempt_disable();
372 enable_kernel_fp(); 373 enable_kernel_fp();
373 cvt_fd(&data.f, &data.d, &current->thread.fpscr); 374 cvt_fd(&data.f, &data.d, &current->thread.fpscr);
374 preempt_enable(); 375 preempt_enable();
376#else
377 return 0;
378#endif
375 break; 379 break;
376 case ST+F+S: 380 case ST+F+S:
381#ifdef CONFIG_PPC_FPU
377 preempt_disable(); 382 preempt_disable();
378 enable_kernel_fp(); 383 enable_kernel_fp();
379 cvt_df(&data.d, &data.f, &current->thread.fpscr); 384 cvt_df(&data.d, &data.f, &current->thread.fpscr);
380 preempt_enable(); 385 preempt_enable();
386#else
387 return 0;
388#endif
381 break; 389 break;
382 } 390 }
383 391