introduce UNREACHABLE() macro.
[bertos.git] / bertos / cpu / irq.h
index 4e61f20a41590f3462d3e602f96289a683447f40..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