diff options
-rw-r--r-- | arch/arm/kernel/entry-armv.S | 1 | ||||
-rw-r--r-- | arch/arm/mm/extable.c | 7 |
2 files changed, 7 insertions, 1 deletions
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 9cbe70c8b0ef..ec3e5cf46308 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -192,6 +192,7 @@ __dabt_svc: | |||
192 | svc_entry | 192 | svc_entry |
193 | mov r2, sp | 193 | mov r2, sp |
194 | dabt_helper | 194 | dabt_helper |
195 | THUMB( ldr r5, [sp, #S_PSR] ) @ potentially updated CPSR | ||
195 | svc_exit r5 @ return from exception | 196 | svc_exit r5 @ return from exception |
196 | UNWIND(.fnend ) | 197 | UNWIND(.fnend ) |
197 | ENDPROC(__dabt_svc) | 198 | ENDPROC(__dabt_svc) |
diff --git a/arch/arm/mm/extable.c b/arch/arm/mm/extable.c index 9d285626bc7d..312e15e6d00b 100644 --- a/arch/arm/mm/extable.c +++ b/arch/arm/mm/extable.c | |||
@@ -9,8 +9,13 @@ int fixup_exception(struct pt_regs *regs) | |||
9 | const struct exception_table_entry *fixup; | 9 | const struct exception_table_entry *fixup; |
10 | 10 | ||
11 | fixup = search_exception_tables(instruction_pointer(regs)); | 11 | fixup = search_exception_tables(instruction_pointer(regs)); |
12 | if (fixup) | 12 | if (fixup) { |
13 | regs->ARM_pc = fixup->fixup; | 13 | regs->ARM_pc = fixup->fixup; |
14 | #ifdef CONFIG_THUMB2_KERNEL | ||
15 | /* Clear the IT state to avoid nasty surprises in the fixup */ | ||
16 | regs->ARM_cpsr &= ~PSR_IT_MASK; | ||
17 | #endif | ||
18 | } | ||
14 | 19 | ||
15 | return fixup != NULL; | 20 | return fixup != NULL; |
16 | } | 21 | } |