mirror of https://gitee.com/openkylin/linux.git
[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 <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
f60f700876
commit
b66da4a485
|
@ -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>
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -28,8 +28,8 @@ static inline unsigned long readRegister(const unsigned int nReg)
|
|||
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(const unsigned int nReg)
|
|||
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 readConditionCodes(void)
|
|||
|
||||
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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue