The patch below disables FIQ in IRQ handler to fix race condition
that may result in recursive entry into IRQ handler through FIQ
handler.

-- Sergei.

Index: packages/hal/arm/arch/current/ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/hal/arm/arch/current/ChangeLog,v
retrieving revision 1.104
diff -a -u -r1.104 ChangeLog
--- packages/hal/arm/arch/current/ChangeLog     21 Apr 2005 18:17:54 -0000      
1.104
+++ packages/hal/arm/arch/current/ChangeLog     6 Feb 2006 18:27:06 -0000
@@ -1,3 +1,9 @@
+2006-02-06  Sergei Organov  <[EMAIL PROTECTED]>
+
+       * src/vectors.S: disable FIQ in IRQ handler to fix race condition
+       recursively entering IRQ handler through FIQ handler. Remove
+       unreferenced handle_IRQ_or_FIQ label.
+
 2005-04-21  Ian Campbell  <[EMAIL PROTECTED]>
 
        * src/redboot_linux_exec.c: Added -t option which takes the
Index: packages/hal/arm/arch/current/src/vectors.S
===================================================================
RCS file: /cvs/ecos/ecos/packages/hal/arm/arch/current/src/vectors.S,v
retrieving revision 1.55
diff -a -u -r1.55 vectors.S
--- packages/hal/arm/arch/current/src/vectors.S 23 Nov 2004 14:11:19 -0000      
1.55
+++ packages/hal/arm/arch/current/src/vectors.S 6 Feb 2006 18:27:09 -0000
@@ -787,11 +787,14 @@
         mov     r2,#CYGNUM_HAL_VECTOR_IRQ
         mov     r3,sp
        
-handle_IRQ_or_FIQ:
-
         mrs     r4,cpsr                 // switch to Supervisor Mode
         bic     r4,r4,#CPSR_MODE_BITS
-        orr     r4,r4,#CPSR_SUPERVISOR_MODE
+        // We must disable FIQ here (IRQ is already disabled) as switching 
+        // from IRQ to SVC mode will cheat FIQ handler and it will pass 
through 
+        // the control back to us (should FIQ happen after the statement 
below) 
+        // resulting in recursion that we aren't ready to handle, e.g., what 
+        // we have saved on the exception stack will be clobbered.
+        orr     r4,r4,#CPSR_SUPERVISOR_MODE|CPSR_FIQ_DISABLE
         msr     cpsr,r4
 
         mov     r5,sp                   // save original svc sp

Reply via email to