|
@@ -300,6 +300,8 @@
|
|
|
mov r2, sp
|
|
|
ldr r1, [r2, #\offset + S_PSR] @ get calling cpsr
|
|
|
ldr lr, [r2, #\offset + S_PC]! @ get pc
|
|
|
+ tst r1, #0xcf
|
|
|
+ bne 1f
|
|
|
msr spsr_cxsf, r1 @ save in spsr_svc
|
|
|
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_32v6K)
|
|
|
@ We must avoid clrex due to Cortex-A15 erratum #830321
|
|
@@ -314,6 +316,7 @@
|
|
|
@ after ldm {}^
|
|
|
add sp, sp, #\offset + PT_REGS_SIZE
|
|
|
movs pc, lr @ return & move spsr_svc into cpsr
|
|
|
+1: bug "Returning to usermode but unexpected PSR bits set?", \@
|
|
|
#elif defined(CONFIG_CPU_V7M)
|
|
|
@ V7M restore.
|
|
|
@ Note that we don't need to do clrex here as clearing the local
|
|
@@ -329,6 +332,8 @@
|
|
|
ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr
|
|
|
ldr lr, [sp, #\offset + S_PC] @ get pc
|
|
|
add sp, sp, #\offset + S_SP
|
|
|
+ tst r1, #0xcf
|
|
|
+ bne 1f
|
|
|
msr spsr_cxsf, r1 @ save in spsr_svc
|
|
|
|
|
|
@ We must avoid clrex due to Cortex-A15 erratum #830321
|
|
@@ -341,6 +346,7 @@
|
|
|
.endif
|
|
|
add sp, sp, #PT_REGS_SIZE - S_SP
|
|
|
movs pc, lr @ return & move spsr_svc into cpsr
|
|
|
+1: bug "Returning to usermode but unexpected PSR bits set?", \@
|
|
|
#endif /* !CONFIG_THUMB2_KERNEL */
|
|
|
.endm
|
|
|
|