diff options
Diffstat (limited to 'arch/arm/kernel')
| -rw-r--r-- | arch/arm/kernel/entry-armv.S | 7 | ||||
| -rw-r--r-- | arch/arm/kernel/head-common.S | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/signal.c | 8 | ||||
| -rw-r--r-- | arch/arm/kernel/smp_scu.c | 4 | ||||
| -rw-r--r-- | arch/arm/kernel/traps.c | 4 | 
5 files changed, 17 insertions, 8 deletions
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 0022b4d57f8..d2903e3bc86 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -21,6 +21,7 @@  #include <mach/entry-macro.S>  #include <asm/thread_notify.h>  #include <asm/unwind.h> +#include <asm/unistd.h>  #include "entry-header.S" @@ -908,10 +909,10 @@ __kuser_cmpxchg:				@ 0xffff0fc0  	 * A special ghost syscall is used for that (see traps.c).  	 */  	stmfd	sp!, {r7, lr} -	mov	r7, #0xff00		@ 0xfff0 into r7 for EABI -	orr	r7, r7, #0xf0 -	swi	#0x9ffff0 +	ldr	r7, =1f			@ it's 20 bits +	swi	__ARM_NR_cmpxchg  	ldmfd	sp!, {r7, pc} +1:	.word	__ARM_NR_cmpxchg  #elif __LINUX_ARM_ARCH__ < 6 diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S index 885a7214418..b9505aa267c 100644 --- a/arch/arm/kernel/head-common.S +++ b/arch/arm/kernel/head-common.S @@ -97,7 +97,7 @@ __error_a:  	bl	printhex8  	adr	r0, str_a2  	bl	printascii -	adr	r3, 3f +	adr	r3, 4f  	ldmia	r3, {r4, r5, r6}		@ get machine desc list  	sub	r4, r3, r4			@ get offset between virt&phys  	add	r5, r5, r4			@ convert virt addresses to diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 2a573d4fea2..e7714f367eb 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -662,8 +662,12 @@ static void do_signal(struct pt_regs *regs, int syscall)  				regs->ARM_sp -= 4;  				usp = (u32 __user *)regs->ARM_sp; -				put_user(regs->ARM_pc, usp); -				regs->ARM_pc = KERN_RESTART_CODE; +				if (put_user(regs->ARM_pc, usp) == 0) { +					regs->ARM_pc = KERN_RESTART_CODE; +				} else { +					regs->ARM_sp += 4; +					force_sigsegv(0, current); +				}  #endif  			}  		} diff --git a/arch/arm/kernel/smp_scu.c b/arch/arm/kernel/smp_scu.c index d3831f616ee..9ab4149bd98 100644 --- a/arch/arm/kernel/smp_scu.c +++ b/arch/arm/kernel/smp_scu.c @@ -37,6 +37,10 @@ void __init scu_enable(void __iomem *scu_base)  	u32 scu_ctrl;  	scu_ctrl = __raw_readl(scu_base + SCU_CTRL); +	/* already enabled? */ +	if (scu_ctrl & 1) +		return; +  	scu_ctrl |= 1;  	__raw_writel(scu_ctrl, scu_base + SCU_CTRL); diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 95718a6b50a..3f361a783f4 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c @@ -528,7 +528,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)  	 * __kuser_cmpxchg code in entry-armv.S should be aware of its  	 * existence.  Don't ever use this from user code.  	 */ -	case 0xfff0: +	case NR(cmpxchg):  	for (;;) {  		extern void do_DataAbort(unsigned long addr, unsigned int fsr,  					 struct pt_regs *regs); @@ -573,7 +573,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)  		   if not implemented, rather than raising SIGILL.  This  		   way the calling program can gracefully determine whether  		   a feature is supported.  */ -		if (no <= 0x7ff) +		if ((no & 0xffff) <= 0x7ff)  			return -ENOSYS;  		break;  	}  |