Back to home page

OSCL-LXR

 
 

    


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  * trace_intel_irq_entry - record intel specific IRQ entry
0007  */
0008 static void trace_intel_irq_entry(void *data, int vector)
0009 {
0010     osnoise_trace_irq_entry(vector);
0011 }
0012 
0013 /*
0014  * trace_intel_irq_exit - record intel specific IRQ exit
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  * register_intel_irq_tp - Register intel specific IRQ entry tracepoints
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 /* CONFIG_X86_THERMAL_VECTOR */
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 /* CONFIG_X86_MCE_THRESHOLD */
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 /* CONFIG_SMP */
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 /* CONFIG_X86_MCE_AMD */
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 /* CONFIG_X86_THERMAL_VECTOR */
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 /* CONFIG_X86_THERMAL_VECTOR */
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 /* CONFIG_OSNOISE_TRACER && CONFIG_X86_LOCAL_APIC */