parse-events.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include "../perf.h"
  2. #include "util.h"
  3. #include "parse-options.h"
  4. #include "parse-events.h"
  5. #include "exec_cmd.h"
  6. int nr_counters;
  7. __u64 event_id[MAX_COUNTERS] = { };
  8. struct event_symbol {
  9. __u64 event;
  10. char *symbol;
  11. };
  12. static struct event_symbol event_symbols[] = {
  13. {EID(PERF_TYPE_HARDWARE, PERF_COUNT_CPU_CYCLES), "cpu-cycles", },
  14. {EID(PERF_TYPE_HARDWARE, PERF_COUNT_CPU_CYCLES), "cycles", },
  15. {EID(PERF_TYPE_HARDWARE, PERF_COUNT_INSTRUCTIONS), "instructions", },
  16. {EID(PERF_TYPE_HARDWARE, PERF_COUNT_CACHE_REFERENCES), "cache-references", },
  17. {EID(PERF_TYPE_HARDWARE, PERF_COUNT_CACHE_MISSES), "cache-misses", },
  18. {EID(PERF_TYPE_HARDWARE, PERF_COUNT_BRANCH_INSTRUCTIONS), "branch-instructions", },
  19. {EID(PERF_TYPE_HARDWARE, PERF_COUNT_BRANCH_INSTRUCTIONS), "branches", },
  20. {EID(PERF_TYPE_HARDWARE, PERF_COUNT_BRANCH_MISSES), "branch-misses", },
  21. {EID(PERF_TYPE_HARDWARE, PERF_COUNT_BUS_CYCLES), "bus-cycles", },
  22. {EID(PERF_TYPE_SOFTWARE, PERF_COUNT_CPU_CLOCK), "cpu-clock", },
  23. {EID(PERF_TYPE_SOFTWARE, PERF_COUNT_TASK_CLOCK), "task-clock", },
  24. {EID(PERF_TYPE_SOFTWARE, PERF_COUNT_PAGE_FAULTS), "page-faults", },
  25. {EID(PERF_TYPE_SOFTWARE, PERF_COUNT_PAGE_FAULTS), "faults", },
  26. {EID(PERF_TYPE_SOFTWARE, PERF_COUNT_PAGE_FAULTS_MIN), "minor-faults", },
  27. {EID(PERF_TYPE_SOFTWARE, PERF_COUNT_PAGE_FAULTS_MAJ), "major-faults", },
  28. {EID(PERF_TYPE_SOFTWARE, PERF_COUNT_CONTEXT_SWITCHES), "context-switches", },
  29. {EID(PERF_TYPE_SOFTWARE, PERF_COUNT_CONTEXT_SWITCHES), "cs", },
  30. {EID(PERF_TYPE_SOFTWARE, PERF_COUNT_CPU_MIGRATIONS), "cpu-migrations", },
  31. {EID(PERF_TYPE_SOFTWARE, PERF_COUNT_CPU_MIGRATIONS), "migrations", },
  32. };
  33. /*
  34. * Each event can have multiple symbolic names.
  35. * Symbolic names are (almost) exactly matched.
  36. */
  37. static __u64 match_event_symbols(const char *str)
  38. {
  39. __u64 config, id;
  40. int type;
  41. unsigned int i;
  42. if (sscanf(str, "r%llx", &config) == 1)
  43. return config | PERF_COUNTER_RAW_MASK;
  44. if (sscanf(str, "%d:%llu", &type, &id) == 2)
  45. return EID(type, id);
  46. for (i = 0; i < ARRAY_SIZE(event_symbols); i++) {
  47. if (!strncmp(str, event_symbols[i].symbol,
  48. strlen(event_symbols[i].symbol)))
  49. return event_symbols[i].event;
  50. }
  51. return ~0ULL;
  52. }
  53. int parse_events(const struct option *opt, const char *str, int unset)
  54. {
  55. __u64 config;
  56. again:
  57. if (nr_counters == MAX_COUNTERS)
  58. return -1;
  59. config = match_event_symbols(str);
  60. if (config == ~0ULL)
  61. return -1;
  62. event_id[nr_counters] = config;
  63. nr_counters++;
  64. str = strstr(str, ",");
  65. if (str) {
  66. str++;
  67. goto again;
  68. }
  69. return 0;
  70. }
  71. #define __PERF_COUNTER_FIELD(config, name) \
  72. ((config & PERF_COUNTER_##name##_MASK) >> PERF_COUNTER_##name##_SHIFT)
  73. #define PERF_COUNTER_RAW(config) __PERF_COUNTER_FIELD(config, RAW)
  74. #define PERF_COUNTER_CONFIG(config) __PERF_COUNTER_FIELD(config, CONFIG)
  75. #define PERF_COUNTER_TYPE(config) __PERF_COUNTER_FIELD(config, TYPE)
  76. #define PERF_COUNTER_ID(config) __PERF_COUNTER_FIELD(config, EVENT)
  77. /*
  78. * Create the help text for the event symbols:
  79. */
  80. void create_events_help(char *events_help_msg)
  81. {
  82. unsigned int i;
  83. char *str;
  84. __u64 e;
  85. str = events_help_msg;
  86. str += sprintf(str,
  87. "event name: [");
  88. for (i = 0; i < ARRAY_SIZE(event_symbols); i++) {
  89. int type, id;
  90. e = event_symbols[i].event;
  91. type = PERF_COUNTER_TYPE(e);
  92. id = PERF_COUNTER_ID(e);
  93. if (i)
  94. str += sprintf(str, "|");
  95. str += sprintf(str, "%s",
  96. event_symbols[i].symbol);
  97. }
  98. str += sprintf(str, "|rNNN]");
  99. }