0001 #include <asm/trace/irq_vectors.h>
0002 #include <linux/trace.h>
0003
0004 #if defined(CONFIG_OSNOISE_TRACER) && defined(CONFIG_X86_LOCAL_APIC)
0005
0006
0007
0008 static void trace_intel_irq_entry(void *data, int vector)
0009 {
0010 osnoise_trace_irq_entry(vector);
0011 }
0012
0013
0014
0015
0016 static void trace_intel_irq_exit(void *data, int vector)
0017 {
0018 char *vector_desc = (char *) data;
0019
0020 osnoise_trace_irq_exit(vector, vector_desc);
0021 }
0022
0023
0024
0025
0026 int osnoise_arch_register(void)
0027 {
0028 int ret;
0029
0030 ret = register_trace_local_timer_entry(trace_intel_irq_entry, NULL);
0031 if (ret)
0032 goto out_err;
0033
0034 ret = register_trace_local_timer_exit(trace_intel_irq_exit, "local_timer");
0035 if (ret)
0036 goto out_timer_entry;
0037
0038 #ifdef CONFIG_X86_THERMAL_VECTOR
0039 ret = register_trace_thermal_apic_entry(trace_intel_irq_entry, NULL);
0040 if (ret)
0041 goto out_timer_exit;
0042
0043 ret = register_trace_thermal_apic_exit(trace_intel_irq_exit, "thermal_apic");
0044 if (ret)
0045 goto out_thermal_entry;
0046 #endif
0047
0048 #ifdef CONFIG_X86_MCE_AMD
0049 ret = register_trace_deferred_error_apic_entry(trace_intel_irq_entry, NULL);
0050 if (ret)
0051 goto out_thermal_exit;
0052
0053 ret = register_trace_deferred_error_apic_exit(trace_intel_irq_exit, "deferred_error");
0054 if (ret)
0055 goto out_deferred_entry;
0056 #endif
0057
0058 #ifdef CONFIG_X86_MCE_THRESHOLD
0059 ret = register_trace_threshold_apic_entry(trace_intel_irq_entry, NULL);
0060 if (ret)
0061 goto out_deferred_exit;
0062
0063 ret = register_trace_threshold_apic_exit(trace_intel_irq_exit, "threshold_apic");
0064 if (ret)
0065 goto out_threshold_entry;
0066 #endif
0067
0068 #ifdef CONFIG_SMP
0069 ret = register_trace_call_function_single_entry(trace_intel_irq_entry, NULL);
0070 if (ret)
0071 goto out_threshold_exit;
0072
0073 ret = register_trace_call_function_single_exit(trace_intel_irq_exit,
0074 "call_function_single");
0075 if (ret)
0076 goto out_call_function_single_entry;
0077
0078 ret = register_trace_call_function_entry(trace_intel_irq_entry, NULL);
0079 if (ret)
0080 goto out_call_function_single_exit;
0081
0082 ret = register_trace_call_function_exit(trace_intel_irq_exit, "call_function");
0083 if (ret)
0084 goto out_call_function_entry;
0085
0086 ret = register_trace_reschedule_entry(trace_intel_irq_entry, NULL);
0087 if (ret)
0088 goto out_call_function_exit;
0089
0090 ret = register_trace_reschedule_exit(trace_intel_irq_exit, "reschedule");
0091 if (ret)
0092 goto out_reschedule_entry;
0093 #endif
0094
0095 #ifdef CONFIG_IRQ_WORK
0096 ret = register_trace_irq_work_entry(trace_intel_irq_entry, NULL);
0097 if (ret)
0098 goto out_reschedule_exit;
0099
0100 ret = register_trace_irq_work_exit(trace_intel_irq_exit, "irq_work");
0101 if (ret)
0102 goto out_irq_work_entry;
0103 #endif
0104
0105 ret = register_trace_x86_platform_ipi_entry(trace_intel_irq_entry, NULL);
0106 if (ret)
0107 goto out_irq_work_exit;
0108
0109 ret = register_trace_x86_platform_ipi_exit(trace_intel_irq_exit, "x86_platform_ipi");
0110 if (ret)
0111 goto out_x86_ipi_entry;
0112
0113 ret = register_trace_error_apic_entry(trace_intel_irq_entry, NULL);
0114 if (ret)
0115 goto out_x86_ipi_exit;
0116
0117 ret = register_trace_error_apic_exit(trace_intel_irq_exit, "error_apic");
0118 if (ret)
0119 goto out_error_apic_entry;
0120
0121 ret = register_trace_spurious_apic_entry(trace_intel_irq_entry, NULL);
0122 if (ret)
0123 goto out_error_apic_exit;
0124
0125 ret = register_trace_spurious_apic_exit(trace_intel_irq_exit, "spurious_apic");
0126 if (ret)
0127 goto out_spurious_apic_entry;
0128
0129 return 0;
0130
0131 out_spurious_apic_entry:
0132 unregister_trace_spurious_apic_entry(trace_intel_irq_entry, NULL);
0133 out_error_apic_exit:
0134 unregister_trace_error_apic_exit(trace_intel_irq_exit, "error_apic");
0135 out_error_apic_entry:
0136 unregister_trace_error_apic_entry(trace_intel_irq_entry, NULL);
0137 out_x86_ipi_exit:
0138 unregister_trace_x86_platform_ipi_exit(trace_intel_irq_exit, "x86_platform_ipi");
0139 out_x86_ipi_entry:
0140 unregister_trace_x86_platform_ipi_entry(trace_intel_irq_entry, NULL);
0141 out_irq_work_exit:
0142
0143 #ifdef CONFIG_IRQ_WORK
0144 unregister_trace_irq_work_exit(trace_intel_irq_exit, "irq_work");
0145 out_irq_work_entry:
0146 unregister_trace_irq_work_entry(trace_intel_irq_entry, NULL);
0147 out_reschedule_exit:
0148 #endif
0149
0150 #ifdef CONFIG_SMP
0151 unregister_trace_reschedule_exit(trace_intel_irq_exit, "reschedule");
0152 out_reschedule_entry:
0153 unregister_trace_reschedule_entry(trace_intel_irq_entry, NULL);
0154 out_call_function_exit:
0155 unregister_trace_call_function_exit(trace_intel_irq_exit, "call_function");
0156 out_call_function_entry:
0157 unregister_trace_call_function_entry(trace_intel_irq_entry, NULL);
0158 out_call_function_single_exit:
0159 unregister_trace_call_function_single_exit(trace_intel_irq_exit, "call_function_single");
0160 out_call_function_single_entry:
0161 unregister_trace_call_function_single_entry(trace_intel_irq_entry, NULL);
0162 out_threshold_exit:
0163 #endif
0164
0165 #ifdef CONFIG_X86_MCE_THRESHOLD
0166 unregister_trace_threshold_apic_exit(trace_intel_irq_exit, "threshold_apic");
0167 out_threshold_entry:
0168 unregister_trace_threshold_apic_entry(trace_intel_irq_entry, NULL);
0169 out_deferred_exit:
0170 #endif
0171
0172 #ifdef CONFIG_X86_MCE_AMD
0173 unregister_trace_deferred_error_apic_exit(trace_intel_irq_exit, "deferred_error");
0174 out_deferred_entry:
0175 unregister_trace_deferred_error_apic_entry(trace_intel_irq_entry, NULL);
0176 out_thermal_exit:
0177 #endif
0178
0179 #ifdef CONFIG_X86_THERMAL_VECTOR
0180 unregister_trace_thermal_apic_exit(trace_intel_irq_exit, "thermal_apic");
0181 out_thermal_entry:
0182 unregister_trace_thermal_apic_entry(trace_intel_irq_entry, NULL);
0183 out_timer_exit:
0184 #endif
0185
0186 unregister_trace_local_timer_exit(trace_intel_irq_exit, "local_timer");
0187 out_timer_entry:
0188 unregister_trace_local_timer_entry(trace_intel_irq_entry, NULL);
0189 out_err:
0190 return -EINVAL;
0191 }
0192
0193 void osnoise_arch_unregister(void)
0194 {
0195 unregister_trace_spurious_apic_exit(trace_intel_irq_exit, "spurious_apic");
0196 unregister_trace_spurious_apic_entry(trace_intel_irq_entry, NULL);
0197 unregister_trace_error_apic_exit(trace_intel_irq_exit, "error_apic");
0198 unregister_trace_error_apic_entry(trace_intel_irq_entry, NULL);
0199 unregister_trace_x86_platform_ipi_exit(trace_intel_irq_exit, "x86_platform_ipi");
0200 unregister_trace_x86_platform_ipi_entry(trace_intel_irq_entry, NULL);
0201
0202 #ifdef CONFIG_IRQ_WORK
0203 unregister_trace_irq_work_exit(trace_intel_irq_exit, "irq_work");
0204 unregister_trace_irq_work_entry(trace_intel_irq_entry, NULL);
0205 #endif
0206
0207 #ifdef CONFIG_SMP
0208 unregister_trace_reschedule_exit(trace_intel_irq_exit, "reschedule");
0209 unregister_trace_reschedule_entry(trace_intel_irq_entry, NULL);
0210 unregister_trace_call_function_exit(trace_intel_irq_exit, "call_function");
0211 unregister_trace_call_function_entry(trace_intel_irq_entry, NULL);
0212 unregister_trace_call_function_single_exit(trace_intel_irq_exit, "call_function_single");
0213 unregister_trace_call_function_single_entry(trace_intel_irq_entry, NULL);
0214 #endif
0215
0216 #ifdef CONFIG_X86_MCE_THRESHOLD
0217 unregister_trace_threshold_apic_exit(trace_intel_irq_exit, "threshold_apic");
0218 unregister_trace_threshold_apic_entry(trace_intel_irq_entry, NULL);
0219 #endif
0220
0221 #ifdef CONFIG_X86_MCE_AMD
0222 unregister_trace_deferred_error_apic_exit(trace_intel_irq_exit, "deferred_error");
0223 unregister_trace_deferred_error_apic_entry(trace_intel_irq_entry, NULL);
0224 #endif
0225
0226 #ifdef CONFIG_X86_THERMAL_VECTOR
0227 unregister_trace_thermal_apic_exit(trace_intel_irq_exit, "thermal_apic");
0228 unregister_trace_thermal_apic_entry(trace_intel_irq_entry, NULL);
0229 #endif
0230
0231 unregister_trace_local_timer_exit(trace_intel_irq_exit, "local_timer");
0232 unregister_trace_local_timer_entry(trace_intel_irq_entry, NULL);
0233 }
0234 #endif