#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