trace_mmiotrace.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. * Memory mapped I/O tracing
  3. *
  4. * Copyright (C) 2008 Pekka Paalanen <pq@iki.fi>
  5. */
  6. #define DEBUG 1
  7. #include <linux/kernel.h>
  8. #include <linux/mmiotrace.h>
  9. #include "trace.h"
  10. extern void
  11. __trace_special(void *__tr, void *__data,
  12. unsigned long arg1, unsigned long arg2, unsigned long arg3);
  13. static struct trace_array *mmio_trace_array;
  14. static void mmio_trace_init(struct trace_array *tr)
  15. {
  16. pr_debug("in %s\n", __func__);
  17. mmio_trace_array = tr;
  18. if (tr->ctrl)
  19. enable_mmiotrace();
  20. }
  21. static void mmio_trace_reset(struct trace_array *tr)
  22. {
  23. pr_debug("in %s\n", __func__);
  24. if (tr->ctrl)
  25. disable_mmiotrace();
  26. }
  27. static void mmio_trace_ctrl_update(struct trace_array *tr)
  28. {
  29. pr_debug("in %s\n", __func__);
  30. if (tr->ctrl)
  31. enable_mmiotrace();
  32. else
  33. disable_mmiotrace();
  34. }
  35. static struct tracer mmio_tracer __read_mostly =
  36. {
  37. .name = "mmiotrace",
  38. .init = mmio_trace_init,
  39. .reset = mmio_trace_reset,
  40. .ctrl_update = mmio_trace_ctrl_update,
  41. };
  42. __init static int init_mmio_trace(void)
  43. {
  44. int ret = init_mmiotrace();
  45. if (ret)
  46. return ret;
  47. return register_tracer(&mmio_tracer);
  48. }
  49. device_initcall(init_mmio_trace);
  50. void mmio_trace_record(u32 type, unsigned long addr, unsigned long arg)
  51. {
  52. struct trace_array *tr = mmio_trace_array;
  53. struct trace_array_cpu *data = tr->data[smp_processor_id()];
  54. if (!current || current->pid == 0) {
  55. /*
  56. * XXX: This is a problem. We need to able to record, no
  57. * matter what. tracing_generic_entry_update() would crash.
  58. */
  59. static unsigned limit;
  60. if (limit++ < 12)
  61. pr_err("Error in %s: no current.\n", __func__);
  62. return;
  63. }
  64. if (!tr || !data) {
  65. static unsigned limit;
  66. if (limit++ < 12)
  67. pr_err("%s: no tr or data\n", __func__);
  68. return;
  69. }
  70. __trace_special(tr, data, type, addr, arg);
  71. }