1 /*
2 * include/linux/irqflags.h
3 *
4 * IRQ flags tracing: follow the state of the hardirq and softirq flags and
5 * provide callbacks for transitions between ON and OFF states.
6 *
7 * This file gets included from lowlevel asm headers too, to provide
8 * wrapped versions of the local_irq_*() APIs, based on the
9 * raw_local_irq_*() macros from the lowlevel headers.
10 */
11 #ifndef _LINUX_TRACE_IRQFLAGS_H
12 #define _LINUX_TRACE_IRQFLAGS_H
13
14 #if !defined(BUILD_CHECK_IRQ_FLAGS) && defined(typecheck)
15 #define BUILD_CHECK_IRQ_FLAGS(flags) \
16 do { \
17 BUILD_BUG_ON(sizeof(flags) != sizeof(unsigned long)); \
18 typecheck(unsigned long, flags); \
19 } while (0)
20 #else
21 #define BUILD_CHECK_IRQ_FLAGS(flags)
22 #endif
23
24 #ifdef CONFIG_TRACE_IRQFLAGS
25 extern void trace_hardirqs_on(void);
26 extern void trace_hardirqs_off(void);
27 extern void trace_softirqs_on(unsigned long ip);
28 extern void trace_softirqs_off(unsigned long ip);
29 # define trace_hardirq_context(p) ((p)->hardirq_context)
30 # define trace_softirq_context(p) ((p)->softirq_context)
31 # define trace_hardirqs_enabled(p) ((p)->hardirqs_enabled)
32 # define trace_softirqs_enabled(p) ((p)->softirqs_enabled)
33 # define trace_hardirq_enter() do { current->hardirq_context++; } while (0)
34 # define trace_hardirq_exit() do { current->hardirq_context--; } while (0)
35 # define trace_softirq_enter() do { current->softirq_context++; } while (0)
36 # define trace_softirq_exit() do { current->softirq_context--; } while (0)
37 # define INIT_TRACE_IRQFLAGS .softirqs_enabled = 1,
38 #else
39 # define trace_hardirqs_on() do { } while (0)
40 # define trace_hardirqs_off() do { } while (0)
41 # define trace_softirqs_on(ip) do { } while (0)
42 # define trace_softirqs_off(ip) do { } while (0)
43 # define trace_hardirq_context(p) 0
44 # define trace_softirq_context(p) 0
45 # define trace_hardirqs_enabled(p) 0
46 # define trace_softirqs_enabled(p) 0
47 # define trace_hardirq_enter() do { } while (0)
48 # define trace_hardirq_exit() do { } while (0)
49 # define trace_softirq_enter() do { } while (0)
50 # define trace_softirq_exit() do { } while (0)
51 # define INIT_TRACE_IRQFLAGS
52 #endif
53
54 #if defined(CONFIG_IRQSOFF_TRACER) || \
55 defined(CONFIG_PREEMPT_TRACER)
56 extern void stop_critical_timings(void);
57 extern void start_critical_timings(void);
58 #else
59 # define stop_critical_timings() do { } while (0)
60 # define start_critical_timings() do { } while (0)
61 #endif
62
63 #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
64
65 #include <asm/irqflags.h>
66
67 #define local_irq_enable() \
68 do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
69 #define local_irq_disable() \
70 do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0)
71 #define local_irq_save(flags) \
72 do { \
73 BUILD_CHECK_IRQ_FLAGS(flags); \
74 raw_local_irq_save(flags); \
75 trace_hardirqs_off(); \
76 } while (0)
77
78 #define local_irq_restore(flags) \
79 do { \
80 BUILD_CHECK_IRQ_FLAGS(flags); \
81 if (raw_irqs_disabled_flags(flags)) { \
82 raw_local_irq_restore(flags); \
83 trace_hardirqs_off(); \
84 } else { \
85 trace_hardirqs_on(); \
86 raw_local_irq_restore(flags); \
87 } \
88 } while (0)
89 #else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */
90 /*
91 * The local_irq_*() APIs are equal to the raw_local_irq*()
92 * if !TRACE_IRQFLAGS.
93 */
94 # define raw_local_irq_disable() local_irq_disable()
95 # define raw_local_irq_enable() local_irq_enable()
96 # define raw_local_irq_save(flags) \
97 do { \
98 BUILD_CHECK_IRQ_FLAGS(flags); \
99 local_irq_save(flags); \
100 } while (0)
101 # define raw_local_irq_restore(flags) \
102 do { \
103 BUILD_CHECK_IRQ_FLAGS(flags); \
104 local_irq_restore(flags); \
105 } while (0)
106 #endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */
107
108 #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
109 #define safe_halt() \
110 do { \
111 trace_hardirqs_on(); \
112 raw_safe_halt(); \
113 } while (0)
114
115 #define local_save_flags(flags) \
116 do { \
117 BUILD_CHECK_IRQ_FLAGS(flags); \
118 raw_local_save_flags(flags); \
119 } while (0)
120
121 #define irqs_disabled() \
122 ({ \
123 unsigned long flags; \
124 \
125 raw_local_save_flags(flags); \
126 raw_irqs_disabled_flags(flags); \
127 })
128
129 #define irqs_disabled_flags(flags) \
130 ({ \
131 BUILD_CHECK_IRQ_FLAGS(flags); \
132 raw_irqs_disabled_flags(flags); \
133 })
134 #endif /* CONFIG_X86 */
135
136 #endif
137
|
This page was automatically generated by the
LXR engine.
|