linux/arch/x86/kernel/trace.c
<<
>>
Prefs
   1#include <asm/trace/irq_vectors.h>
   2#include <linux/trace.h>
   3
   4#if defined(CONFIG_OSNOISE_TRACER) && defined(CONFIG_X86_LOCAL_APIC)
   5/*
   6 * trace_intel_irq_entry - record intel specific IRQ entry
   7 */
   8static void trace_intel_irq_entry(void *data, int vector)
   9{
  10        osnoise_trace_irq_entry(vector);
  11}
  12
  13/*
  14 * trace_intel_irq_exit - record intel specific IRQ exit
  15 */
  16static void trace_intel_irq_exit(void *data, int vector)
  17{
  18        char *vector_desc = (char *) data;
  19
  20        osnoise_trace_irq_exit(vector, vector_desc);
  21}
  22
  23/*
  24 * register_intel_irq_tp - Register intel specific IRQ entry tracepoints
  25 */
  26int osnoise_arch_register(void)
  27{
  28        int ret;
  29
  30        ret = register_trace_local_timer_entry(trace_intel_irq_entry, NULL);
  31        if (ret)
  32                goto out_err;
  33
  34        ret = register_trace_local_timer_exit(trace_intel_irq_exit, "local_timer");
  35        if (ret)
  36                goto out_timer_entry;
  37
  38#ifdef CONFIG_X86_THERMAL_VECTOR
  39        ret = register_trace_thermal_apic_entry(trace_intel_irq_entry, NULL);
  40        if (ret)
  41                goto out_timer_exit;
  42
  43        ret = register_trace_thermal_apic_exit(trace_intel_irq_exit, "thermal_apic");
  44        if (ret)
  45                goto out_thermal_entry;
  46#endif /* CONFIG_X86_THERMAL_VECTOR */
  47
  48#ifdef CONFIG_X86_MCE_AMD
  49        ret = register_trace_deferred_error_apic_entry(trace_intel_irq_entry, NULL);
  50        if (ret)
  51                goto out_thermal_exit;
  52
  53        ret = register_trace_deferred_error_apic_exit(trace_intel_irq_exit, "deferred_error");
  54        if (ret)
  55                goto out_deferred_entry;
  56#endif
  57
  58#ifdef CONFIG_X86_MCE_THRESHOLD
  59        ret = register_trace_threshold_apic_entry(trace_intel_irq_entry, NULL);
  60        if (ret)
  61                goto out_deferred_exit;
  62
  63        ret = register_trace_threshold_apic_exit(trace_intel_irq_exit, "threshold_apic");
  64        if (ret)
  65                goto out_threshold_entry;
  66#endif /* CONFIG_X86_MCE_THRESHOLD */
  67
  68#ifdef CONFIG_SMP
  69        ret = register_trace_call_function_single_entry(trace_intel_irq_entry, NULL);
  70        if (ret)
  71                goto out_threshold_exit;
  72
  73        ret = register_trace_call_function_single_exit(trace_intel_irq_exit,
  74                                                       "call_function_single");
  75        if (ret)
  76                goto out_call_function_single_entry;
  77
  78        ret = register_trace_call_function_entry(trace_intel_irq_entry, NULL);
  79        if (ret)
  80                goto out_call_function_single_exit;
  81
  82        ret = register_trace_call_function_exit(trace_intel_irq_exit, "call_function");
  83        if (ret)
  84                goto out_call_function_entry;
  85
  86        ret = register_trace_reschedule_entry(trace_intel_irq_entry, NULL);
  87        if (ret)
  88                goto out_call_function_exit;
  89
  90        ret = register_trace_reschedule_exit(trace_intel_irq_exit, "reschedule");
  91        if (ret)
  92                goto out_reschedule_entry;
  93#endif /* CONFIG_SMP */
  94
  95#ifdef CONFIG_IRQ_WORK
  96        ret = register_trace_irq_work_entry(trace_intel_irq_entry, NULL);
  97        if (ret)
  98                goto out_reschedule_exit;
  99
 100        ret = register_trace_irq_work_exit(trace_intel_irq_exit, "irq_work");
 101        if (ret)
 102                goto out_irq_work_entry;
 103#endif
 104
 105        ret = register_trace_x86_platform_ipi_entry(trace_intel_irq_entry, NULL);
 106        if (ret)
 107                goto out_irq_work_exit;
 108
 109        ret = register_trace_x86_platform_ipi_exit(trace_intel_irq_exit, "x86_platform_ipi");
 110        if (ret)
 111                goto out_x86_ipi_entry;
 112
 113        ret = register_trace_error_apic_entry(trace_intel_irq_entry, NULL);
 114        if (ret)
 115                goto out_x86_ipi_exit;
 116
 117        ret = register_trace_error_apic_exit(trace_intel_irq_exit, "error_apic");
 118        if (ret)
 119                goto out_error_apic_entry;
 120
 121        ret = register_trace_spurious_apic_entry(trace_intel_irq_entry, NULL);
 122        if (ret)
 123                goto out_error_apic_exit;
 124
 125        ret = register_trace_spurious_apic_exit(trace_intel_irq_exit, "spurious_apic");
 126        if (ret)
 127                goto out_spurious_apic_entry;
 128
 129        return 0;
 130
 131out_spurious_apic_entry:
 132        unregister_trace_spurious_apic_entry(trace_intel_irq_entry, NULL);
 133out_error_apic_exit:
 134        unregister_trace_error_apic_exit(trace_intel_irq_exit, "error_apic");
 135out_error_apic_entry:
 136        unregister_trace_error_apic_entry(trace_intel_irq_entry, NULL);
 137out_x86_ipi_exit:
 138        unregister_trace_x86_platform_ipi_exit(trace_intel_irq_exit, "x86_platform_ipi");
 139out_x86_ipi_entry:
 140        unregister_trace_x86_platform_ipi_entry(trace_intel_irq_entry, NULL);
 141out_irq_work_exit:
 142
 143#ifdef CONFIG_IRQ_WORK
 144        unregister_trace_irq_work_exit(trace_intel_irq_exit, "irq_work");
 145out_irq_work_entry:
 146        unregister_trace_irq_work_entry(trace_intel_irq_entry, NULL);
 147out_reschedule_exit:
 148#endif
 149
 150#ifdef CONFIG_SMP
 151        unregister_trace_reschedule_exit(trace_intel_irq_exit, "reschedule");
 152out_reschedule_entry:
 153        unregister_trace_reschedule_entry(trace_intel_irq_entry, NULL);
 154out_call_function_exit:
 155        unregister_trace_call_function_exit(trace_intel_irq_exit, "call_function");
 156out_call_function_entry:
 157        unregister_trace_call_function_entry(trace_intel_irq_entry, NULL);
 158out_call_function_single_exit:
 159        unregister_trace_call_function_single_exit(trace_intel_irq_exit, "call_function_single");
 160out_call_function_single_entry:
 161        unregister_trace_call_function_single_entry(trace_intel_irq_entry, NULL);
 162out_threshold_exit:
 163#endif
 164
 165#ifdef CONFIG_X86_MCE_THRESHOLD
 166        unregister_trace_threshold_apic_exit(trace_intel_irq_exit, "threshold_apic");
 167out_threshold_entry:
 168        unregister_trace_threshold_apic_entry(trace_intel_irq_entry, NULL);
 169out_deferred_exit:
 170#endif
 171
 172#ifdef CONFIG_X86_MCE_AMD
 173        unregister_trace_deferred_error_apic_exit(trace_intel_irq_exit, "deferred_error");
 174out_deferred_entry:
 175        unregister_trace_deferred_error_apic_entry(trace_intel_irq_entry, NULL);
 176out_thermal_exit:
 177#endif /* CONFIG_X86_MCE_AMD */
 178
 179#ifdef CONFIG_X86_THERMAL_VECTOR
 180        unregister_trace_thermal_apic_exit(trace_intel_irq_exit, "thermal_apic");
 181out_thermal_entry:
 182        unregister_trace_thermal_apic_entry(trace_intel_irq_entry, NULL);
 183out_timer_exit:
 184#endif /* CONFIG_X86_THERMAL_VECTOR */
 185
 186        unregister_trace_local_timer_exit(trace_intel_irq_exit, "local_timer");
 187out_timer_entry:
 188        unregister_trace_local_timer_entry(trace_intel_irq_entry, NULL);
 189out_err:
 190        return -EINVAL;
 191}
 192
 193void osnoise_arch_unregister(void)
 194{
 195        unregister_trace_spurious_apic_exit(trace_intel_irq_exit, "spurious_apic");
 196        unregister_trace_spurious_apic_entry(trace_intel_irq_entry, NULL);
 197        unregister_trace_error_apic_exit(trace_intel_irq_exit, "error_apic");
 198        unregister_trace_error_apic_entry(trace_intel_irq_entry, NULL);
 199        unregister_trace_x86_platform_ipi_exit(trace_intel_irq_exit, "x86_platform_ipi");
 200        unregister_trace_x86_platform_ipi_entry(trace_intel_irq_entry, NULL);
 201
 202#ifdef CONFIG_IRQ_WORK
 203        unregister_trace_irq_work_exit(trace_intel_irq_exit, "irq_work");
 204        unregister_trace_irq_work_entry(trace_intel_irq_entry, NULL);
 205#endif
 206
 207#ifdef CONFIG_SMP
 208        unregister_trace_reschedule_exit(trace_intel_irq_exit, "reschedule");
 209        unregister_trace_reschedule_entry(trace_intel_irq_entry, NULL);
 210        unregister_trace_call_function_exit(trace_intel_irq_exit, "call_function");
 211        unregister_trace_call_function_entry(trace_intel_irq_entry, NULL);
 212        unregister_trace_call_function_single_exit(trace_intel_irq_exit, "call_function_single");
 213        unregister_trace_call_function_single_entry(trace_intel_irq_entry, NULL);
 214#endif
 215
 216#ifdef CONFIG_X86_MCE_THRESHOLD
 217        unregister_trace_threshold_apic_exit(trace_intel_irq_exit, "threshold_apic");
 218        unregister_trace_threshold_apic_entry(trace_intel_irq_entry, NULL);
 219#endif
 220
 221#ifdef CONFIG_X86_MCE_AMD
 222        unregister_trace_deferred_error_apic_exit(trace_intel_irq_exit, "deferred_error");
 223        unregister_trace_deferred_error_apic_entry(trace_intel_irq_entry, NULL);
 224#endif
 225
 226#ifdef CONFIG_X86_THERMAL_VECTOR
 227        unregister_trace_thermal_apic_exit(trace_intel_irq_exit, "thermal_apic");
 228        unregister_trace_thermal_apic_entry(trace_intel_irq_entry, NULL);
 229#endif /* CONFIG_X86_THERMAL_VECTOR */
 230
 231        unregister_trace_local_timer_exit(trace_intel_irq_exit, "local_timer");
 232        unregister_trace_local_timer_entry(trace_intel_irq_entry, NULL);
 233}
 234#endif /* CONFIG_OSNOISE_TRAECR && CONFIG_X86_LOCAL_APIC */
 235