]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerZefan Li <lizefan@huawei.com>
Wed, 27 Apr 2016 10:55:19 +0000 (18:55 +0800)
commit 6ecf830e5029598732e04067e325d946097519cb upstream.

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>
Signed-off-by: Zefan Li <lizefan@huawei.com>
arch/arm/kernel/signal.c

index d68d1b6946809831458d03d8a020ea32f571c62f..ffc0902323891d1797fd3e21a117a4b8af5ab52a 100644 (file)
@@ -437,12 +437,18 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
                 */
                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;
        }