| From 9b55613f42e8d40d5c9ccb8970bde6af4764b2ab Mon Sep 17 00:00:00 2001 |
| From: Russell King <rmk+kernel@arm.linux.org.uk> |
| Date: Fri, 11 Sep 2015 16:44:02 +0100 |
| Subject: ARM: fix Thumb2 signal handling when ARMv6 is enabled |
| |
| From: Russell King <rmk+kernel@arm.linux.org.uk> |
| |
| commit 9b55613f42e8d40d5c9ccb8970bde6af4764b2ab 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: d71e1352e240 ("Clear the IT state when invoking a Thumb-2 signal handler") |
| Acked-by: Tony Lindgren <tony@atomide.com> |
| Tested-by: H. Nikolaus Schaller <hns@goldelico.com> |
| Tested-by: Grazvydas Ignotas <notasas@gmail.com> |
| Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/arm/kernel/signal.c | 15 ++++++++++----- |
| 1 file changed, 10 insertions(+), 5 deletions(-) |
| |
| --- a/arch/arm/kernel/signal.c |
| +++ b/arch/arm/kernel/signal.c |
| @@ -353,12 +353,17 @@ setup_return(struct pt_regs *regs, struc |
| */ |
| thumb = handler & 1; |
| |
| -#if __LINUX_ARM_ARCH__ >= 7 |
| +#if __LINUX_ARM_ARCH__ >= 6 |
| /* |
| - * 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. |
| + * 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. |
| + * |
| + * 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; |
| #endif |