struct perf_pmu_alias *alias;
        int len = 0;
 
-       pmu = perf_pmu__find("cpu");
-       if ((pmu == NULL) || list_empty(&pmu->aliases)) {
+       pmu = NULL;
+       while ((pmu = perf_pmu__scan(pmu)) != NULL) {
+               list_for_each_entry(alias, &pmu->aliases, list) {
+                       if (strchr(alias->name, '-'))
+                               len++;
+                       len++;
+               }
+       }
+
+       if (len == 0) {
                perf_pmu_events_list_num = -1;
                return;
        }
-       list_for_each_entry(alias, &pmu->aliases, list) {
-               if (strchr(alias->name, '-'))
-                       len++;
-               len++;
-       }
        perf_pmu_events_list = malloc(sizeof(struct perf_pmu_event_symbol) * len);
        if (!perf_pmu_events_list)
                return;
        perf_pmu_events_list_num = len;
 
        len = 0;
-       list_for_each_entry(alias, &pmu->aliases, list) {
-               struct perf_pmu_event_symbol *p = perf_pmu_events_list + len;
-               char *tmp = strchr(alias->name, '-');
-
-               if (tmp != NULL) {
-                       SET_SYMBOL(strndup(alias->name, tmp - alias->name),
-                                       PMU_EVENT_SYMBOL_PREFIX);
-                       p++;
-                       SET_SYMBOL(strdup(++tmp), PMU_EVENT_SYMBOL_SUFFIX);
-                       len += 2;
-               } else {
-                       SET_SYMBOL(strdup(alias->name), PMU_EVENT_SYMBOL);
-                       len++;
+       pmu = NULL;
+       while ((pmu = perf_pmu__scan(pmu)) != NULL) {
+               list_for_each_entry(alias, &pmu->aliases, list) {
+                       struct perf_pmu_event_symbol *p = perf_pmu_events_list + len;
+                       char *tmp = strchr(alias->name, '-');
+
+                       if (tmp != NULL) {
+                               SET_SYMBOL(strndup(alias->name, tmp - alias->name),
+                                               PMU_EVENT_SYMBOL_PREFIX);
+                               p++;
+                               SET_SYMBOL(strdup(++tmp), PMU_EVENT_SYMBOL_SUFFIX);
+                               len += 2;
+                       } else {
+                               SET_SYMBOL(strdup(alias->name), PMU_EVENT_SYMBOL);
+                               len++;
+                       }
                }
        }
        qsort(perf_pmu_events_list, len,
 
 #include <linux/list.h>
 #include <linux/types.h>
 #include "util.h"
+#include "pmu.h"
 #include "parse-events.h"
 #include "parse-events-bison.h"
 
        struct list_head *head;
        struct parse_events_term *term;
        struct list_head *list;
+       struct perf_pmu *pmu = NULL;
+       int ok = 0;
 
-       ALLOC_LIST(head);
-       ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
-                                       $1, 1, &@1, NULL));
-       list_add_tail(&term->list, head);
-
+       /* Add it for all PMUs that support the alias */
        ALLOC_LIST(list);
-       ABORT_ON(parse_events_add_pmu(data, list, "cpu", head));
-       parse_events_terms__delete(head);
+       while ((pmu = perf_pmu__scan(pmu)) != NULL) {
+               struct perf_pmu_alias *alias;
+
+               list_for_each_entry(alias, &pmu->aliases, list) {
+                       if (!strcasecmp(alias->name, $1)) {
+                               ALLOC_LIST(head);
+                               ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
+                                       $1, 1, &@1, NULL));
+                               list_add_tail(&term->list, head);
+
+                               if (!parse_events_add_pmu(data, list,
+                                                 pmu->name, head)) {
+                                       ok++;
+                               }
+
+                               parse_events_terms__delete(head);
+                       }
+               }
+       }
+       if (!ok)
+               YYABORT;
        $$ = list;
 }
 |