parse-events.c (411ad22ecf0281d666a82aa7f4de90c70365da7d) parse-events.c (5ea8f2ccffb23983f02012a2731464586b10fbf3)
1// SPDX-License-Identifier: GPL-2.0
2#include <linux/hw_breakpoint.h>
3#include <linux/err.h>
4#include <linux/list_sort.h>
5#include <linux/zalloc.h>
6#include <dirent.h>
7#include <errno.h>
8#include <sys/ioctl.h>

--- 1038 unchanged lines hidden (view full) ---

1047 [PARSE_EVENTS__TERM_TYPE_NOOVERWRITE] = "no-overwrite",
1048 [PARSE_EVENTS__TERM_TYPE_DRV_CFG] = "driver-config",
1049 [PARSE_EVENTS__TERM_TYPE_PERCORE] = "percore",
1050 [PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT] = "aux-output",
1051 [PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE] = "aux-sample-size",
1052 [PARSE_EVENTS__TERM_TYPE_METRIC_ID] = "metric-id",
1053 [PARSE_EVENTS__TERM_TYPE_RAW] = "raw",
1054 [PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE] = "legacy-cache",
1// SPDX-License-Identifier: GPL-2.0
2#include <linux/hw_breakpoint.h>
3#include <linux/err.h>
4#include <linux/list_sort.h>
5#include <linux/zalloc.h>
6#include <dirent.h>
7#include <errno.h>
8#include <sys/ioctl.h>

--- 1038 unchanged lines hidden (view full) ---

1047 [PARSE_EVENTS__TERM_TYPE_NOOVERWRITE] = "no-overwrite",
1048 [PARSE_EVENTS__TERM_TYPE_DRV_CFG] = "driver-config",
1049 [PARSE_EVENTS__TERM_TYPE_PERCORE] = "percore",
1050 [PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT] = "aux-output",
1051 [PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE] = "aux-sample-size",
1052 [PARSE_EVENTS__TERM_TYPE_METRIC_ID] = "metric-id",
1053 [PARSE_EVENTS__TERM_TYPE_RAW] = "raw",
1054 [PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE] = "legacy-cache",
1055 [PARSE_EVENTS__TERM_TYPE_HARDWARE] = "hardware",
1055};
1056
1057static bool config_term_shrinked;
1058
1059static bool
1060config_term_avail(int term_type, struct parse_events_error *err)
1061{
1062 char *err_str;

--- 171 unchanged lines hidden (view full) ---

1234
1235 if (perf_pmu__supports_legacy_cache(pmu)) {
1236 attr->type = PERF_TYPE_HW_CACHE;
1237 return parse_events__decode_legacy_cache(term->config, pmu->type,
1238 &attr->config);
1239 } else
1240 term->type_term = PARSE_EVENTS__TERM_TYPE_USER;
1241 }
1056};
1057
1058static bool config_term_shrinked;
1059
1060static bool
1061config_term_avail(int term_type, struct parse_events_error *err)
1062{
1063 char *err_str;

--- 171 unchanged lines hidden (view full) ---

1235
1236 if (perf_pmu__supports_legacy_cache(pmu)) {
1237 attr->type = PERF_TYPE_HW_CACHE;
1238 return parse_events__decode_legacy_cache(term->config, pmu->type,
1239 &attr->config);
1240 } else
1241 term->type_term = PARSE_EVENTS__TERM_TYPE_USER;
1242 }
1243 if (term->type_term == PARSE_EVENTS__TERM_TYPE_HARDWARE) {
1244 const struct perf_pmu *pmu = perf_pmu__find_by_type(attr->type);
1245
1246 if (!pmu) {
1247 pr_debug("Failed to find PMU for type %d", attr->type);
1248 return -EINVAL;
1249 }
1250 attr->type = PERF_TYPE_HARDWARE;
1251 attr->config = ((__u64)pmu->type << PERF_PMU_TYPE_SHIFT) | term->val.num;
1252 return 0;
1253 }
1242 if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER ||
1243 term->type_term == PARSE_EVENTS__TERM_TYPE_DRV_CFG) {
1244 /*
1245 * Always succeed for sysfs terms, as we dont know
1246 * at this point what type they need to have.
1247 */
1248 return 0;
1249 }

--- 1314 unchanged lines hidden (view full) ---

2564 .config = config,
2565 .err_term = loc_term ? loc_term->first_column : 0,
2566 .err_val = loc_val ? loc_val->first_column : 0,
2567 };
2568
2569 return new_term(term, &temp, str, 0);
2570}
2571
1254 if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER ||
1255 term->type_term == PARSE_EVENTS__TERM_TYPE_DRV_CFG) {
1256 /*
1257 * Always succeed for sysfs terms, as we dont know
1258 * at this point what type they need to have.
1259 */
1260 return 0;
1261 }

--- 1314 unchanged lines hidden (view full) ---

2576 .config = config,
2577 .err_term = loc_term ? loc_term->first_column : 0,
2578 .err_val = loc_val ? loc_val->first_column : 0,
2579 };
2580
2581 return new_term(term, &temp, str, 0);
2582}
2583
2572int parse_events_term__sym_hw(struct parse_events_term **term,
2573 char *config, unsigned idx)
2574{
2575 struct event_symbol *sym;
2576 char *str;
2577 struct parse_events_term temp = {
2578 .type_val = PARSE_EVENTS__TERM_TYPE_STR,
2579 .type_term = PARSE_EVENTS__TERM_TYPE_USER,
2580 .config = config,
2581 };
2582
2583 if (!temp.config) {
2584 temp.config = strdup("event");
2585 if (!temp.config)
2586 return -ENOMEM;
2587 }
2588 BUG_ON(idx >= PERF_COUNT_HW_MAX);
2589 sym = &event_symbols_hw[idx];
2590
2591 str = strdup(sym->symbol);
2592 if (!str)
2593 return -ENOMEM;
2594 return new_term(term, &temp, str, 0);
2595}
2596
2597int parse_events_term__clone(struct parse_events_term **new,
2598 struct parse_events_term *term)
2599{
2600 char *str;
2601 struct parse_events_term temp = {
2602 .type_val = term->type_val,
2603 .type_term = term->type_term,
2604 .config = NULL,

--- 140 unchanged lines hidden ---
2584int parse_events_term__clone(struct parse_events_term **new,
2585 struct parse_events_term *term)
2586{
2587 char *str;
2588 struct parse_events_term temp = {
2589 .type_val = term->type_val,
2590 .type_term = term->type_term,
2591 .config = NULL,

--- 140 unchanged lines hidden ---