diff options
Diffstat (limited to 'arch/arm/kernel')
| -rw-r--r-- | arch/arm/kernel/asm-offsets.c | 5 | ||||
| -rw-r--r-- | arch/arm/kernel/cpuidle.c | 23 | ||||
| -rw-r--r-- | arch/arm/kernel/devtree.c | 3 | ||||
| -rw-r--r-- | arch/arm/kernel/entry-armv.S | 19 | ||||
| -rw-r--r-- | arch/arm/kernel/entry-common.S | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/entry-header.S | 12 | ||||
| -rw-r--r-- | arch/arm/kernel/entry-v7m.S | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/process.c | 14 | ||||
| -rw-r--r-- | arch/arm/kernel/ptrace.c | 13 | ||||
| -rw-r--r-- | arch/arm/kernel/setup.c | 12 | ||||
| -rw-r--r-- | arch/arm/kernel/smp.c | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/smp_tlb.c | 44 | ||||
| -rw-r--r-- | arch/arm/kernel/smp_twd.c | 34 | ||||
| -rw-r--r-- | arch/arm/kernel/vmlinux.lds.S | 4 | 
14 files changed, 117 insertions, 72 deletions
diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c index 27d05813ff09..608008229c7d 100644 --- a/arch/arm/kernel/asm-offsets.c +++ b/arch/arm/kernel/asm-offsets.c @@ -107,7 +107,10 @@ int main(void)    DEFINE(S_PC,			offsetof(struct pt_regs, ARM_pc));    DEFINE(S_PSR,			offsetof(struct pt_regs, ARM_cpsr));    DEFINE(S_OLD_R0,		offsetof(struct pt_regs, ARM_ORIG_r0)); -  DEFINE(S_FRAME_SIZE,		sizeof(struct pt_regs)); +  DEFINE(PT_REGS_SIZE,		sizeof(struct pt_regs)); +  DEFINE(SVC_DACR,		offsetof(struct svc_pt_regs, dacr)); +  DEFINE(SVC_ADDR_LIMIT,	offsetof(struct svc_pt_regs, addr_limit)); +  DEFINE(SVC_REGS_SIZE,		sizeof(struct svc_pt_regs));    BLANK();  #ifdef CONFIG_CACHE_L2X0    DEFINE(L2X0_R_PHY_BASE,	offsetof(struct l2x0_regs, phy_base)); diff --git a/arch/arm/kernel/cpuidle.c b/arch/arm/kernel/cpuidle.c index a44b268e12e1..7dccc964d75f 100644 --- a/arch/arm/kernel/cpuidle.c +++ b/arch/arm/kernel/cpuidle.c @@ -47,18 +47,13 @@ int arm_cpuidle_simple_enter(struct cpuidle_device *dev,   * This function calls the underlying arch specific low level PM code as   * registered at the init time.   * - * Returns -EOPNOTSUPP if no suspend callback is defined, the result of the - * callback otherwise. + * Returns the result of the suspend callback.   */  int arm_cpuidle_suspend(int index)  { -	int ret = -EOPNOTSUPP;  	int cpu = smp_processor_id(); -	if (cpuidle_ops[cpu].suspend) -		ret = cpuidle_ops[cpu].suspend(index); - -	return ret; +	return cpuidle_ops[cpu].suspend(index);  }  /** @@ -92,7 +87,8 @@ static const struct cpuidle_ops *__init arm_cpuidle_get_ops(const char *method)   * process.   *   * Return 0 on sucess, -ENOENT if no 'enable-method' is defined, -EOPNOTSUPP if - * no cpuidle_ops is registered for the 'enable-method'. + * no cpuidle_ops is registered for the 'enable-method', or if either init or + * suspend callback isn't defined.   */  static int __init arm_cpuidle_read_ops(struct device_node *dn, int cpu)  { @@ -110,6 +106,12 @@ static int __init arm_cpuidle_read_ops(struct device_node *dn, int cpu)  		return -EOPNOTSUPP;  	} +	if (!ops->init || !ops->suspend) { +		pr_warn("cpuidle_ops '%s': no init or suspend callback\n", +			enable_method); +		return -EOPNOTSUPP; +	} +  	cpuidle_ops[cpu] = *ops; /* structure copy */  	pr_notice("cpuidle: enable-method property '%s'" @@ -129,7 +131,8 @@ static int __init arm_cpuidle_read_ops(struct device_node *dn, int cpu)   * Returns:   *  0 on success,   *  -ENODEV if it fails to find the cpu node in the device tree, - *  -EOPNOTSUPP if it does not find a registered cpuidle_ops for this cpu, + *  -EOPNOTSUPP if it does not find a registered and valid cpuidle_ops for + *  this cpu,   *  -ENOENT if it fails to find an 'enable-method' property,   *  -ENXIO if the HW reports a failure or a misconfiguration,   *  -ENOMEM if the HW report an memory allocation failure  @@ -143,7 +146,7 @@ int __init arm_cpuidle_init(int cpu)  		return -ENODEV;  	ret = arm_cpuidle_read_ops(cpu_node, cpu); -	if (!ret && cpuidle_ops[cpu].init) +	if (!ret)  		ret = cpuidle_ops[cpu].init(cpu_node, cpu);  	of_node_put(cpu_node); diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c index 2e26016a91a5..40ecd5f514a2 100644 --- a/arch/arm/kernel/devtree.c +++ b/arch/arm/kernel/devtree.c @@ -23,6 +23,7 @@  #include <asm/cputype.h>  #include <asm/setup.h>  #include <asm/page.h> +#include <asm/prom.h>  #include <asm/smp_plat.h>  #include <asm/mach/arch.h>  #include <asm/mach-types.h> @@ -213,6 +214,8 @@ const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)  #if defined(CONFIG_ARCH_MULTIPLATFORM) || defined(CONFIG_ARM_SINGLE_ARMV7M)  	DT_MACHINE_START(GENERIC_DT, "Generic DT based system") +		.l2c_aux_val = 0x0, +		.l2c_aux_mask = ~0x0,  	MACHINE_END  	mdesc_best = &__mach_desc_GENERIC_DT; diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index e2550500486d..bc5f50799d75 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -92,7 +92,7 @@   * Invalid mode handlers   */  	.macro	inv_entry, reason -	sub	sp, sp, #S_FRAME_SIZE +	sub	sp, sp, #PT_REGS_SIZE   ARM(	stmib	sp, {r1 - lr}		)   THUMB(	stmia	sp, {r0 - r12}		)   THUMB(	str	sp, [sp, #S_SP]		) @@ -152,7 +152,7 @@ ENDPROC(__und_invalid)  	.macro	svc_entry, stack_hole=0, trace=1, uaccess=1   UNWIND(.fnstart		)   UNWIND(.save {r0 - pc}		) -	sub	sp, sp, #(S_FRAME_SIZE + 8 + \stack_hole - 4) +	sub	sp, sp, #(SVC_REGS_SIZE + \stack_hole - 4)  #ifdef CONFIG_THUMB2_KERNEL   SPFIX(	str	r0, [sp]	)	@ temporarily saved   SPFIX(	mov	r0, sp		) @@ -167,7 +167,7 @@ ENDPROC(__und_invalid)  	ldmia	r0, {r3 - r5}  	add	r7, sp, #S_SP - 4	@ here for interlock avoidance  	mov	r6, #-1			@  ""  ""      ""       "" -	add	r2, sp, #(S_FRAME_SIZE + 8 + \stack_hole - 4) +	add	r2, sp, #(SVC_REGS_SIZE + \stack_hole - 4)   SPFIX(	addeq	r2, r2, #4	)  	str	r3, [sp, #-4]!		@ save the "real" r0 copied  					@ from the exception stack @@ -185,6 +185,12 @@ ENDPROC(__und_invalid)  	@  	stmia	r7, {r2 - r6} +	get_thread_info tsk +	ldr	r0, [tsk, #TI_ADDR_LIMIT] +	mov	r1, #TASK_SIZE +	str	r1, [tsk, #TI_ADDR_LIMIT] +	str	r0, [sp, #SVC_ADDR_LIMIT] +  	uaccess_save r0  	.if \uaccess  	uaccess_disable r0 @@ -213,7 +219,6 @@ __irq_svc:  	irq_handler  #ifdef CONFIG_PREEMPT -	get_thread_info tsk  	ldr	r8, [tsk, #TI_PREEMPT]		@ get preempt count  	ldr	r0, [tsk, #TI_FLAGS]		@ get flags  	teq	r8, #0				@ if preempt count != 0 @@ -366,17 +371,17 @@ ENDPROC(__fiq_abt)  /*   * User mode handlers   * - * EABI note: sp_svc is always 64-bit aligned here, so should S_FRAME_SIZE + * EABI note: sp_svc is always 64-bit aligned here, so should PT_REGS_SIZE   */ -#if defined(CONFIG_AEABI) && (__LINUX_ARM_ARCH__ >= 5) && (S_FRAME_SIZE & 7) +#if defined(CONFIG_AEABI) && (__LINUX_ARM_ARCH__ >= 5) && (PT_REGS_SIZE & 7)  #error "sizeof(struct pt_regs) must be a multiple of 8"  #endif  	.macro	usr_entry, trace=1, uaccess=1   UNWIND(.fnstart	)   UNWIND(.cantunwind	)	@ don't unwind the user space -	sub	sp, sp, #S_FRAME_SIZE +	sub	sp, sp, #PT_REGS_SIZE   ARM(	stmib	sp, {r1 - r12}	)   THUMB(	stmia	sp, {r0 - r12}	) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 30a7228eaceb..10c3283d6c19 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -145,7 +145,7 @@ ENTRY(vector_swi)  #ifdef CONFIG_CPU_V7M  	v7m_exception_entry  #else -	sub	sp, sp, #S_FRAME_SIZE +	sub	sp, sp, #PT_REGS_SIZE  	stmia	sp, {r0 - r12}			@ Calling r0 - r12   ARM(	add	r8, sp, #S_PC		)   ARM(	stmdb	r8, {sp, lr}^		)	@ Calling sp, lr diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index 0d22ad206d52..6391728c8f03 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S @@ -90,7 +90,7 @@  	@ Linux expects to have irqs off. Do it here before taking stack space  	cpsid	i -	sub	sp, #S_FRAME_SIZE-S_IP +	sub	sp, #PT_REGS_SIZE-S_IP  	stmdb	sp!, {r0-r11}  	@ load saved r12, lr, return address and xPSR. @@ -160,7 +160,7 @@  	ldmia	sp!, {r0-r11}  	@ restore main sp -	add	sp, sp, #S_FRAME_SIZE-S_IP +	add	sp, sp, #PT_REGS_SIZE-S_IP  	cpsie	i  	bx	lr @@ -215,7 +215,9 @@  	blne	trace_hardirqs_off  #endif  	.endif +	ldr	r1, [sp, #SVC_ADDR_LIMIT]  	uaccess_restore +	str	r1, [tsk, #TI_ADDR_LIMIT]  #ifndef CONFIG_THUMB2_KERNEL  	@ ARM mode SVC restore @@ -259,7 +261,9 @@  	@ on the stack remains correct).  	@  	.macro  svc_exit_via_fiq +	ldr	r1, [sp, #SVC_ADDR_LIMIT]  	uaccess_restore +	str	r1, [tsk, #TI_ADDR_LIMIT]  #ifndef CONFIG_THUMB2_KERNEL  	@ ARM mode restore  	mov	r0, sp @@ -307,7 +311,7 @@  	.endif  	mov	r0, r0				@ ARMv5T and earlier require a nop  						@ after ldm {}^ -	add	sp, sp, #\offset + S_FRAME_SIZE +	add	sp, sp, #\offset + PT_REGS_SIZE  	movs	pc, lr				@ return & move spsr_svc into cpsr  #elif defined(CONFIG_CPU_V7M)  	@ V7M restore. @@ -334,7 +338,7 @@  	.else  	ldmdb	sp, {r0 - r12}			@ get calling r0 - r12  	.endif -	add	sp, sp, #S_FRAME_SIZE - S_SP +	add	sp, sp, #PT_REGS_SIZE - S_SP  	movs	pc, lr				@ return & move spsr_svc into cpsr  #endif	/* !CONFIG_THUMB2_KERNEL */  	.endm diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S index 907534f97053..abcf47848525 100644 --- a/arch/arm/kernel/entry-v7m.S +++ b/arch/arm/kernel/entry-v7m.S @@ -73,7 +73,7 @@ __irq_entry:  	@ correctness they don't need to be restored. So only r8-r11 must be  	@ restored here. The easiest way to do so is to restore r0-r7, too.  	ldmia	sp!, {r0-r11} -	add	sp, #S_FRAME_SIZE-S_IP +	add	sp, #PT_REGS_SIZE-S_IP  	cpsie	i  	bx	lr  ENDPROC(__irq_entry) diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 4a803c5a1ff7..612eb530f33f 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -96,19 +96,23 @@ void __show_regs(struct pt_regs *regs)  	unsigned long flags;  	char buf[64];  #ifndef CONFIG_CPU_V7M -	unsigned int domain; +	unsigned int domain, fs;  #ifdef CONFIG_CPU_SW_DOMAIN_PAN  	/*  	 * Get the domain register for the parent context. In user  	 * mode, we don't save the DACR, so lets use what it should  	 * be. For other modes, we place it after the pt_regs struct.  	 */ -	if (user_mode(regs)) +	if (user_mode(regs)) {  		domain = DACR_UACCESS_ENABLE; -	else -		domain = *(unsigned int *)(regs + 1); +		fs = get_fs(); +	} else { +		domain = to_svc_pt_regs(regs)->dacr; +		fs = to_svc_pt_regs(regs)->addr_limit; +	}  #else  	domain = get_domain(); +	fs = get_fs();  #endif  #endif @@ -144,7 +148,7 @@ void __show_regs(struct pt_regs *regs)  		if ((domain & domain_mask(DOMAIN_USER)) ==  		    domain_val(DOMAIN_USER, DOMAIN_NOACCESS))  			segment = "none"; -		else if (get_fs() == get_ds()) +		else if (fs == get_ds())  			segment = "kernel";  		else  			segment = "user"; diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 4d9375814b53..ce131ed5939d 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -932,18 +932,19 @@ asmlinkage int syscall_trace_enter(struct pt_regs *regs, int scno)  {  	current_thread_info()->syscall = scno; -	/* Do the secure computing check first; failures should be fast. */ +	if (test_thread_flag(TIF_SYSCALL_TRACE)) +		tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER); + +	/* Do seccomp after ptrace; syscall may have changed. */  #ifdef CONFIG_HAVE_ARCH_SECCOMP_FILTER -	if (secure_computing() == -1) +	if (secure_computing(NULL) == -1)  		return -1;  #else  	/* XXX: remove this once OABI gets fixed */ -	secure_computing_strict(scno); +	secure_computing_strict(current_thread_info()->syscall);  #endif -	if (test_thread_flag(TIF_SYSCALL_TRACE)) -		tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER); - +	/* Tracer or seccomp may have changed syscall. */  	scno = current_thread_info()->syscall;  	if (test_thread_flag(TIF_SYSCALL_TRACEPOINT)) diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 7b5350060612..da2f6c360f6b 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -19,7 +19,6 @@  #include <linux/bootmem.h>  #include <linux/seq_file.h>  #include <linux/screen_info.h> -#include <linux/of_iommu.h>  #include <linux/of_platform.h>  #include <linux/init.h>  #include <linux/kexec.h> @@ -844,7 +843,7 @@ static void __init request_standard_resources(const struct machine_desc *mdesc)  	struct resource *res;  	kernel_code.start   = virt_to_phys(_text); -	kernel_code.end     = virt_to_phys(_etext - 1); +	kernel_code.end     = virt_to_phys(__init_begin - 1);  	kernel_data.start   = virt_to_phys(_sdata);  	kernel_data.end     = virt_to_phys(_end - 1); @@ -903,14 +902,9 @@ static int __init customize_machine(void)  	 * machine from the device tree, if no callback is provided,  	 * otherwise we would always need an init_machine callback.  	 */ -	of_iommu_init();  	if (machine_desc->init_machine)  		machine_desc->init_machine(); -#ifdef CONFIG_OF -	else -		of_platform_populate(NULL, of_default_bus_match_table, -					NULL, NULL); -#endif +  	return 0;  }  arch_initcall(customize_machine); @@ -1064,6 +1058,7 @@ void __init setup_arch(char **cmdline_p)  	early_paging_init(mdesc);  #endif  	setup_dma_zone(mdesc); +	xen_early_init();  	efi_init();  	sanity_check_meminfo();  	arm_memblock_init(mdesc); @@ -1080,7 +1075,6 @@ void __init setup_arch(char **cmdline_p)  	arm_dt_init_cpu_maps();  	psci_dt_init(); -	xen_early_init();  #ifdef CONFIG_SMP  	if (is_smp()) {  		if (!mdesc->smp_init || !mdesc->smp_init()) { diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index df90bc59bfce..861521606c6d 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -486,7 +486,7 @@ static const char *ipi_types[NR_IPI] __tracepoint_string = {  static void smp_cross_call(const struct cpumask *target, unsigned int ipinr)  { -	trace_ipi_raise(target, ipi_types[ipinr]); +	trace_ipi_raise_rcuidle(target, ipi_types[ipinr]);  	__smp_cross_call(target, ipinr);  } diff --git a/arch/arm/kernel/smp_tlb.c b/arch/arm/kernel/smp_tlb.c index 2e72be4f623e..22313cb53362 100644 --- a/arch/arm/kernel/smp_tlb.c +++ b/arch/arm/kernel/smp_tlb.c @@ -93,17 +93,53 @@ void erratum_a15_798181_init(void)  	unsigned int revidr = read_cpuid(CPUID_REVIDR);  	/* Brahma-B15 r0p0..r0p2 affected -	 * Cortex-A15 r0p0..r3p2 w/o ECO fix affected */ -	if ((midr & 0xff0ffff0) == 0x420f00f0 && midr <= 0x420f00f2) +	 * Cortex-A15 r0p0..r3p3 w/o ECO fix affected +	 * Fixes applied to A15 with respect to the revision and revidr are: +	 * +	 * r0p0-r2p1: No fixes applied +	 * r2p2,r2p3: +	 *	REVIDR[4]: 798181 Moving a virtual page that is being accessed +	 *		   by an active process can lead to unexpected behavior +	 *	REVIDR[9]: Not defined +	 * r2p4,r3p0,r3p1,r3p2: +	 *	REVIDR[4]: 798181 Moving a virtual page that is being accessed +	 *		   by an active process can lead to unexpected behavior +	 *	REVIDR[9]: 798181 Moving a virtual page that is being accessed +	 *		   by an active process can lead to unexpected behavior +	 *		   - This is an update to a previously released ECO. +	 * r3p3: +	 *	REVIDR[4]: Reserved +	 *	REVIDR[9]: 798181 Moving a virtual page that is being accessed +	 *		   by an active process can lead to unexpected behavior +	 *		   - This is an update to a previously released ECO. +	 * +	 * Handling: +	 *	REVIDR[9] set -> No WA +	 *	REVIDR[4] set, REVIDR[9] cleared -> Partial WA +	 *	Both cleared -> Full WA +	 */ +	if ((midr & 0xff0ffff0) == 0x420f00f0 && midr <= 0x420f00f2) {  		erratum_a15_798181_handler = erratum_a15_798181_broadcast; -	else if ((midr & 0xff0ffff0) == 0x410fc0f0 && midr <= 0x413fc0f2 && -		 (revidr & 0x210) != 0x210) { +	} else if ((midr & 0xff0ffff0) == 0x410fc0f0 && midr < 0x412fc0f2) { +		erratum_a15_798181_handler = erratum_a15_798181_broadcast; +	} else if ((midr & 0xff0ffff0) == 0x410fc0f0 && midr < 0x412fc0f4) {  		if (revidr & 0x10)  			erratum_a15_798181_handler =  				erratum_a15_798181_partial;  		else  			erratum_a15_798181_handler =  				erratum_a15_798181_broadcast; +	} else if ((midr & 0xff0ffff0) == 0x410fc0f0 && midr < 0x413fc0f3) { +		if ((revidr & 0x210) == 0) +			erratum_a15_798181_handler = +				erratum_a15_798181_broadcast; +		else if (revidr & 0x10) +			erratum_a15_798181_handler = +				erratum_a15_798181_partial; +	} else if ((midr & 0xff0ffff0) == 0x410fc0f0 && midr < 0x414fc0f0) { +		if ((revidr & 0x200) == 0) +			erratum_a15_798181_handler = +				erratum_a15_798181_partial;  	}  }  #endif diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index 1bfa7a7f5533..02d5e5e8d44c 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c @@ -310,24 +310,17 @@ static void twd_timer_setup(void)  	enable_percpu_irq(clk->irq, 0);  } -static int twd_timer_cpu_notify(struct notifier_block *self, -				unsigned long action, void *hcpu) +static int twd_timer_starting_cpu(unsigned int cpu)  { -	switch (action & ~CPU_TASKS_FROZEN) { -	case CPU_STARTING: -		twd_timer_setup(); -		break; -	case CPU_DYING: -		twd_timer_stop(); -		break; -	} - -	return NOTIFY_OK; +	twd_timer_setup(); +	return 0;  } -static struct notifier_block twd_timer_cpu_nb = { -	.notifier_call = twd_timer_cpu_notify, -}; +static int twd_timer_dying_cpu(unsigned int cpu) +{ +	twd_timer_stop(); +	return 0; +}  static int __init twd_local_timer_common_register(struct device_node *np)  { @@ -345,9 +338,9 @@ static int __init twd_local_timer_common_register(struct device_node *np)  		goto out_free;  	} -	err = register_cpu_notifier(&twd_timer_cpu_nb); -	if (err) -		goto out_irq; +	cpuhp_setup_state_nocalls(CPUHP_AP_ARM_TWD_STARTING, +				  "AP_ARM_TWD_STARTING", +				  twd_timer_starting_cpu, twd_timer_dying_cpu);  	twd_get_clock(np);  	if (!of_property_read_bool(np, "always-on")) @@ -365,8 +358,6 @@ static int __init twd_local_timer_common_register(struct device_node *np)  	return 0; -out_irq: -	free_percpu_irq(twd_ppi, twd_evt);  out_free:  	iounmap(twd_base);  	twd_base = NULL; @@ -390,7 +381,7 @@ int __init twd_local_timer_register(struct twd_local_timer *tlt)  }  #ifdef CONFIG_OF -static void __init twd_local_timer_of_register(struct device_node *np) +static int __init twd_local_timer_of_register(struct device_node *np)  {  	int err; @@ -410,6 +401,7 @@ static void __init twd_local_timer_of_register(struct device_node *np)  out:  	WARN(err, "twd_local_timer_of_register failed (%d)\n", err); +	return err;  }  CLOCKSOURCE_OF_DECLARE(arm_twd_a9, "arm,cortex-a9-twd-timer", twd_local_timer_of_register);  CLOCKSOURCE_OF_DECLARE(arm_twd_a5, "arm,cortex-a5-twd-timer", twd_local_timer_of_register); diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index e2c6da096cef..99420fc1f066 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S @@ -125,6 +125,8 @@ SECTIONS  #ifdef CONFIG_DEBUG_ALIGN_RODATA  	. = ALIGN(1<<SECTION_SHIFT);  #endif +	_etext = .;			/* End of text section */ +  	RO_DATA(PAGE_SIZE)  	. = ALIGN(4); @@ -155,8 +157,6 @@ SECTIONS  	NOTES -	_etext = .;			/* End of text and rodata section */ -  #ifdef CONFIG_DEBUG_RODATA  	. = ALIGN(1<<SECTION_SHIFT);  #else  |