ARM: v6k: select clear exclusive code seqences according to V6 variants
If CONFIG_CPU_V6 is enabled, then the kernel must support ARMv6 CPUs which don't have the V6K extensions implemented. Always use the dummy store-exclusive method to ensure that the exclusive monitors are cleared. If CONFIG_CPU_V6 is not set, but CONFIG_CPU_32v6K is enabled, then we have the K extensions available on all CPUs we're building support for, so we can use the new clear-exclusive instruction. Acked-by: Tony Lindgren <tony@atomide.com> Tested-by: Sourav Poddar <sourav.poddar@ti.com> Tested-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
c786282e6d
commit
7db44c75a2
|
@ -76,13 +76,13 @@
|
||||||
#ifndef CONFIG_THUMB2_KERNEL
|
#ifndef CONFIG_THUMB2_KERNEL
|
||||||
.macro svc_exit, rpsr
|
.macro svc_exit, rpsr
|
||||||
msr spsr_cxsf, \rpsr
|
msr spsr_cxsf, \rpsr
|
||||||
#if defined(CONFIG_CPU_32v6K)
|
#if defined(CONFIG_CPU_V6)
|
||||||
clrex @ clear the exclusive monitor
|
|
||||||
ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr
|
|
||||||
#elif defined (CONFIG_CPU_V6)
|
|
||||||
ldr r0, [sp]
|
ldr r0, [sp]
|
||||||
strex r1, r2, [sp] @ clear the exclusive monitor
|
strex r1, r2, [sp] @ clear the exclusive monitor
|
||||||
ldmib sp, {r1 - pc}^ @ load r1 - pc, cpsr
|
ldmib sp, {r1 - pc}^ @ load r1 - pc, cpsr
|
||||||
|
#elif defined(CONFIG_CPU_32v6K)
|
||||||
|
clrex @ clear the exclusive monitor
|
||||||
|
ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr
|
||||||
#else
|
#else
|
||||||
ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr
|
ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr
|
||||||
#endif
|
#endif
|
||||||
|
@ -92,10 +92,10 @@
|
||||||
ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr
|
ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr
|
||||||
ldr lr, [sp, #\offset + S_PC]! @ get pc
|
ldr lr, [sp, #\offset + S_PC]! @ get pc
|
||||||
msr spsr_cxsf, r1 @ save in spsr_svc
|
msr spsr_cxsf, r1 @ save in spsr_svc
|
||||||
#if defined(CONFIG_CPU_32v6K)
|
#if defined(CONFIG_CPU_V6)
|
||||||
clrex @ clear the exclusive monitor
|
|
||||||
#elif defined (CONFIG_CPU_V6)
|
|
||||||
strex r1, r2, [sp] @ clear the exclusive monitor
|
strex r1, r2, [sp] @ clear the exclusive monitor
|
||||||
|
#elif defined(CONFIG_CPU_32v6K)
|
||||||
|
clrex @ clear the exclusive monitor
|
||||||
#endif
|
#endif
|
||||||
.if \fast
|
.if \fast
|
||||||
ldmdb sp, {r1 - lr}^ @ get calling r1 - lr
|
ldmdb sp, {r1 - lr}^ @ get calling r1 - lr
|
||||||
|
|
|
@ -20,11 +20,11 @@
|
||||||
*/
|
*/
|
||||||
.align 5
|
.align 5
|
||||||
ENTRY(v6_early_abort)
|
ENTRY(v6_early_abort)
|
||||||
#ifdef CONFIG_CPU_32v6K
|
#ifdef CONFIG_CPU_V6
|
||||||
clrex
|
|
||||||
#else
|
|
||||||
sub r1, sp, #4 @ Get unused stack location
|
sub r1, sp, #4 @ Get unused stack location
|
||||||
strex r0, r1, [r1] @ Clear the exclusive monitor
|
strex r0, r1, [r1] @ Clear the exclusive monitor
|
||||||
|
#elif defined(CONFIG_CPU_32v6K)
|
||||||
|
clrex
|
||||||
#endif
|
#endif
|
||||||
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
||||||
mrc p15, 0, r0, c6, c0, 0 @ get FAR
|
mrc p15, 0, r0, c6, c0, 0 @ get FAR
|
||||||
|
|
Loading…
Reference in a new issue