#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_CM3
+ /* Cortex-M3 */
+ #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())
+
+ /* TODO: context switch is not yet supported */
+ #define DECLARE_ISR_CONTEXT_SWITCH(func) void func(void)
+
+ /* TODO: context switch is not yet supported */
+ #define ISR_PROTO_CONTEXT_SWITCH(func) void func(void)
#elif CPU_ARM
#ifdef __IAR_SYSTEMS_ICC__