forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
7.4 KiB
234 lines
7.4 KiB
#include <asm/trace/irq_vectors.h> |
|
#include <linux/trace.h> |
|
|
|
#if defined(CONFIG_OSNOISE_TRACER) && defined(CONFIG_X86_LOCAL_APIC) |
|
/* |
|
* trace_intel_irq_entry - record intel specific IRQ entry |
|
*/ |
|
static void trace_intel_irq_entry(void *data, int vector) |
|
{ |
|
osnoise_trace_irq_entry(vector); |
|
} |
|
|
|
/* |
|
* trace_intel_irq_exit - record intel specific IRQ exit |
|
*/ |
|
static void trace_intel_irq_exit(void *data, int vector) |
|
{ |
|
char *vector_desc = (char *) data; |
|
|
|
osnoise_trace_irq_exit(vector, vector_desc); |
|
} |
|
|
|
/* |
|
* register_intel_irq_tp - Register intel specific IRQ entry tracepoints |
|
*/ |
|
int osnoise_arch_register(void) |
|
{ |
|
int ret; |
|
|
|
ret = register_trace_local_timer_entry(trace_intel_irq_entry, NULL); |
|
if (ret) |
|
goto out_err; |
|
|
|
ret = register_trace_local_timer_exit(trace_intel_irq_exit, "local_timer"); |
|
if (ret) |
|
goto out_timer_entry; |
|
|
|
#ifdef CONFIG_X86_THERMAL_VECTOR |
|
ret = register_trace_thermal_apic_entry(trace_intel_irq_entry, NULL); |
|
if (ret) |
|
goto out_timer_exit; |
|
|
|
ret = register_trace_thermal_apic_exit(trace_intel_irq_exit, "thermal_apic"); |
|
if (ret) |
|
goto out_thermal_entry; |
|
#endif /* CONFIG_X86_THERMAL_VECTOR */ |
|
|
|
#ifdef CONFIG_X86_MCE_AMD |
|
ret = register_trace_deferred_error_apic_entry(trace_intel_irq_entry, NULL); |
|
if (ret) |
|
goto out_thermal_exit; |
|
|
|
ret = register_trace_deferred_error_apic_exit(trace_intel_irq_exit, "deferred_error"); |
|
if (ret) |
|
goto out_deferred_entry; |
|
#endif |
|
|
|
#ifdef CONFIG_X86_MCE_THRESHOLD |
|
ret = register_trace_threshold_apic_entry(trace_intel_irq_entry, NULL); |
|
if (ret) |
|
goto out_deferred_exit; |
|
|
|
ret = register_trace_threshold_apic_exit(trace_intel_irq_exit, "threshold_apic"); |
|
if (ret) |
|
goto out_threshold_entry; |
|
#endif /* CONFIG_X86_MCE_THRESHOLD */ |
|
|
|
#ifdef CONFIG_SMP |
|
ret = register_trace_call_function_single_entry(trace_intel_irq_entry, NULL); |
|
if (ret) |
|
goto out_threshold_exit; |
|
|
|
ret = register_trace_call_function_single_exit(trace_intel_irq_exit, |
|
"call_function_single"); |
|
if (ret) |
|
goto out_call_function_single_entry; |
|
|
|
ret = register_trace_call_function_entry(trace_intel_irq_entry, NULL); |
|
if (ret) |
|
goto out_call_function_single_exit; |
|
|
|
ret = register_trace_call_function_exit(trace_intel_irq_exit, "call_function"); |
|
if (ret) |
|
goto out_call_function_entry; |
|
|
|
ret = register_trace_reschedule_entry(trace_intel_irq_entry, NULL); |
|
if (ret) |
|
goto out_call_function_exit; |
|
|
|
ret = register_trace_reschedule_exit(trace_intel_irq_exit, "reschedule"); |
|
if (ret) |
|
goto out_reschedule_entry; |
|
#endif /* CONFIG_SMP */ |
|
|
|
#ifdef CONFIG_IRQ_WORK |
|
ret = register_trace_irq_work_entry(trace_intel_irq_entry, NULL); |
|
if (ret) |
|
goto out_reschedule_exit; |
|
|
|
ret = register_trace_irq_work_exit(trace_intel_irq_exit, "irq_work"); |
|
if (ret) |
|
goto out_irq_work_entry; |
|
#endif |
|
|
|
ret = register_trace_x86_platform_ipi_entry(trace_intel_irq_entry, NULL); |
|
if (ret) |
|
goto out_irq_work_exit; |
|
|
|
ret = register_trace_x86_platform_ipi_exit(trace_intel_irq_exit, "x86_platform_ipi"); |
|
if (ret) |
|
goto out_x86_ipi_entry; |
|
|
|
ret = register_trace_error_apic_entry(trace_intel_irq_entry, NULL); |
|
if (ret) |
|
goto out_x86_ipi_exit; |
|
|
|
ret = register_trace_error_apic_exit(trace_intel_irq_exit, "error_apic"); |
|
if (ret) |
|
goto out_error_apic_entry; |
|
|
|
ret = register_trace_spurious_apic_entry(trace_intel_irq_entry, NULL); |
|
if (ret) |
|
goto out_error_apic_exit; |
|
|
|
ret = register_trace_spurious_apic_exit(trace_intel_irq_exit, "spurious_apic"); |
|
if (ret) |
|
goto out_spurious_apic_entry; |
|
|
|
return 0; |
|
|
|
out_spurious_apic_entry: |
|
unregister_trace_spurious_apic_entry(trace_intel_irq_entry, NULL); |
|
out_error_apic_exit: |
|
unregister_trace_error_apic_exit(trace_intel_irq_exit, "error_apic"); |
|
out_error_apic_entry: |
|
unregister_trace_error_apic_entry(trace_intel_irq_entry, NULL); |
|
out_x86_ipi_exit: |
|
unregister_trace_x86_platform_ipi_exit(trace_intel_irq_exit, "x86_platform_ipi"); |
|
out_x86_ipi_entry: |
|
unregister_trace_x86_platform_ipi_entry(trace_intel_irq_entry, NULL); |
|
out_irq_work_exit: |
|
|
|
#ifdef CONFIG_IRQ_WORK |
|
unregister_trace_irq_work_exit(trace_intel_irq_exit, "irq_work"); |
|
out_irq_work_entry: |
|
unregister_trace_irq_work_entry(trace_intel_irq_entry, NULL); |
|
out_reschedule_exit: |
|
#endif |
|
|
|
#ifdef CONFIG_SMP |
|
unregister_trace_reschedule_exit(trace_intel_irq_exit, "reschedule"); |
|
out_reschedule_entry: |
|
unregister_trace_reschedule_entry(trace_intel_irq_entry, NULL); |
|
out_call_function_exit: |
|
unregister_trace_call_function_exit(trace_intel_irq_exit, "call_function"); |
|
out_call_function_entry: |
|
unregister_trace_call_function_entry(trace_intel_irq_entry, NULL); |
|
out_call_function_single_exit: |
|
unregister_trace_call_function_single_exit(trace_intel_irq_exit, "call_function_single"); |
|
out_call_function_single_entry: |
|
unregister_trace_call_function_single_entry(trace_intel_irq_entry, NULL); |
|
out_threshold_exit: |
|
#endif |
|
|
|
#ifdef CONFIG_X86_MCE_THRESHOLD |
|
unregister_trace_threshold_apic_exit(trace_intel_irq_exit, "threshold_apic"); |
|
out_threshold_entry: |
|
unregister_trace_threshold_apic_entry(trace_intel_irq_entry, NULL); |
|
out_deferred_exit: |
|
#endif |
|
|
|
#ifdef CONFIG_X86_MCE_AMD |
|
unregister_trace_deferred_error_apic_exit(trace_intel_irq_exit, "deferred_error"); |
|
out_deferred_entry: |
|
unregister_trace_deferred_error_apic_entry(trace_intel_irq_entry, NULL); |
|
out_thermal_exit: |
|
#endif /* CONFIG_X86_MCE_AMD */ |
|
|
|
#ifdef CONFIG_X86_THERMAL_VECTOR |
|
unregister_trace_thermal_apic_exit(trace_intel_irq_exit, "thermal_apic"); |
|
out_thermal_entry: |
|
unregister_trace_thermal_apic_entry(trace_intel_irq_entry, NULL); |
|
out_timer_exit: |
|
#endif /* CONFIG_X86_THERMAL_VECTOR */ |
|
|
|
unregister_trace_local_timer_exit(trace_intel_irq_exit, "local_timer"); |
|
out_timer_entry: |
|
unregister_trace_local_timer_entry(trace_intel_irq_entry, NULL); |
|
out_err: |
|
return -EINVAL; |
|
} |
|
|
|
void osnoise_arch_unregister(void) |
|
{ |
|
unregister_trace_spurious_apic_exit(trace_intel_irq_exit, "spurious_apic"); |
|
unregister_trace_spurious_apic_entry(trace_intel_irq_entry, NULL); |
|
unregister_trace_error_apic_exit(trace_intel_irq_exit, "error_apic"); |
|
unregister_trace_error_apic_entry(trace_intel_irq_entry, NULL); |
|
unregister_trace_x86_platform_ipi_exit(trace_intel_irq_exit, "x86_platform_ipi"); |
|
unregister_trace_x86_platform_ipi_entry(trace_intel_irq_entry, NULL); |
|
|
|
#ifdef CONFIG_IRQ_WORK |
|
unregister_trace_irq_work_exit(trace_intel_irq_exit, "irq_work"); |
|
unregister_trace_irq_work_entry(trace_intel_irq_entry, NULL); |
|
#endif |
|
|
|
#ifdef CONFIG_SMP |
|
unregister_trace_reschedule_exit(trace_intel_irq_exit, "reschedule"); |
|
unregister_trace_reschedule_entry(trace_intel_irq_entry, NULL); |
|
unregister_trace_call_function_exit(trace_intel_irq_exit, "call_function"); |
|
unregister_trace_call_function_entry(trace_intel_irq_entry, NULL); |
|
unregister_trace_call_function_single_exit(trace_intel_irq_exit, "call_function_single"); |
|
unregister_trace_call_function_single_entry(trace_intel_irq_entry, NULL); |
|
#endif |
|
|
|
#ifdef CONFIG_X86_MCE_THRESHOLD |
|
unregister_trace_threshold_apic_exit(trace_intel_irq_exit, "threshold_apic"); |
|
unregister_trace_threshold_apic_entry(trace_intel_irq_entry, NULL); |
|
#endif |
|
|
|
#ifdef CONFIG_X86_MCE_AMD |
|
unregister_trace_deferred_error_apic_exit(trace_intel_irq_exit, "deferred_error"); |
|
unregister_trace_deferred_error_apic_entry(trace_intel_irq_entry, NULL); |
|
#endif |
|
|
|
#ifdef CONFIG_X86_THERMAL_VECTOR |
|
unregister_trace_thermal_apic_exit(trace_intel_irq_exit, "thermal_apic"); |
|
unregister_trace_thermal_apic_entry(trace_intel_irq_entry, NULL); |
|
#endif /* CONFIG_X86_THERMAL_VECTOR */ |
|
|
|
unregister_trace_local_timer_exit(trace_intel_irq_exit, "local_timer"); |
|
unregister_trace_local_timer_entry(trace_intel_irq_entry, NULL); |
|
} |
|
#endif /* CONFIG_OSNOISE_TRAECR && CONFIG_X86_LOCAL_APIC */
|
|
|