return 0;
}
-/*
- * Add EVSEL__CONFIG_TERM_CFG_CHG where cfg_chg will have a bit set for
- * each bit of attr->config that the user has changed.
- */
-static int get_config_chgs(struct perf_pmu *pmu, struct parse_events_terms *head_config,
- struct list_head *head_terms)
+static int add_cfg_chg(const struct perf_pmu *pmu,
+ const struct parse_events_terms *head_config,
+ struct list_head *head_terms,
+ int format_type,
+ enum parse_events__term_type term_type,
+ enum evsel_term_type new_term_type)
{
struct parse_events_term *term;
u64 bits = 0;
int type;
list_for_each_entry(term, &head_config->terms, list) {
- switch (term->type_term) {
- case PARSE_EVENTS__TERM_TYPE_USER:
+ if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER) {
type = perf_pmu__format_type(pmu, term->config);
- if (type != PERF_PMU_FORMAT_VALUE_CONFIG)
+ if (type != format_type)
continue;
bits |= perf_pmu__format_bits(pmu, term->config);
- break;
- case PARSE_EVENTS__TERM_TYPE_CONFIG:
+ } else if (term->type_term == term_type) {
bits = ~(u64)0;
- break;
- case PARSE_EVENTS__TERM_TYPE_CONFIG1:
- case PARSE_EVENTS__TERM_TYPE_CONFIG2:
- case PARSE_EVENTS__TERM_TYPE_CONFIG3:
- case PARSE_EVENTS__TERM_TYPE_CONFIG4:
- case PARSE_EVENTS__TERM_TYPE_LEGACY_HARDWARE_CONFIG:
- case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE_CONFIG:
- case PARSE_EVENTS__TERM_TYPE_NAME:
- case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
- case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ:
- case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
- case PARSE_EVENTS__TERM_TYPE_TIME:
- case PARSE_EVENTS__TERM_TYPE_CALLGRAPH:
- case PARSE_EVENTS__TERM_TYPE_STACKSIZE:
- case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
- case PARSE_EVENTS__TERM_TYPE_INHERIT:
- case PARSE_EVENTS__TERM_TYPE_MAX_STACK:
- case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS:
- case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE:
- case PARSE_EVENTS__TERM_TYPE_OVERWRITE:
- case PARSE_EVENTS__TERM_TYPE_DRV_CFG:
- case PARSE_EVENTS__TERM_TYPE_PERCORE:
- case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT:
- case PARSE_EVENTS__TERM_TYPE_AUX_ACTION:
- case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE:
- case PARSE_EVENTS__TERM_TYPE_METRIC_ID:
- case PARSE_EVENTS__TERM_TYPE_RAW:
- case PARSE_EVENTS__TERM_TYPE_CPU:
- case PARSE_EVENTS__TERM_TYPE_RATIO_TO_PREV:
- default:
- break;
}
}
if (bits) {
struct evsel_config_term *new_term;
- new_term = add_config_term(EVSEL__CONFIG_TERM_CFG_CHG,
- head_terms, false);
+ new_term = add_config_term(new_term_type, head_terms, false);
if (!new_term)
return -ENOMEM;
new_term->val.cfg_chg = bits;
return 0;
}
+/*
+ * Add EVSEL__CONFIG_TERM_USR_CFG_CONFIGn where cfg_chg will have a bit set for
+ * each bit of attr->configN that the user has changed.
+ */
+static int get_config_chgs(const struct perf_pmu *pmu,
+ const struct parse_events_terms *head_config,
+ struct list_head *head_terms)
+{
+ int ret;
+
+ ret = add_cfg_chg(pmu, head_config, head_terms,
+ PERF_PMU_FORMAT_VALUE_CONFIG,
+ PARSE_EVENTS__TERM_TYPE_CONFIG,
+ EVSEL__CONFIG_TERM_USR_CHG_CONFIG);
+ if (ret)
+ return ret;
+
+ ret = add_cfg_chg(pmu, head_config, head_terms,
+ PERF_PMU_FORMAT_VALUE_CONFIG1,
+ PARSE_EVENTS__TERM_TYPE_CONFIG1,
+ EVSEL__CONFIG_TERM_USR_CHG_CONFIG1);
+ if (ret)
+ return ret;
+
+ ret = add_cfg_chg(pmu, head_config, head_terms,
+ PERF_PMU_FORMAT_VALUE_CONFIG2,
+ PARSE_EVENTS__TERM_TYPE_CONFIG2,
+ EVSEL__CONFIG_TERM_USR_CHG_CONFIG2);
+ if (ret)
+ return ret;
+
+ ret = add_cfg_chg(pmu, head_config, head_terms,
+ PERF_PMU_FORMAT_VALUE_CONFIG3,
+ PARSE_EVENTS__TERM_TYPE_CONFIG3,
+ EVSEL__CONFIG_TERM_USR_CHG_CONFIG3);
+ if (ret)
+ return ret;
+
+ return add_cfg_chg(pmu, head_config, head_terms,
+ PERF_PMU_FORMAT_VALUE_CONFIG4,
+ PARSE_EVENTS__TERM_TYPE_CONFIG4,
+ EVSEL__CONFIG_TERM_USR_CHG_CONFIG4);
+}
+
int parse_events_add_tracepoint(struct parse_events_state *parse_state,
struct list_head *list,
const char *sys, const char *event,