perf parse-events: Create two hybrid raw events
[linux-2.6-microblaze.git] / tools / perf / util / parse-events-hybrid.c
index 7a7e065..e27b747 100644 (file)
@@ -77,6 +77,41 @@ static int add_hw_hybrid(struct parse_events_state *parse_state,
        return 0;
 }
 
+static int create_raw_event_hybrid(int *idx, struct list_head *list,
+                                  struct perf_event_attr *attr, char *name,
+                                  struct list_head *config_terms,
+                                  struct perf_pmu *pmu)
+{
+       struct evsel *evsel;
+
+       attr->type = pmu->type;
+       evsel = parse_events__add_event_hybrid(list, idx, attr, name,
+                                              pmu, config_terms);
+       if (evsel)
+               evsel->pmu_name = strdup(pmu->name);
+       else
+               return -ENOMEM;
+
+       return 0;
+}
+
+static int add_raw_hybrid(struct parse_events_state *parse_state,
+                         struct list_head *list, struct perf_event_attr *attr,
+                         char *name, struct list_head *config_terms)
+{
+       struct perf_pmu *pmu;
+       int ret;
+
+       perf_pmu__for_each_hybrid_pmu(pmu) {
+               ret = create_raw_event_hybrid(&parse_state->idx, list, attr,
+                                             name, config_terms, pmu);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
 int parse_events__add_numeric_hybrid(struct parse_events_state *parse_state,
                                     struct list_head *list,
                                     struct perf_event_attr *attr,
@@ -96,7 +131,8 @@ int parse_events__add_numeric_hybrid(struct parse_events_state *parse_state,
                                     config_terms);
        }
 
-       return -1;
+       return add_raw_hybrid(parse_state, list, attr, name,
+                             config_terms);
 }
 
 int parse_events__add_cache_hybrid(struct list_head *list, int *idx,