diff options
Diffstat (limited to 'arch/arm/kernel')
| -rw-r--r-- | arch/arm/kernel/kprobes-decode.c | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/pmu.c | 22 | ||||
| -rw-r--r-- | arch/arm/kernel/setup.c | 4 | ||||
| -rw-r--r-- | arch/arm/kernel/signal.c | 4 | ||||
| -rw-r--r-- | arch/arm/kernel/vmlinux.lds.S | 11 | 
5 files changed, 31 insertions, 12 deletions
diff --git a/arch/arm/kernel/kprobes-decode.c b/arch/arm/kernel/kprobes-decode.c index 2c1f0050c9c..8f6ed43861f 100644 --- a/arch/arm/kernel/kprobes-decode.c +++ b/arch/arm/kernel/kprobes-decode.c @@ -1437,7 +1437,7 @@ arm_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi)  		return space_cccc_1100_010x(insn, asi); -	} else if ((insn & 0x0e000000) == 0x0c400000) { +	} else if ((insn & 0x0e000000) == 0x0c000000) {  		return space_cccc_110x(insn, asi); diff --git a/arch/arm/kernel/pmu.c b/arch/arm/kernel/pmu.c index b8af96ea62e..2c79eec1926 100644 --- a/arch/arm/kernel/pmu.c +++ b/arch/arm/kernel/pmu.c @@ -97,28 +97,34 @@ set_irq_affinity(int irq,  			   irq, cpu);  	return err;  #else -	return 0; +	return -EINVAL;  #endif  }  static int  init_cpu_pmu(void)  { -	int i, err = 0; +	int i, irqs, err = 0;  	struct platform_device *pdev = pmu_devices[ARM_PMU_DEVICE_CPU]; -	if (!pdev) { -		err = -ENODEV; -		goto out; -	} +	if (!pdev) +		return -ENODEV; + +	irqs = pdev->num_resources; + +	/* +	 * If we have a single PMU interrupt that we can't shift, assume that +	 * we're running on a uniprocessor machine and continue. +	 */ +	if (irqs == 1 && !irq_can_set_affinity(platform_get_irq(pdev, 0))) +		return 0; -	for (i = 0; i < pdev->num_resources; ++i) { +	for (i = 0; i < irqs; ++i) {  		err = set_irq_affinity(platform_get_irq(pdev, i), i);  		if (err)  			break;  	} -out:  	return err;  } diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 420b8d6485d..5ea4fb718b9 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -226,8 +226,8 @@ int cpu_architecture(void)  		 * Register 0 and check for VMSAv7 or PMSAv7 */  		asm("mrc	p15, 0, %0, c0, c1, 4"  		    : "=r" (mmfr0)); -		if ((mmfr0 & 0x0000000f) == 0x00000003 || -		    (mmfr0 & 0x000000f0) == 0x00000030) +		if ((mmfr0 & 0x0000000f) >= 0x00000003 || +		    (mmfr0 & 0x000000f0) >= 0x00000030)  			cpu_arch = CPU_ARCH_ARMv7;  		else if ((mmfr0 & 0x0000000f) == 0x00000002 ||  			 (mmfr0 & 0x000000f0) == 0x00000020) diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 907d5a620bc..abaf8445ce2 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -474,7 +474,9 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,  	unsigned long handler = (unsigned long)ka->sa.sa_handler;  	unsigned long retcode;  	int thumb = 0; -	unsigned long cpsr = regs->ARM_cpsr & ~PSR_f; +	unsigned long cpsr = regs->ARM_cpsr & ~(PSR_f | PSR_E_BIT); + +	cpsr |= PSR_ENDSTATE;  	/*  	 * Maybe we need to deliver a 32-bit signal to a 26-bit task. diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 86b66f3f203..61462790757 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S @@ -21,6 +21,12 @@  #define ARM_CPU_KEEP(x)  #endif +#if defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK) +#define ARM_EXIT_KEEP(x)	x +#else +#define ARM_EXIT_KEEP(x) +#endif +  OUTPUT_ARCH(arm)  ENTRY(stext) @@ -43,6 +49,7 @@ SECTIONS  		_sinittext = .;  			HEAD_TEXT  			INIT_TEXT +			ARM_EXIT_KEEP(EXIT_TEXT)  		_einittext = .;  		ARM_CPU_DISCARD(PROC_INFO)  		__arch_info_begin = .; @@ -67,6 +74,7 @@ SECTIONS  #ifndef CONFIG_XIP_KERNEL  		__init_begin = _stext;  		INIT_DATA +		ARM_EXIT_KEEP(EXIT_DATA)  #endif  	} @@ -162,6 +170,7 @@ SECTIONS  		. = ALIGN(PAGE_SIZE);  		__init_begin = .;  		INIT_DATA +		ARM_EXIT_KEEP(EXIT_DATA)  		. = ALIGN(PAGE_SIZE);  		__init_end = .;  #endif @@ -247,6 +256,8 @@ SECTIONS  	}  #endif +	NOTES +  	BSS_SECTION(0, 0, 0)  	_end = .;  |