Commit 084e340d authored by Russell King's avatar Russell King Committed by Luis Henriques

ARM: fix Thumb2 signal handling when ARMv6 is enabled

commit 9b55613f upstream.

When a kernel is built covering ARMv6 to ARMv7, we omit to clear the
IT state when entering a signal handler.  This can cause the first
few instructions to be conditionally executed depending on the parent
context.

In any case, the original test for >= ARMv7 is broken - ARMv6 can have
Thumb-2 support as well, and an ARMv6T2 specific build would omit this
code too.

Relax the test back to ARMv6 or greater.  This results in us always
clearing the IT state bits in the PSR, even on CPUs where these bits
are reserved.  However, they're reserved for the IT state, so this
should cause no harm.

Fixes: d71e1352 ("Clear the IT state when invoking a Thumb-2 signal handler")
Acked-by: default avatarTony Lindgren <tony@atomide.com>
Tested-by: default avatarH. Nikolaus Schaller <hns@goldelico.com>
Tested-by: default avatarGrazvydas Ignotas <notasas@gmail.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
parent 97f61225
...@@ -354,12 +354,17 @@ setup_return(struct pt_regs *regs, struct ksignal *ksig, ...@@ -354,12 +354,17 @@ setup_return(struct pt_regs *regs, struct ksignal *ksig,
*/ */
thumb = handler & 1; thumb = handler & 1;
#if __LINUX_ARM_ARCH__ >= 7 #if __LINUX_ARM_ARCH__ >= 6
/* /*
* Clear the If-Then Thumb-2 execution state * Clear the If-Then Thumb-2 execution state. ARM spec
* ARM spec requires this to be all 000s in ARM mode * requires this to be all 000s in ARM mode. Snapdragon
* Snapdragon S4/Krait misbehaves on a Thumb=>ARM * S4/Krait misbehaves on a Thumb=>ARM signal transition
* signal transition without this. * without this.
*
* We must do this whenever we are running on a Thumb-2
* capable CPU, which includes ARMv6T2. However, we elect
* to do this whenever we're on an ARMv6 or later CPU for
* simplicity.
*/ */
cpsr &= ~PSR_IT_MASK; cpsr &= ~PSR_IT_MASK;
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment