tree 70312c230efd0420817906adc2733489026153e9
parent f60f700876cd51de9de69f3a3c865d95e287a24d
author Russell King <[EMAIL PROTECTED]> Sun, 17 Jul 2005 10:54:50 +0100
committer Russell King <[EMAIL PROTECTED]> Sun, 17 Jul 2005 10:54:50 +0100

[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: Russell King <[EMAIL PROTECTED]>

 arch/arm/nwfpe/fpa11.h      |    4 +---
 arch/arm/nwfpe/fpmodule.c   |    2 +-
 arch/arm/nwfpe/fpmodule.inl |   14 +++++++-------
 3 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/arch/arm/nwfpe/fpa11.h b/arch/arm/nwfpe/fpa11.h
--- a/arch/arm/nwfpe/fpa11.h
+++ b/arch/arm/nwfpe/fpa11.h
@@ -29,9 +29,7 @@
  * stack+task struct.  Use the same method as 'current' uses to
  * reach them.
  */
-register unsigned long *user_registers asm("sl");
-
-#define GET_USERREG() (user_registers)
+#define GET_USERREG() ((struct pt_regs *)(THREAD_START_SP + (unsigned 
long)current_thread_info()) - 1)
 
 #include <linux/config.h>
 #include <linux/thread_info.h>
diff --git a/arch/arm/nwfpe/fpmodule.c b/arch/arm/nwfpe/fpmodule.c
--- a/arch/arm/nwfpe/fpmodule.c
+++ b/arch/arm/nwfpe/fpmodule.c
@@ -132,7 +132,7 @@ void float_raise(signed char flags)
        printk(KERN_DEBUG
               "NWFPE: %s[%d] takes exception %08x at %p from %08lx\n",
               current->comm, current->pid, flags,
-              __builtin_return_address(0), GET_USERREG()[15]);
+              __builtin_return_address(0), GET_USERREG()->ARM_pc);
 #endif
 
        /* Keep SoftFloat exception flags up to date.  */
diff --git a/arch/arm/nwfpe/fpmodule.inl b/arch/arm/nwfpe/fpmodule.inl
--- a/arch/arm/nwfpe/fpmodule.inl
+++ b/arch/arm/nwfpe/fpmodule.inl
@@ -28,8 +28,8 @@ static inline unsigned long readRegister
           for this in this routine.  LDF/STF instructions with Rn = PC
           depend on the PC being correct, as they use PC+8 in their
           address calculations. */
-       unsigned long *userRegisters = GET_USERREG();
-       unsigned int val = userRegisters[nReg];
+       struct pt_regs *regs = GET_USERREG();
+       unsigned int val = regs->uregs[nReg];
        if (REG_PC == nReg)
                val -= 4;
        return val;
@@ -38,8 +38,8 @@ static inline unsigned long readRegister
 static inline void
 writeRegister(const unsigned int nReg, const unsigned long val)
 {
-       unsigned long *userRegisters = GET_USERREG();
-       userRegisters[nReg] = val;
+       struct pt_regs *regs = GET_USERREG();
+       regs->uregs[nReg] = val;
 }
 
 static inline unsigned long readCPSR(void)
@@ -63,12 +63,12 @@ static inline unsigned long readConditio
 
 static inline void writeConditionCodes(const unsigned long val)
 {
-       unsigned long *userRegisters = GET_USERREG();
+       struct pt_regs *regs = GET_USERREG();
        unsigned long rval;
        /*
         * Operate directly on userRegisters since
         * the CPSR may be the PC register itself.
         */
-       rval = userRegisters[REG_CPSR] & ~CC_MASK;
-       userRegisters[REG_CPSR] = rval | (val & CC_MASK);
+       rval = regs->ARM_cpsr & ~CC_MASK;
+       regs->ARM_cpsr = rval | (val & CC_MASK);
 }
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to