blob: 720729b7fc49d3b5bf1dcd06d7537158f42c44f3 [file] [log] [blame]
Nicholas Flintham1e3d3112013-04-10 10:48:38 +01001#ifndef _LINUX_TRACE_IRQFLAGS_H
2#define _LINUX_TRACE_IRQFLAGS_H
3
4#include <linux/typecheck.h>
5#include <asm/irqflags.h>
6
7#ifdef CONFIG_TRACE_IRQFLAGS
8 extern void trace_softirqs_on(unsigned long ip);
9 extern void trace_softirqs_off(unsigned long ip);
10 extern void trace_hardirqs_on(void);
11 extern void trace_hardirqs_off(void);
12# define trace_hardirq_context(p) ((p)->hardirq_context)
13# define trace_softirq_context(p) ((p)->softirq_context)
14# define trace_hardirqs_enabled(p) ((p)->hardirqs_enabled)
15# define trace_softirqs_enabled(p) ((p)->softirqs_enabled)
16# define trace_hardirq_enter() do { current->hardirq_context++; } while (0)
17# define trace_hardirq_exit() do { current->hardirq_context--; } while (0)
18# define lockdep_softirq_enter() do { current->softirq_context++; } while (0)
19# define lockdep_softirq_exit() do { current->softirq_context--; } while (0)
20# define INIT_TRACE_IRQFLAGS .softirqs_enabled = 1,
21#else
22# define trace_hardirqs_on() do { } while (0)
23# define trace_hardirqs_off() do { } while (0)
24# define trace_softirqs_on(ip) do { } while (0)
25# define trace_softirqs_off(ip) do { } while (0)
26# define trace_hardirq_context(p) 0
27# define trace_softirq_context(p) 0
28# define trace_hardirqs_enabled(p) 0
29# define trace_softirqs_enabled(p) 0
30# define trace_hardirq_enter() do { } while (0)
31# define trace_hardirq_exit() do { } while (0)
32# define lockdep_softirq_enter() do { } while (0)
33# define lockdep_softirq_exit() do { } while (0)
34# define INIT_TRACE_IRQFLAGS
35#endif
36
37#if defined(CONFIG_IRQSOFF_TRACER) || \
38 defined(CONFIG_PREEMPT_TRACER)
39 extern void stop_critical_timings(void);
40 extern void start_critical_timings(void);
41#else
42# define stop_critical_timings() do { } while (0)
43# define start_critical_timings() do { } while (0)
44#endif
45
46#define raw_local_irq_disable() arch_local_irq_disable()
47#define raw_local_irq_enable() arch_local_irq_enable()
48#define raw_local_irq_save(flags) \
49 do { \
50 typecheck(unsigned long, flags); \
51 flags = arch_local_irq_save(); \
52 } while (0)
53#define raw_local_irq_restore(flags) \
54 do { \
55 typecheck(unsigned long, flags); \
56 arch_local_irq_restore(flags); \
57 } while (0)
58#define raw_local_save_flags(flags) \
59 do { \
60 typecheck(unsigned long, flags); \
61 flags = arch_local_save_flags(); \
62 } while (0)
63#define raw_irqs_disabled_flags(flags) \
64 ({ \
65 typecheck(unsigned long, flags); \
66 arch_irqs_disabled_flags(flags); \
67 })
68#define raw_irqs_disabled() (arch_irqs_disabled())
69#define raw_safe_halt() arch_safe_halt()
70
71#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
72#define local_irq_enable() \
73 do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
74#define local_irq_disable() \
75 do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0)
76#define local_irq_save(flags) \
77 do { \
78 raw_local_irq_save(flags); \
79 trace_hardirqs_off(); \
80 } while (0)
81
82
83#define local_irq_restore(flags) \
84 do { \
85 if (raw_irqs_disabled_flags(flags)) { \
86 raw_local_irq_restore(flags); \
87 trace_hardirqs_off(); \
88 } else { \
89 trace_hardirqs_on(); \
90 raw_local_irq_restore(flags); \
91 } \
92 } while (0)
93#define local_save_flags(flags) \
94 do { \
95 raw_local_save_flags(flags); \
96 } while (0)
97
98#define irqs_disabled_flags(flags) \
99 ({ \
100 raw_irqs_disabled_flags(flags); \
101 })
102
103#define irqs_disabled() \
104 ({ \
105 unsigned long _flags; \
106 raw_local_save_flags(_flags); \
107 raw_irqs_disabled_flags(_flags); \
108 })
109
110#define safe_halt() \
111 do { \
112 trace_hardirqs_on(); \
113 raw_safe_halt(); \
114 } while (0)
115
116
117#else
118
119#define local_irq_enable() do { raw_local_irq_enable(); } while (0)
120#define local_irq_disable() do { raw_local_irq_disable(); } while (0)
121#define local_irq_save(flags) \
122 do { \
123 raw_local_irq_save(flags); \
124 } while (0)
125#define local_irq_restore(flags) do { raw_local_irq_restore(flags); } while (0)
126#define local_save_flags(flags) do { raw_local_save_flags(flags); } while (0)
127#define irqs_disabled() (raw_irqs_disabled())
128#define irqs_disabled_flags(flags) (raw_irqs_disabled_flags(flags))
129#define safe_halt() do { raw_safe_halt(); } while (0)
130
131#endif
132
133#endif