| #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 */ |