|
@@ -241,9 +241,11 @@ static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name,
|
|
|
char *metric_expr,
|
|
|
char *metric_name)
|
|
|
{
|
|
|
+ struct parse_events_term *term;
|
|
|
struct perf_pmu_alias *alias;
|
|
|
int ret;
|
|
|
int num;
|
|
|
+ char newval[256];
|
|
|
|
|
|
alias = malloc(sizeof(*alias));
|
|
|
if (!alias)
|
|
@@ -262,6 +264,27 @@ static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+ /* Scan event and remove leading zeroes, spaces, newlines, some
|
|
|
+ * platforms have terms specified as
|
|
|
+ * event=0x0091 (read from files ../<PMU>/events/<FILE>
|
|
|
+ * and terms specified as event=0x91 (read from JSON files).
|
|
|
+ *
|
|
|
+ * Rebuild string to make alias->str member comparable.
|
|
|
+ */
|
|
|
+ memset(newval, 0, sizeof(newval));
|
|
|
+ ret = 0;
|
|
|
+ list_for_each_entry(term, &alias->terms, list) {
|
|
|
+ if (ret)
|
|
|
+ ret += scnprintf(newval + ret, sizeof(newval) - ret,
|
|
|
+ ",");
|
|
|
+ if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
|
|
|
+ ret += scnprintf(newval + ret, sizeof(newval) - ret,
|
|
|
+ "%s=%#x", term->config, term->val.num);
|
|
|
+ else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR)
|
|
|
+ ret += scnprintf(newval + ret, sizeof(newval) - ret,
|
|
|
+ "%s=%s", term->config, term->val.str);
|
|
|
+ }
|
|
|
+
|
|
|
alias->name = strdup(name);
|
|
|
if (dir) {
|
|
|
/*
|
|
@@ -285,7 +308,7 @@ static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name,
|
|
|
snprintf(alias->unit, sizeof(alias->unit), "%s", unit);
|
|
|
}
|
|
|
alias->per_pkg = perpkg && sscanf(perpkg, "%d", &num) == 1 && num == 1;
|
|
|
- alias->str = strdup(val);
|
|
|
+ alias->str = strdup(newval);
|
|
|
|
|
|
list_add_tail(&alias->list, list);
|
|
|
|