1#include <asm/trace/irq_vectors.h>
2#include <linux/trace.h>
3
4#if defined(CONFIG_OSNOISE_TRACER) && defined(CONFIG_X86_LOCAL_APIC)
5/*
6 * trace_intel_irq_entry - record intel specific IRQ entry
7 */
8static void trace_intel_irq_entry(void *data, int vector)
9{
10 osnoise_trace_irq_entry(id: vector);
11}
12
13/*
14 * trace_intel_irq_exit - record intel specific IRQ exit
15 */
16static void trace_intel_irq_exit(void *data, int vector)
17{
18 char *vector_desc = (char *) data;
19
20 osnoise_trace_irq_exit(id: vector, desc: vector_desc);
21}
22
23/*
24 * register_intel_irq_tp - Register intel specific IRQ entry tracepoints
25 */
26int osnoise_arch_register(void)
27{
28 int ret;
29
30 ret = register_trace_local_timer_entry(probe: trace_intel_irq_entry, NULL);
31 if (ret)
32 goto out_err;
33
34 ret = register_trace_local_timer_exit(probe: trace_intel_irq_exit, data: "local_timer");
35 if (ret)
36 goto out_timer_entry;
37
38#ifdef CONFIG_X86_THERMAL_VECTOR
39 ret = register_trace_thermal_apic_entry(probe: trace_intel_irq_entry, NULL);
40 if (ret)
41 goto out_timer_exit;
42
43 ret = register_trace_thermal_apic_exit(probe: trace_intel_irq_exit, data: "thermal_apic");
44 if (ret)
45 goto out_thermal_entry;
46#endif /* CONFIG_X86_THERMAL_VECTOR */
47
48#ifdef CONFIG_X86_MCE_AMD
49 ret = register_trace_deferred_error_apic_entry(probe: trace_intel_irq_entry, NULL);
50 if (ret)
51 goto out_thermal_exit;
52
53 ret = register_trace_deferred_error_apic_exit(probe: trace_intel_irq_exit, data: "deferred_error");
54 if (ret)
55 goto out_deferred_entry;
56#endif
57
58#ifdef CONFIG_X86_MCE_THRESHOLD
59 ret = register_trace_threshold_apic_entry(probe: trace_intel_irq_entry, NULL);
60 if (ret)
61 goto out_deferred_exit;
62
63 ret = register_trace_threshold_apic_exit(probe: trace_intel_irq_exit, data: "threshold_apic");
64 if (ret)
65 goto out_threshold_entry;
66#endif /* CONFIG_X86_MCE_THRESHOLD */
67
68#ifdef CONFIG_SMP
69 ret = register_trace_call_function_single_entry(probe: trace_intel_irq_entry, NULL);
70 if (ret)
71 goto out_threshold_exit;
72
73 ret = register_trace_call_function_single_exit(probe: trace_intel_irq_exit,
74 data: "call_function_single");
75 if (ret)
76 goto out_call_function_single_entry;
77
78 ret = register_trace_call_function_entry(probe: trace_intel_irq_entry, NULL);
79 if (ret)
80 goto out_call_function_single_exit;
81
82 ret = register_trace_call_function_exit(probe: trace_intel_irq_exit, data: "call_function");
83 if (ret)
84 goto out_call_function_entry;
85
86 ret = register_trace_reschedule_entry(probe: trace_intel_irq_entry, NULL);
87 if (ret)
88 goto out_call_function_exit;
89
90 ret = register_trace_reschedule_exit(probe: trace_intel_irq_exit, data: "reschedule");
91 if (ret)
92 goto out_reschedule_entry;
93#endif /* CONFIG_SMP */
94
95#ifdef CONFIG_IRQ_WORK
96 ret = register_trace_irq_work_entry(probe: trace_intel_irq_entry, NULL);
97 if (ret)
98 goto out_reschedule_exit;
99
100 ret = register_trace_irq_work_exit(probe: trace_intel_irq_exit, data: "irq_work");
101 if (ret)
102 goto out_irq_work_entry;
103#endif
104
105 ret = register_trace_x86_platform_ipi_entry(probe: trace_intel_irq_entry, NULL);
106 if (ret)
107 goto out_irq_work_exit;
108
109 ret = register_trace_x86_platform_ipi_exit(probe: trace_intel_irq_exit, data: "x86_platform_ipi");
110 if (ret)
111 goto out_x86_ipi_entry;
112
113 ret = register_trace_error_apic_entry(probe: trace_intel_irq_entry, NULL);
114 if (ret)
115 goto out_x86_ipi_exit;
116
117 ret = register_trace_error_apic_exit(probe: trace_intel_irq_exit, data: "error_apic");
118 if (ret)
119 goto out_error_apic_entry;
120
121 ret = register_trace_spurious_apic_entry(probe: trace_intel_irq_entry, NULL);
122 if (ret)
123 goto out_error_apic_exit;
124
125 ret = register_trace_spurious_apic_exit(probe: trace_intel_irq_exit, data: "spurious_apic");
126 if (ret)
127 goto out_spurious_apic_entry;
128
129 return 0;
130
131out_spurious_apic_entry:
132 unregister_trace_spurious_apic_entry(probe: trace_intel_irq_entry, NULL);
133out_error_apic_exit:
134 unregister_trace_error_apic_exit(probe: trace_intel_irq_exit, data: "error_apic");
135out_error_apic_entry:
136 unregister_trace_error_apic_entry(probe: trace_intel_irq_entry, NULL);
137out_x86_ipi_exit:
138 unregister_trace_x86_platform_ipi_exit(probe: trace_intel_irq_exit, data: "x86_platform_ipi");
139out_x86_ipi_entry:
140 unregister_trace_x86_platform_ipi_entry(probe: trace_intel_irq_entry, NULL);
141out_irq_work_exit:
142
143#ifdef CONFIG_IRQ_WORK
144 unregister_trace_irq_work_exit(probe: trace_intel_irq_exit, data: "irq_work");
145out_irq_work_entry:
146 unregister_trace_irq_work_entry(probe: trace_intel_irq_entry, NULL);
147out_reschedule_exit:
148#endif
149
150#ifdef CONFIG_SMP
151 unregister_trace_reschedule_exit(probe: trace_intel_irq_exit, data: "reschedule");
152out_reschedule_entry:
153 unregister_trace_reschedule_entry(probe: trace_intel_irq_entry, NULL);
154out_call_function_exit:
155 unregister_trace_call_function_exit(probe: trace_intel_irq_exit, data: "call_function");
156out_call_function_entry:
157 unregister_trace_call_function_entry(probe: trace_intel_irq_entry, NULL);
158out_call_function_single_exit:
159 unregister_trace_call_function_single_exit(probe: trace_intel_irq_exit, data: "call_function_single");
160out_call_function_single_entry:
161 unregister_trace_call_function_single_entry(probe: trace_intel_irq_entry, NULL);
162out_threshold_exit:
163#endif
164
165#ifdef CONFIG_X86_MCE_THRESHOLD
166 unregister_trace_threshold_apic_exit(probe: trace_intel_irq_exit, data: "threshold_apic");
167out_threshold_entry:
168 unregister_trace_threshold_apic_entry(probe: trace_intel_irq_entry, NULL);
169out_deferred_exit:
170#endif
171
172#ifdef CONFIG_X86_MCE_AMD
173 unregister_trace_deferred_error_apic_exit(probe: trace_intel_irq_exit, data: "deferred_error");
174out_deferred_entry:
175 unregister_trace_deferred_error_apic_entry(probe: trace_intel_irq_entry, NULL);
176out_thermal_exit:
177#endif /* CONFIG_X86_MCE_AMD */
178
179#ifdef CONFIG_X86_THERMAL_VECTOR
180 unregister_trace_thermal_apic_exit(probe: trace_intel_irq_exit, data: "thermal_apic");
181out_thermal_entry:
182 unregister_trace_thermal_apic_entry(probe: trace_intel_irq_entry, NULL);
183out_timer_exit:
184#endif /* CONFIG_X86_THERMAL_VECTOR */
185
186 unregister_trace_local_timer_exit(probe: trace_intel_irq_exit, data: "local_timer");
187out_timer_entry:
188 unregister_trace_local_timer_entry(probe: trace_intel_irq_entry, NULL);
189out_err:
190 return -EINVAL;
191}
192
193void osnoise_arch_unregister(void)
194{
195 unregister_trace_spurious_apic_exit(probe: trace_intel_irq_exit, data: "spurious_apic");
196 unregister_trace_spurious_apic_entry(probe: trace_intel_irq_entry, NULL);
197 unregister_trace_error_apic_exit(probe: trace_intel_irq_exit, data: "error_apic");
198 unregister_trace_error_apic_entry(probe: trace_intel_irq_entry, NULL);
199 unregister_trace_x86_platform_ipi_exit(probe: trace_intel_irq_exit, data: "x86_platform_ipi");
200 unregister_trace_x86_platform_ipi_entry(probe: trace_intel_irq_entry, NULL);
201
202#ifdef CONFIG_IRQ_WORK
203 unregister_trace_irq_work_exit(probe: trace_intel_irq_exit, data: "irq_work");
204 unregister_trace_irq_work_entry(probe: trace_intel_irq_entry, NULL);
205#endif
206
207#ifdef CONFIG_SMP
208 unregister_trace_reschedule_exit(probe: trace_intel_irq_exit, data: "reschedule");
209 unregister_trace_reschedule_entry(probe: trace_intel_irq_entry, NULL);
210 unregister_trace_call_function_exit(probe: trace_intel_irq_exit, data: "call_function");
211 unregister_trace_call_function_entry(probe: trace_intel_irq_entry, NULL);
212 unregister_trace_call_function_single_exit(probe: trace_intel_irq_exit, data: "call_function_single");
213 unregister_trace_call_function_single_entry(probe: trace_intel_irq_entry, NULL);
214#endif
215
216#ifdef CONFIG_X86_MCE_THRESHOLD
217 unregister_trace_threshold_apic_exit(probe: trace_intel_irq_exit, data: "threshold_apic");
218 unregister_trace_threshold_apic_entry(probe: trace_intel_irq_entry, NULL);
219#endif
220
221#ifdef CONFIG_X86_MCE_AMD
222 unregister_trace_deferred_error_apic_exit(probe: trace_intel_irq_exit, data: "deferred_error");
223 unregister_trace_deferred_error_apic_entry(probe: trace_intel_irq_entry, NULL);
224#endif
225
226#ifdef CONFIG_X86_THERMAL_VECTOR
227 unregister_trace_thermal_apic_exit(probe: trace_intel_irq_exit, data: "thermal_apic");
228 unregister_trace_thermal_apic_entry(probe: trace_intel_irq_entry, NULL);
229#endif /* CONFIG_X86_THERMAL_VECTOR */
230
231 unregister_trace_local_timer_exit(probe: trace_intel_irq_exit, data: "local_timer");
232 unregister_trace_local_timer_entry(probe: trace_intel_irq_entry, NULL);
233}
234#endif /* CONFIG_OSNOISE_TRACER && CONFIG_X86_LOCAL_APIC */
235

source code of linux/arch/x86/kernel/trace.c