|
@@ -208,26 +208,21 @@
|
|
|
#endif
|
|
|
.endif
|
|
|
msr spsr_cxsf, \rpsr
|
|
|
-#if defined(CONFIG_CPU_V6)
|
|
|
- ldr r0, [sp]
|
|
|
- strex r1, r2, [sp] @ clear the exclusive monitor
|
|
|
- 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
|
|
|
- ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr
|
|
|
+#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_32v6K)
|
|
|
+ @ We must avoid clrex due to Cortex-A15 erratum #830321
|
|
|
+ sub r0, sp, #4 @ uninhabited address
|
|
|
+ strex r1, r2, [r0] @ clear the exclusive monitor
|
|
|
#endif
|
|
|
+ ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr
|
|
|
.endm
|
|
|
|
|
|
.macro restore_user_regs, fast = 0, offset = 0
|
|
|
ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr
|
|
|
ldr lr, [sp, #\offset + S_PC]! @ get pc
|
|
|
msr spsr_cxsf, r1 @ save in spsr_svc
|
|
|
-#if defined(CONFIG_CPU_V6)
|
|
|
+#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_32v6K)
|
|
|
+ @ We must avoid clrex due to Cortex-A15 erratum #830321
|
|
|
strex r1, r2, [sp] @ clear the exclusive monitor
|
|
|
-#elif defined(CONFIG_CPU_32v6K)
|
|
|
- clrex @ clear the exclusive monitor
|
|
|
#endif
|
|
|
.if \fast
|
|
|
ldmdb sp, {r1 - lr}^ @ get calling r1 - lr
|
|
@@ -261,7 +256,10 @@
|
|
|
.endif
|
|
|
ldr lr, [sp, #S_SP] @ top of the stack
|
|
|
ldrd r0, r1, [sp, #S_LR] @ calling lr and pc
|
|
|
- clrex @ clear the exclusive monitor
|
|
|
+
|
|
|
+ @ We must avoid clrex due to Cortex-A15 erratum #830321
|
|
|
+ strex r2, r1, [sp, #S_LR] @ clear the exclusive monitor
|
|
|
+
|
|
|
stmdb lr!, {r0, r1, \rpsr} @ calling lr and rfe context
|
|
|
ldmia sp, {r0 - r12}
|
|
|
mov sp, lr
|
|
@@ -282,13 +280,16 @@
|
|
|
.endm
|
|
|
#else /* ifdef CONFIG_CPU_V7M */
|
|
|
.macro restore_user_regs, fast = 0, offset = 0
|
|
|
- clrex @ clear the exclusive monitor
|
|
|
mov r2, sp
|
|
|
load_user_sp_lr r2, r3, \offset + S_SP @ calling sp, lr
|
|
|
ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr
|
|
|
ldr lr, [sp, #\offset + S_PC] @ get pc
|
|
|
add sp, sp, #\offset + S_SP
|
|
|
msr spsr_cxsf, r1 @ save in spsr_svc
|
|
|
+
|
|
|
+ @ We must avoid clrex due to Cortex-A15 erratum #830321
|
|
|
+ strex r1, r2, [sp] @ clear the exclusive monitor
|
|
|
+
|
|
|
.if \fast
|
|
|
ldmdb sp, {r1 - r12} @ get calling r1 - r12
|
|
|
.else
|