]> rtime.felk.cvut.cz Git - zynq/linux.git/blobdiff - arch/arm/kernel/entry-armv.S
ARM: entry: avoid enabling interrupts in prefetch/data abort handlers
[zynq/linux.git] / arch / arm / kernel / entry-armv.S
index d644d0240ad33b49cc7a21014f38e0d076178448..c46bafa2f6dc094d4df2d37d968f4f2d70ad96d5 100644 (file)
@@ -185,20 +185,15 @@ ENDPROC(__und_invalid)
 __dabt_svc:
        svc_entry
 
-       @
-       @ get ready to re-enable interrupts if appropriate
-       @
-       mrs     r9, cpsr
-       tst     r5, #PSR_I_BIT
-       biceq   r9, r9, #PSR_I_BIT
+#ifdef CONFIG_TRACE_IRQFLAGS
+       bl      trace_hardirqs_off
+#endif
 
        dabt_helper
 
        @
-       @ set desired IRQ state, then call main handler
+       @ call main handler
        @
-       debug_entry r1
-       msr     cpsr_c, r9
        mov     r2, sp
        bl      do_DataAbort
 
@@ -211,6 +206,12 @@ __dabt_svc:
        @ restore SPSR and restart the instruction
        @
        ldr     r5, [sp, #S_PSR]
+#ifdef CONFIG_TRACE_IRQFLAGS
+       tst     r5, #PSR_I_BIT
+       bleq    trace_hardirqs_on
+       tst     r5, #PSR_I_BIT
+       blne    trace_hardirqs_off
+#endif
        svc_exit r5                             @ return from exception
  UNWIND(.fnend         )
 ENDPROC(__dabt_svc)
@@ -307,16 +308,11 @@ ENDPROC(__und_svc)
 __pabt_svc:
        svc_entry
 
-       @
-       @ re-enable interrupts if appropriate
-       @
-       mrs     r9, cpsr
-       tst     r5, #PSR_I_BIT
-       biceq   r9, r9, #PSR_I_BIT
+#ifdef CONFIG_TRACE_IRQFLAGS
+       bl      trace_hardirqs_off
+#endif
 
        pabt_helper
-       debug_entry r1
-       msr     cpsr_c, r9                      @ Maybe enable interrupts
        mov     r2, sp                          @ regs
        bl      do_PrefetchAbort                @ call abort handler
 
@@ -329,6 +325,12 @@ __pabt_svc:
        @ restore SPSR and restart the instruction
        @
        ldr     r5, [sp, #S_PSR]
+#ifdef CONFIG_TRACE_IRQFLAGS
+       tst     r5, #PSR_I_BIT
+       bleq    trace_hardirqs_on
+       tst     r5, #PSR_I_BIT
+       blne    trace_hardirqs_off
+#endif
        svc_exit r5                             @ return from exception
  UNWIND(.fnend         )
 ENDPROC(__pabt_svc)
@@ -412,11 +414,6 @@ __dabt_usr:
        kuser_cmpxchg_check
        dabt_helper
 
-       @
-       @ IRQs on, then call the main handler
-       @
-       debug_entry r1
-       enable_irq
        mov     r2, sp
        adr     lr, BSYM(ret_from_exception)
        b       do_DataAbort
@@ -663,8 +660,6 @@ ENDPROC(__und_usr_unknown)
 __pabt_usr:
        usr_entry
        pabt_helper
-       debug_entry r1
-       enable_irq                              @ Enable interrupts
        mov     r2, sp                          @ regs
        bl      do_PrefetchAbort                @ call abort handler
  UNWIND(.fnend         )