|
@@ -12,6 +12,7 @@
|
|
#define _LINUX_TRACE_IRQFLAGS_H
|
|
#define _LINUX_TRACE_IRQFLAGS_H
|
|
|
|
|
|
#include <linux/typecheck.h>
|
|
#include <linux/typecheck.h>
|
|
|
|
+#include <asm/irqflags.h>
|
|
|
|
|
|
#ifdef CONFIG_TRACE_IRQFLAGS
|
|
#ifdef CONFIG_TRACE_IRQFLAGS
|
|
extern void trace_softirqs_on(unsigned long ip);
|
|
extern void trace_softirqs_on(unsigned long ip);
|
|
@@ -52,17 +53,45 @@
|
|
# define start_critical_timings() do { } while (0)
|
|
# define start_critical_timings() do { } while (0)
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
|
|
|
|
-
|
|
|
|
-#include <asm/irqflags.h>
|
|
|
|
|
|
+/*
|
|
|
|
+ * Wrap the arch provided IRQ routines to provide appropriate checks.
|
|
|
|
+ */
|
|
|
|
+#define raw_local_irq_disable() arch_local_irq_disable()
|
|
|
|
+#define raw_local_irq_enable() arch_local_irq_enable()
|
|
|
|
+#define raw_local_irq_save(flags) \
|
|
|
|
+ do { \
|
|
|
|
+ typecheck(unsigned long, flags); \
|
|
|
|
+ flags = arch_local_irq_save(); \
|
|
|
|
+ } while (0)
|
|
|
|
+#define raw_local_irq_restore(flags) \
|
|
|
|
+ do { \
|
|
|
|
+ typecheck(unsigned long, flags); \
|
|
|
|
+ arch_local_irq_restore(flags); \
|
|
|
|
+ } while (0)
|
|
|
|
+#define raw_local_save_flags(flags) \
|
|
|
|
+ do { \
|
|
|
|
+ typecheck(unsigned long, flags); \
|
|
|
|
+ flags = arch_local_save_flags(); \
|
|
|
|
+ } while (0)
|
|
|
|
+#define raw_irqs_disabled_flags(flags) \
|
|
|
|
+ ({ \
|
|
|
|
+ typecheck(unsigned long, flags); \
|
|
|
|
+ arch_irqs_disabled_flags(flags); \
|
|
|
|
+ })
|
|
|
|
+#define raw_irqs_disabled() (arch_irqs_disabled())
|
|
|
|
+#define raw_safe_halt() arch_safe_halt()
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * The local_irq_*() APIs are equal to the raw_local_irq*()
|
|
|
|
+ * if !TRACE_IRQFLAGS.
|
|
|
|
+ */
|
|
|
|
+#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
|
|
#define local_irq_enable() \
|
|
#define local_irq_enable() \
|
|
do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
|
|
do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
|
|
#define local_irq_disable() \
|
|
#define local_irq_disable() \
|
|
do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0)
|
|
do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0)
|
|
#define local_irq_save(flags) \
|
|
#define local_irq_save(flags) \
|
|
do { \
|
|
do { \
|
|
- typecheck(unsigned long, flags); \
|
|
|
|
raw_local_irq_save(flags); \
|
|
raw_local_irq_save(flags); \
|
|
trace_hardirqs_off(); \
|
|
trace_hardirqs_off(); \
|
|
} while (0)
|
|
} while (0)
|
|
@@ -70,7 +99,6 @@
|
|
|
|
|
|
#define local_irq_restore(flags) \
|
|
#define local_irq_restore(flags) \
|
|
do { \
|
|
do { \
|
|
- typecheck(unsigned long, flags); \
|
|
|
|
if (raw_irqs_disabled_flags(flags)) { \
|
|
if (raw_irqs_disabled_flags(flags)) { \
|
|
raw_local_irq_restore(flags); \
|
|
raw_local_irq_restore(flags); \
|
|
trace_hardirqs_off(); \
|
|
trace_hardirqs_off(); \
|
|
@@ -79,51 +107,44 @@
|
|
raw_local_irq_restore(flags); \
|
|
raw_local_irq_restore(flags); \
|
|
} \
|
|
} \
|
|
} while (0)
|
|
} while (0)
|
|
-#else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */
|
|
|
|
-/*
|
|
|
|
- * The local_irq_*() APIs are equal to the raw_local_irq*()
|
|
|
|
- * if !TRACE_IRQFLAGS.
|
|
|
|
- */
|
|
|
|
-# define raw_local_irq_disable() local_irq_disable()
|
|
|
|
-# define raw_local_irq_enable() local_irq_enable()
|
|
|
|
-# define raw_local_irq_save(flags) \
|
|
|
|
- do { \
|
|
|
|
- typecheck(unsigned long, flags); \
|
|
|
|
- local_irq_save(flags); \
|
|
|
|
- } while (0)
|
|
|
|
-# define raw_local_irq_restore(flags) \
|
|
|
|
|
|
+#define local_save_flags(flags) \
|
|
do { \
|
|
do { \
|
|
- typecheck(unsigned long, flags); \
|
|
|
|
- local_irq_restore(flags); \
|
|
|
|
|
|
+ raw_local_save_flags(flags); \
|
|
} while (0)
|
|
} while (0)
|
|
-#endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */
|
|
|
|
|
|
|
|
-#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
|
|
|
|
-#define safe_halt() \
|
|
|
|
- do { \
|
|
|
|
- trace_hardirqs_on(); \
|
|
|
|
- raw_safe_halt(); \
|
|
|
|
- } while (0)
|
|
|
|
|
|
+#define irqs_disabled_flags(flags) \
|
|
|
|
+ ({ \
|
|
|
|
+ raw_irqs_disabled_flags(flags); \
|
|
|
|
+ })
|
|
|
|
|
|
-#define local_save_flags(flags) \
|
|
|
|
- do { \
|
|
|
|
- typecheck(unsigned long, flags); \
|
|
|
|
- raw_local_save_flags(flags); \
|
|
|
|
|
|
+#define irqs_disabled() \
|
|
|
|
+ ({ \
|
|
|
|
+ unsigned long _flags; \
|
|
|
|
+ raw_local_save_flags(_flags); \
|
|
|
|
+ raw_irqs_disabled_flags(_flags); \
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+#define safe_halt() \
|
|
|
|
+ do { \
|
|
|
|
+ trace_hardirqs_on(); \
|
|
|
|
+ raw_safe_halt(); \
|
|
} while (0)
|
|
} while (0)
|
|
|
|
|
|
-#define irqs_disabled() \
|
|
|
|
-({ \
|
|
|
|
- unsigned long _flags; \
|
|
|
|
- \
|
|
|
|
- raw_local_save_flags(_flags); \
|
|
|
|
- raw_irqs_disabled_flags(_flags); \
|
|
|
|
-})
|
|
|
|
|
|
|
|
-#define irqs_disabled_flags(flags) \
|
|
|
|
-({ \
|
|
|
|
- typecheck(unsigned long, flags); \
|
|
|
|
- raw_irqs_disabled_flags(flags); \
|
|
|
|
-})
|
|
|
|
|
|
+#else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */
|
|
|
|
+
|
|
|
|
+#define local_irq_enable() do { raw_local_irq_enable(); } while (0)
|
|
|
|
+#define local_irq_disable() do { raw_local_irq_disable(); } while (0)
|
|
|
|
+#define local_irq_save(flags) \
|
|
|
|
+ do { \
|
|
|
|
+ raw_local_irq_save(flags); \
|
|
|
|
+ } while (0)
|
|
|
|
+#define local_irq_restore(flags) do { raw_local_irq_restore(flags); } while (0)
|
|
|
|
+#define local_save_flags(flags) do { raw_local_save_flags(flags); } while (0)
|
|
|
|
+#define irqs_disabled() (raw_irqs_disabled())
|
|
|
|
+#define irqs_disabled_flags(flags) (raw_irqs_disabled_flags(flags))
|
|
|
|
+#define safe_halt() do { raw_safe_halt(); } while (0)
|
|
|
|
+
|
|
#endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */
|
|
#endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */
|
|
|
|
|
|
#endif
|
|
#endif
|