cortex-m3: add basic support for the lm3s1968 board.
[bertos.git] / bertos / cpu / irq.h
index 83b0496415751f3fa601cb0649fc3c39579aa5c8..462034fe669e700099ec2c93f37830dae5f34a77 100644 (file)
@@ -44,7 +44,7 @@
 #include "detect.h"
 #include "types.h"
 
-#include <kern/preempt.h>
+#include <kern/proc.h> /* proc_needPreempt() / proc_preempt() */
 
 #include <cfg/compiler.h> /* for uintXX_t */
 #include "cfg/cfg_proc.h" /* CONFIG_KERN_PREEMPT */
                #define IRQ_RESTORE(x)          FIXME
        #endif /* OS_EMBEDDED */
 
+#elif CPU_ARM_LM3S1968
+
+       #define IRQ_DISABLE asm volatile ("cpsid i" : : : "memory", "cc")
+       #define IRQ_ENABLE asm volatile ("cpsie i" : : : "memory", "cc")
+
+       #define IRQ_SAVE_DISABLE(x)                                     \
+       ({                                                              \
+               asm volatile (                                          \
+                       "mrs %0, PRIMASK\n"                             \
+                       "cpsid i"                                       \
+                       : "=r" (x) : : "memory", "cc");                 \
+       })
+
+       #define IRQ_RESTORE(x)                                          \
+       ({                                                              \
+               if (x)                                                  \
+                       IRQ_DISABLE;                                    \
+               else                                                    \
+                       IRQ_ENABLE;                                     \
+       })
+
+       #define CPU_READ_FLAGS()                                        \
+       ({                                                              \
+               cpu_flags_t sreg;                                       \
+               asm volatile (                                          \
+                       "mrs %0, PRIMASK\n\t"                           \
+                       : "=r" (sreg) : : "memory", "cc");              \
+               sreg;                                                   \
+       })
+
+       #define IRQ_ENABLED() (!CPU_READ_FLAGS())
 
 #elif CPU_ARM
 
                        }                                               \
                        INLINE void __isr_##vect(void)
 
-               /**
-                * Interrupt service routine prototype: can be used for
-                * forward declarations.
-                */
-               #define ISR_PROTO(vect) ISR(vect)
-
                /**
                 * With task priorities enabled each ISR is used a point to
                 * check if we need to perform a context switch.
                #if CONFIG_KERN_PRI
                        #define DECLARE_ISR(func) \
                                DECLARE_ISR_CONTEXT_SWITCH(func)
-
+                       /**
+                        * Interrupt service routine prototype: can be used for
+                        * forward declarations.
+                        */
                        #define ISR_PROTO(func) \
                                ISR_PROTO_CONTEXT_SWITCH(func)
                #endif /* !CONFIG_KERN_PRI */
        #endif
 
-       #ifndef DECLARE_ISR
-               #define ISR_PROTO(vect) ISR(vect)
+       #ifndef ISR_PROTO
+               #define ISR_PROTO(vect) ISR(vect)
        #endif
        #ifndef DECLARE_ISR
                #define DECLARE_ISR(vect) ISR(vect)
        #ifndef DECLARE_ISR_CONTEXT_SWITCH
                #define DECLARE_ISR_CONTEXT_SWITCH(vect) ISR(vect)
        #endif
-       #ifndef ISR_PROTO
-               #define ISR_PROTO(func) ISR(vect)
-       #endif
        #ifndef ISR_PROTO_CONTEXT_SWITCH
                #define ISR_PROTO_CONTEXT_SWITCH(func) ISR(vect)
        #endif