1#undef TRACE_SYSTEM
2#define TRACE_SYSTEM irq_vectors
3
4#if !defined(_TRACE_IRQ_VECTORS_H) || defined(TRACE_HEADER_MULTI_READ)
5#define _TRACE_IRQ_VECTORS_H
6
7#include <linux/tracepoint.h>
8
9extern void trace_irq_vector_regfunc(void);
10extern void trace_irq_vector_unregfunc(void);
11
12DECLARE_EVENT_CLASS(x86_irq_vector,
13
14	TP_PROTO(int vector),
15
16	TP_ARGS(vector),
17
18	TP_STRUCT__entry(
19		__field(		int,	vector	)
20	),
21
22	TP_fast_assign(
23		__entry->vector = vector;
24	),
25
26	TP_printk("vector=%d", __entry->vector) );
27
28#define DEFINE_IRQ_VECTOR_EVENT(name)		\
29DEFINE_EVENT_FN(x86_irq_vector, name##_entry,	\
30	TP_PROTO(int vector),			\
31	TP_ARGS(vector),			\
32	trace_irq_vector_regfunc,		\
33	trace_irq_vector_unregfunc);		\
34DEFINE_EVENT_FN(x86_irq_vector, name##_exit,	\
35	TP_PROTO(int vector),			\
36	TP_ARGS(vector),			\
37	trace_irq_vector_regfunc,		\
38	trace_irq_vector_unregfunc);
39
40
41/*
42 * local_timer - called when entering/exiting a local timer interrupt
43 * vector handler
44 */
45DEFINE_IRQ_VECTOR_EVENT(local_timer);
46
47/*
48 * reschedule - called when entering/exiting a reschedule vector handler
49 */
50DEFINE_IRQ_VECTOR_EVENT(reschedule);
51
52/*
53 * spurious_apic - called when entering/exiting a spurious apic vector handler
54 */
55DEFINE_IRQ_VECTOR_EVENT(spurious_apic);
56
57/*
58 * error_apic - called when entering/exiting an error apic vector handler
59 */
60DEFINE_IRQ_VECTOR_EVENT(error_apic);
61
62/*
63 * x86_platform_ipi - called when entering/exiting a x86 platform ipi interrupt
64 * vector handler
65 */
66DEFINE_IRQ_VECTOR_EVENT(x86_platform_ipi);
67
68/*
69 * irq_work - called when entering/exiting a irq work interrupt
70 * vector handler
71 */
72DEFINE_IRQ_VECTOR_EVENT(irq_work);
73
74/*
75 * We must dis-allow sampling irq_work_exit() because perf event sampling
76 * itself can cause irq_work, which would lead to an infinite loop;
77 *
78 *  1) irq_work_exit happens
79 *  2) generates perf sample
80 *  3) generates irq_work
81 *  4) goto 1
82 */
83TRACE_EVENT_PERF_PERM(irq_work_exit, is_sampling_event(p_event) ? -EPERM : 0);
84
85/*
86 * call_function - called when entering/exiting a call function interrupt
87 * vector handler
88 */
89DEFINE_IRQ_VECTOR_EVENT(call_function);
90
91/*
92 * call_function_single - called when entering/exiting a call function
93 * single interrupt vector handler
94 */
95DEFINE_IRQ_VECTOR_EVENT(call_function_single);
96
97/*
98 * threshold_apic - called when entering/exiting a threshold apic interrupt
99 * vector handler
100 */
101DEFINE_IRQ_VECTOR_EVENT(threshold_apic);
102
103/*
104 * deferred_error_apic - called when entering/exiting a deferred apic interrupt
105 * vector handler
106 */
107DEFINE_IRQ_VECTOR_EVENT(deferred_error_apic);
108
109/*
110 * thermal_apic - called when entering/exiting a thermal apic interrupt
111 * vector handler
112 */
113DEFINE_IRQ_VECTOR_EVENT(thermal_apic);
114
115#undef TRACE_INCLUDE_PATH
116#define TRACE_INCLUDE_PATH .
117#define TRACE_INCLUDE_FILE irq_vectors
118#endif /*  _TRACE_IRQ_VECTORS_H */
119
120/* This part must be outside protection */
121#include <trace/define_trace.h>
122