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