| #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_TRACER && CONFIG_X86_LOCAL_APIC */ |