aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/traps.c
diff options
context:
space:
mode:
authorKim Phillips <kim.phillips@freescale.com>2006-12-08 03:43:30 -0500
committerKumar Gala <galak@kernel.crashing.org>2006-12-08 03:43:30 -0500
commitaa42c69c67f82e88f0726258efe7306708e1cf14 (patch)
treed5305de3285d504e1bd1e955155e5e06b5b9ef76 /arch/powerpc/kernel/traps.c
parentc99767974ebd2a719d849fdeaaa1674456f5283f (diff)
[POWERPC] Add support for FP emulation for the e300c2 core
The e300c2 has no FPU. Its MSR[FP] is grounded to zero. If an attempt is made to execute a floating point instruction (including floating-point load, store, or move instructions), the e300c2 takes a floating-point unavailable interrupt. This patch adds support for FP emulation on the e300c2 by declaring a new CPU_FTR_FP_TAKES_FPUNAVAIL, where FP unavail interrupts are intercepted and redirected to the ProgramCheck exception path for correct emulation handling. (If we run out of CPU_FTR bits we could look to reclaim this bit by adding support to test the cpu_user_features for PPC_FEATURE_HAS_FPU instead) It adds a nop to the exception path for 32-bit processors with a FPU. Signed-off-by: Kim Phillips <kim.phillips@freescale.com> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/kernel/traps.c')
-rw-r--r--arch/powerpc/kernel/traps.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index 0d4e203fa7a0..fde820e52d03 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -782,6 +782,8 @@ void __kprobes program_check_exception(struct pt_regs *regs)
782 unsigned int reason = get_reason(regs); 782 unsigned int reason = get_reason(regs);
783 extern int do_mathemu(struct pt_regs *regs); 783 extern int do_mathemu(struct pt_regs *regs);
784 784
785 /* We can now get here via a FP Unavailable exception if the core
786 * has no FPU, in that case no reason flags will be set */
785#ifdef CONFIG_MATH_EMULATION 787#ifdef CONFIG_MATH_EMULATION
786 /* (reason & REASON_ILLEGAL) would be the obvious thing here, 788 /* (reason & REASON_ILLEGAL) would be the obvious thing here,
787 * but there seems to be a hardware bug on the 405GP (RevD) 789 * but there seems to be a hardware bug on the 405GP (RevD)