]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ARM: 7880/1: Clear the IT state independent of the Thumb-2 mode
authorT.J. Purtell <tj@mobisocial.us>
Wed, 6 Nov 2013 17:38:05 +0000 (18:38 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 7 Nov 2013 00:19:06 +0000 (00:19 +0000)
The ARM architecture reference specifies that the IT state bits in the
PSR must be all zeros in ARM mode or behavior is unspecified.  On the
Qualcomm Snapdragon S4/Krait architecture CPUs the processor continues
to consider the IT state bits while in ARM mode.  This makes it so
that some instructions are skipped by the CPU.

Signed-off-by: T.J. Purtell <tj@mobisocial.us>
[rmk+kernel@arm.linux.org.uk: fixed whitespace formatting in patch]
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/kernel/signal.c

index ab330422527203417472a21727b1062c8a38e70f..1aa5ecdd1b3da1824967e28031f15a419dec57e4 100644 (file)
@@ -375,12 +375,18 @@ setup_return(struct pt_regs *regs, struct ksignal *ksig,
                 */
                thumb = handler & 1;
 
-               if (thumb) {
-                       cpsr |= PSR_T_BIT;
 #if __LINUX_ARM_ARCH__ >= 7
-                       /* clear the If-Then Thumb-2 execution state */
-                       cpsr &= ~PSR_IT_MASK;
+               /*
+                * Clear the If-Then Thumb-2 execution state
+                * ARM spec requires this to be all 000s in ARM mode
+                * Snapdragon S4/Krait misbehaves on a Thumb=>ARM
+                * signal transition without this.
+                */
+               cpsr &= ~PSR_IT_MASK;
 #endif
+
+               if (thumb) {
+                       cpsr |= PSR_T_BIT;
                } else
                        cpsr &= ~PSR_T_BIT;
        }