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