diff options
author | Richard Purdie <rpurdie@rpsys.net> | 2005-08-03 14:49:17 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2005-08-03 14:49:17 -0400 |
commit | f148af2593ef76ac705d1cc6abe48f455c9912cc (patch) | |
tree | cd1e0b0959624234ca3489df8888434ffea5050e /arch/arm/nwfpe/fpmodule.c | |
parent | 1fcf844861eb08ee05e05dba13b5436f2f2e29ed (diff) |
[PATCH] ARM: 2837/2: Re: ARM: Make NWFPE preempt safe
Patch from Richard Purdie
NWFPE used global variables which meant it wasn't safe for use with
preemptive kernels. This patch removes them and communicates the
information between functions in a preempt safe manner. Generation
of some exceptions was broken and this has also been corrected.
Tests with glibc's maths test suite show no change in the results
before/after this patch.
Signed-off-by: Richard Purdie <rpurdie@rpsys.net>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/nwfpe/fpmodule.c')
-rw-r--r-- | arch/arm/nwfpe/fpmodule.c | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/arch/arm/nwfpe/fpmodule.c b/arch/arm/nwfpe/fpmodule.c index 12885f31d347..2dfe1ac42ee8 100644 --- a/arch/arm/nwfpe/fpmodule.c +++ b/arch/arm/nwfpe/fpmodule.c | |||
@@ -116,8 +116,6 @@ fpmodule.c to integrate with the NetBSD kernel (I hope!). | |||
116 | code to access data in user space in some other source files at the | 116 | code to access data in user space in some other source files at the |
117 | moment (grep for get_user / put_user calls). --philb] | 117 | moment (grep for get_user / put_user calls). --philb] |
118 | 118 | ||
119 | float_exception_flags is a global variable in SoftFloat. | ||
120 | |||
121 | This function is called by the SoftFloat routines to raise a floating | 119 | This function is called by the SoftFloat routines to raise a floating |
122 | point exception. We check the trap enable byte in the FPSR, and raise | 120 | point exception. We check the trap enable byte in the FPSR, and raise |
123 | a SIGFPE exception if necessary. If not the relevant bits in the | 121 | a SIGFPE exception if necessary. If not the relevant bits in the |
@@ -129,15 +127,14 @@ void float_raise(signed char flags) | |||
129 | register unsigned int fpsr, cumulativeTraps; | 127 | register unsigned int fpsr, cumulativeTraps; |
130 | 128 | ||
131 | #ifdef CONFIG_DEBUG_USER | 129 | #ifdef CONFIG_DEBUG_USER |
132 | printk(KERN_DEBUG | 130 | /* Ignore inexact errors as there are far too many of them to log */ |
133 | "NWFPE: %s[%d] takes exception %08x at %p from %08lx\n", | 131 | if (flags & ~BIT_IXC) |
134 | current->comm, current->pid, flags, | 132 | printk(KERN_DEBUG |
135 | __builtin_return_address(0), GET_USERREG()->ARM_pc); | 133 | "NWFPE: %s[%d] takes exception %08x at %p from %08lx\n", |
134 | current->comm, current->pid, flags, | ||
135 | __builtin_return_address(0), GET_USERREG()->ARM_pc); | ||
136 | #endif | 136 | #endif |
137 | 137 | ||
138 | /* Keep SoftFloat exception flags up to date. */ | ||
139 | float_exception_flags |= flags; | ||
140 | |||
141 | /* Read fpsr and initialize the cumulativeTraps. */ | 138 | /* Read fpsr and initialize the cumulativeTraps. */ |
142 | fpsr = readFPSR(); | 139 | fpsr = readFPSR(); |
143 | cumulativeTraps = 0; | 140 | cumulativeTraps = 0; |