Commit b66da4a4 authored by Russell King's avatar Russell King Committed by Russell King

[PATCH] ARM: Remove global nwfpe register variable

Recent changes to nwfpe broke the build with some gcc versions:

In file included from arch/arm/nwfpe/softfloat.c:33:
arch/arm/nwfpe/fpa11.h:32: global register variable follows a function definition
make[1]: *** [arch/arm/nwfpe/softfloat.o] Error 1

Since we now ensure that the kernel stack is empty when returning
to user space, we can now access the userspace registers with
reference to the kernel stack using current_thread_info(), rather
than remembering the stack pointer at the time nwfpe was called.
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent f60f7008
...@@ -29,9 +29,7 @@ ...@@ -29,9 +29,7 @@
* stack+task struct. Use the same method as 'current' uses to * stack+task struct. Use the same method as 'current' uses to
* reach them. * reach them.
*/ */
register unsigned long *user_registers asm("sl"); #define GET_USERREG() ((struct pt_regs *)(THREAD_START_SP + (unsigned long)current_thread_info()) - 1)
#define GET_USERREG() (user_registers)
#include <linux/config.h> #include <linux/config.h>
#include <linux/thread_info.h> #include <linux/thread_info.h>
......
...@@ -132,7 +132,7 @@ void float_raise(signed char flags) ...@@ -132,7 +132,7 @@ void float_raise(signed char flags)
printk(KERN_DEBUG printk(KERN_DEBUG
"NWFPE: %s[%d] takes exception %08x at %p from %08lx\n", "NWFPE: %s[%d] takes exception %08x at %p from %08lx\n",
current->comm, current->pid, flags, current->comm, current->pid, flags,
__builtin_return_address(0), GET_USERREG()[15]); __builtin_return_address(0), GET_USERREG()->ARM_pc);
#endif #endif
/* Keep SoftFloat exception flags up to date. */ /* Keep SoftFloat exception flags up to date. */
......
...@@ -28,8 +28,8 @@ static inline unsigned long readRegister(const unsigned int nReg) ...@@ -28,8 +28,8 @@ static inline unsigned long readRegister(const unsigned int nReg)
for this in this routine. LDF/STF instructions with Rn = PC for this in this routine. LDF/STF instructions with Rn = PC
depend on the PC being correct, as they use PC+8 in their depend on the PC being correct, as they use PC+8 in their
address calculations. */ address calculations. */
unsigned long *userRegisters = GET_USERREG(); struct pt_regs *regs = GET_USERREG();
unsigned int val = userRegisters[nReg]; unsigned int val = regs->uregs[nReg];
if (REG_PC == nReg) if (REG_PC == nReg)
val -= 4; val -= 4;
return val; return val;
...@@ -38,8 +38,8 @@ static inline unsigned long readRegister(const unsigned int nReg) ...@@ -38,8 +38,8 @@ static inline unsigned long readRegister(const unsigned int nReg)
static inline void static inline void
writeRegister(const unsigned int nReg, const unsigned long val) writeRegister(const unsigned int nReg, const unsigned long val)
{ {
unsigned long *userRegisters = GET_USERREG(); struct pt_regs *regs = GET_USERREG();
userRegisters[nReg] = val; regs->uregs[nReg] = val;
} }
static inline unsigned long readCPSR(void) static inline unsigned long readCPSR(void)
...@@ -63,12 +63,12 @@ static inline unsigned long readConditionCodes(void) ...@@ -63,12 +63,12 @@ static inline unsigned long readConditionCodes(void)
static inline void writeConditionCodes(const unsigned long val) static inline void writeConditionCodes(const unsigned long val)
{ {
unsigned long *userRegisters = GET_USERREG(); struct pt_regs *regs = GET_USERREG();
unsigned long rval; unsigned long rval;
/* /*
* Operate directly on userRegisters since * Operate directly on userRegisters since
* the CPSR may be the PC register itself. * the CPSR may be the PC register itself.
*/ */
rval = userRegisters[REG_CPSR] & ~CC_MASK; rval = regs->ARM_cpsr & ~CC_MASK;
userRegisters[REG_CPSR] = rval | (val & CC_MASK); regs->ARM_cpsr = rval | (val & CC_MASK);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment