perf list: List kernel supplied event aliases
[pandora-kernel.git] / tools / perf / util / pmu.c
index 1d1862d..bc9d806 100644 (file)
@@ -564,3 +564,76 @@ void perf_pmu__set_format(unsigned long *bits, long from, long to)
        for (b = from; b <= to; b++)
                set_bit(b, bits);
 }
+
+static char *format_alias(char *buf, int len, struct perf_pmu *pmu,
+                         struct perf_pmu_alias *alias)
+{
+       snprintf(buf, len, "%s/%s/", pmu->name, alias->name);
+       return buf;
+}
+
+static char *format_alias_or(char *buf, int len, struct perf_pmu *pmu,
+                            struct perf_pmu_alias *alias)
+{
+       snprintf(buf, len, "%s OR %s/%s/", alias->name, pmu->name, alias->name);
+       return buf;
+}
+
+static int cmp_string(const void *a, const void *b)
+{
+       const char * const *as = a;
+       const char * const *bs = b;
+       return strcmp(*as, *bs);
+}
+
+void print_pmu_events(const char *event_glob, bool name_only)
+{
+       struct perf_pmu *pmu;
+       struct perf_pmu_alias *alias;
+       char buf[1024];
+       int printed = 0;
+       int len, j;
+       char **aliases;
+
+       pmu = NULL;
+       len = 0;
+       while ((pmu = perf_pmu__scan(pmu)) != NULL)
+               list_for_each_entry(alias, &pmu->aliases, list)
+                       len++;
+       aliases = malloc(sizeof(char *) * len);
+       if (!aliases)
+               return;
+       pmu = NULL;
+       j = 0;
+       while ((pmu = perf_pmu__scan(pmu)) != NULL)
+               list_for_each_entry(alias, &pmu->aliases, list) {
+                       char *name = format_alias(buf, sizeof(buf), pmu, alias);
+                       bool is_cpu = !strcmp(pmu->name, "cpu");
+
+                       if (event_glob != NULL &&
+                           !(strglobmatch(name, event_glob) ||
+                             (!is_cpu && strglobmatch(alias->name,
+                                                      event_glob))))
+                               continue;
+                       aliases[j] = name;
+                       if (is_cpu && !name_only)
+                               aliases[j] = format_alias_or(buf, sizeof(buf),
+                                                             pmu, alias);
+                       aliases[j] = strdup(aliases[j]);
+                       j++;
+               }
+       len = j;
+       qsort(aliases, len, sizeof(char *), cmp_string);
+       for (j = 0; j < len; j++) {
+               if (name_only) {
+                       printf("%s ", aliases[j]);
+                       continue;
+               }
+               printf("  %-50s [Kernel PMU event]\n", aliases[j]);
+               free(aliases[j]);
+               printed++;
+       }
+       if (printed)
+               printf("\n");
+       free(aliases);
+}