xref: /kernel/linux/linux-5.10/tools/perf/util/pmu.c (revision 8c2ecf20)
1// SPDX-License-Identifier: GPL-2.0
2#include <linux/list.h>
3#include <linux/compiler.h>
4#include <linux/string.h>
5#include <linux/zalloc.h>
6#include <subcmd/pager.h>
7#include <sys/types.h>
8#include <errno.h>
9#include <fcntl.h>
10#include <sys/stat.h>
11#include <unistd.h>
12#include <stdio.h>
13#include <stdbool.h>
14#include <stdarg.h>
15#include <dirent.h>
16#include <api/fs/fs.h>
17#include <locale.h>
18#include <regex.h>
19#include <perf/cpumap.h>
20#include "debug.h"
21#include "evsel.h"
22#include "pmu.h"
23#include "parse-events.h"
24#include "header.h"
25#include "string2.h"
26#include "strbuf.h"
27#include "fncache.h"
28
29struct perf_pmu perf_pmu__fake;
30
31struct perf_pmu_format {
32	char *name;
33	int value;
34	DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS);
35	struct list_head list;
36};
37
38int perf_pmu_parse(struct list_head *list, char *name);
39extern FILE *perf_pmu_in;
40
41static LIST_HEAD(pmus);
42
43/*
44 * Parse & process all the sysfs attributes located under
45 * the directory specified in 'dir' parameter.
46 */
47int perf_pmu__format_parse(char *dir, struct list_head *head)
48{
49	struct dirent *evt_ent;
50	DIR *format_dir;
51	int ret = 0;
52
53	format_dir = opendir(dir);
54	if (!format_dir)
55		return -EINVAL;
56
57	while (!ret && (evt_ent = readdir(format_dir))) {
58		char path[PATH_MAX];
59		char *name = evt_ent->d_name;
60		FILE *file;
61
62		if (!strcmp(name, ".") || !strcmp(name, ".."))
63			continue;
64
65		snprintf(path, PATH_MAX, "%s/%s", dir, name);
66
67		ret = -EINVAL;
68		file = fopen(path, "r");
69		if (!file)
70			break;
71
72		perf_pmu_in = file;
73		ret = perf_pmu_parse(head, name);
74		fclose(file);
75	}
76
77	closedir(format_dir);
78	return ret;
79}
80
81/*
82 * Reading/parsing the default pmu format definition, which should be
83 * located at:
84 * /sys/bus/event_source/devices/<dev>/format as sysfs group attributes.
85 */
86static int pmu_format(const char *name, struct list_head *format)
87{
88	char path[PATH_MAX];
89	const char *sysfs = sysfs__mountpoint();
90
91	if (!sysfs)
92		return -1;
93
94	snprintf(path, PATH_MAX,
95		 "%s" EVENT_SOURCE_DEVICE_PATH "%s/format", sysfs, name);
96
97	if (!file_available(path))
98		return 0;
99
100	if (perf_pmu__format_parse(path, format))
101		return -1;
102
103	return 0;
104}
105
106int perf_pmu__convert_scale(const char *scale, char **end, double *sval)
107{
108	char *lc;
109	int ret = 0;
110
111	/*
112	 * save current locale
113	 */
114	lc = setlocale(LC_NUMERIC, NULL);
115
116	/*
117	 * The lc string may be allocated in static storage,
118	 * so get a dynamic copy to make it survive setlocale
119	 * call below.
120	 */
121	lc = strdup(lc);
122	if (!lc) {
123		ret = -ENOMEM;
124		goto out;
125	}
126
127	/*
128	 * force to C locale to ensure kernel
129	 * scale string is converted correctly.
130	 * kernel uses default C locale.
131	 */
132	setlocale(LC_NUMERIC, "C");
133
134	*sval = strtod(scale, end);
135
136out:
137	/* restore locale */
138	setlocale(LC_NUMERIC, lc);
139	free(lc);
140	return ret;
141}
142
143static int perf_pmu__parse_scale(struct perf_pmu_alias *alias, char *dir, char *name)
144{
145	struct stat st;
146	ssize_t sret;
147	char scale[128];
148	int fd, ret = -1;
149	char path[PATH_MAX];
150
151	scnprintf(path, PATH_MAX, "%s/%s.scale", dir, name);
152
153	fd = open(path, O_RDONLY);
154	if (fd == -1)
155		return -1;
156
157	if (fstat(fd, &st) < 0)
158		goto error;
159
160	sret = read(fd, scale, sizeof(scale)-1);
161	if (sret < 0)
162		goto error;
163
164	if (scale[sret - 1] == '\n')
165		scale[sret - 1] = '\0';
166	else
167		scale[sret] = '\0';
168
169	ret = perf_pmu__convert_scale(scale, NULL, &alias->scale);
170error:
171	close(fd);
172	return ret;
173}
174
175static int perf_pmu__parse_unit(struct perf_pmu_alias *alias, char *dir, char *name)
176{
177	char path[PATH_MAX];
178	ssize_t sret;
179	int fd;
180
181	scnprintf(path, PATH_MAX, "%s/%s.unit", dir, name);
182
183	fd = open(path, O_RDONLY);
184	if (fd == -1)
185		return -1;
186
187	sret = read(fd, alias->unit, UNIT_MAX_LEN);
188	if (sret < 0)
189		goto error;
190
191	close(fd);
192
193	if (alias->unit[sret - 1] == '\n')
194		alias->unit[sret - 1] = '\0';
195	else
196		alias->unit[sret] = '\0';
197
198	return 0;
199error:
200	close(fd);
201	alias->unit[0] = '\0';
202	return -1;
203}
204
205static int
206perf_pmu__parse_per_pkg(struct perf_pmu_alias *alias, char *dir, char *name)
207{
208	char path[PATH_MAX];
209	int fd;
210
211	scnprintf(path, PATH_MAX, "%s/%s.per-pkg", dir, name);
212
213	fd = open(path, O_RDONLY);
214	if (fd == -1)
215		return -1;
216
217	close(fd);
218
219	alias->per_pkg = true;
220	return 0;
221}
222
223static int perf_pmu__parse_snapshot(struct perf_pmu_alias *alias,
224				    char *dir, char *name)
225{
226	char path[PATH_MAX];
227	int fd;
228
229	scnprintf(path, PATH_MAX, "%s/%s.snapshot", dir, name);
230
231	fd = open(path, O_RDONLY);
232	if (fd == -1)
233		return -1;
234
235	alias->snapshot = true;
236	close(fd);
237	return 0;
238}
239
240static void perf_pmu_assign_str(char *name, const char *field, char **old_str,
241				char **new_str)
242{
243	if (!*old_str)
244		goto set_new;
245
246	if (*new_str) {	/* Have new string, check with old */
247		if (strcasecmp(*old_str, *new_str))
248			pr_debug("alias %s differs in field '%s'\n",
249				 name, field);
250		zfree(old_str);
251	} else		/* Nothing new --> keep old string */
252		return;
253set_new:
254	*old_str = *new_str;
255	*new_str = NULL;
256}
257
258static void perf_pmu_update_alias(struct perf_pmu_alias *old,
259				  struct perf_pmu_alias *newalias)
260{
261	perf_pmu_assign_str(old->name, "desc", &old->desc, &newalias->desc);
262	perf_pmu_assign_str(old->name, "long_desc", &old->long_desc,
263			    &newalias->long_desc);
264	perf_pmu_assign_str(old->name, "topic", &old->topic, &newalias->topic);
265	perf_pmu_assign_str(old->name, "metric_expr", &old->metric_expr,
266			    &newalias->metric_expr);
267	perf_pmu_assign_str(old->name, "metric_name", &old->metric_name,
268			    &newalias->metric_name);
269	perf_pmu_assign_str(old->name, "value", &old->str, &newalias->str);
270	old->scale = newalias->scale;
271	old->per_pkg = newalias->per_pkg;
272	old->snapshot = newalias->snapshot;
273	memcpy(old->unit, newalias->unit, sizeof(old->unit));
274}
275
276/* Delete an alias entry. */
277void perf_pmu_free_alias(struct perf_pmu_alias *newalias)
278{
279	zfree(&newalias->name);
280	zfree(&newalias->desc);
281	zfree(&newalias->long_desc);
282	zfree(&newalias->topic);
283	zfree(&newalias->str);
284	zfree(&newalias->metric_expr);
285	zfree(&newalias->metric_name);
286	parse_events_terms__purge(&newalias->terms);
287	free(newalias);
288}
289
290/* Merge an alias, search in alias list. If this name is already
291 * present merge both of them to combine all information.
292 */
293static bool perf_pmu_merge_alias(struct perf_pmu_alias *newalias,
294				 struct list_head *alist)
295{
296	struct perf_pmu_alias *a;
297
298	list_for_each_entry(a, alist, list) {
299		if (!strcasecmp(newalias->name, a->name)) {
300			perf_pmu_update_alias(a, newalias);
301			perf_pmu_free_alias(newalias);
302			return true;
303		}
304	}
305	return false;
306}
307
308static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name,
309				 char *desc, char *val,
310				 char *long_desc, char *topic,
311				 char *unit, char *perpkg,
312				 char *metric_expr,
313				 char *metric_name,
314				 char *deprecated)
315{
316	struct parse_events_term *term;
317	struct perf_pmu_alias *alias;
318	int ret;
319	int num;
320	char newval[256];
321
322	alias = malloc(sizeof(*alias));
323	if (!alias)
324		return -ENOMEM;
325
326	INIT_LIST_HEAD(&alias->terms);
327	alias->scale = 1.0;
328	alias->unit[0] = '\0';
329	alias->per_pkg = false;
330	alias->snapshot = false;
331	alias->deprecated = false;
332
333	ret = parse_events_terms(&alias->terms, val);
334	if (ret) {
335		pr_err("Cannot parse alias %s: %d\n", val, ret);
336		free(alias);
337		return ret;
338	}
339
340	/* Scan event and remove leading zeroes, spaces, newlines, some
341	 * platforms have terms specified as
342	 * event=0x0091 (read from files ../<PMU>/events/<FILE>
343	 * and terms specified as event=0x91 (read from JSON files).
344	 *
345	 * Rebuild string to make alias->str member comparable.
346	 */
347	memset(newval, 0, sizeof(newval));
348	ret = 0;
349	list_for_each_entry(term, &alias->terms, list) {
350		if (ret)
351			ret += scnprintf(newval + ret, sizeof(newval) - ret,
352					 ",");
353		if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
354			ret += scnprintf(newval + ret, sizeof(newval) - ret,
355					 "%s=%#x", term->config, term->val.num);
356		else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR)
357			ret += scnprintf(newval + ret, sizeof(newval) - ret,
358					 "%s=%s", term->config, term->val.str);
359	}
360
361	alias->name = strdup(name);
362	if (dir) {
363		/*
364		 * load unit name and scale if available
365		 */
366		perf_pmu__parse_unit(alias, dir, name);
367		perf_pmu__parse_scale(alias, dir, name);
368		perf_pmu__parse_per_pkg(alias, dir, name);
369		perf_pmu__parse_snapshot(alias, dir, name);
370	}
371
372	alias->metric_expr = metric_expr ? strdup(metric_expr) : NULL;
373	alias->metric_name = metric_name ? strdup(metric_name): NULL;
374	alias->desc = desc ? strdup(desc) : NULL;
375	alias->long_desc = long_desc ? strdup(long_desc) :
376				desc ? strdup(desc) : NULL;
377	alias->topic = topic ? strdup(topic) : NULL;
378	if (unit) {
379		if (perf_pmu__convert_scale(unit, &unit, &alias->scale) < 0)
380			return -1;
381		snprintf(alias->unit, sizeof(alias->unit), "%s", unit);
382	}
383	alias->per_pkg = perpkg && sscanf(perpkg, "%d", &num) == 1 && num == 1;
384	alias->str = strdup(newval);
385
386	if (deprecated)
387		alias->deprecated = true;
388
389	if (!perf_pmu_merge_alias(alias, list))
390		list_add_tail(&alias->list, list);
391
392	return 0;
393}
394
395static int perf_pmu__new_alias(struct list_head *list, char *dir, char *name, FILE *file)
396{
397	char buf[256];
398	int ret;
399
400	ret = fread(buf, 1, sizeof(buf), file);
401	if (ret == 0)
402		return -EINVAL;
403
404	buf[ret] = 0;
405
406	/* Remove trailing newline from sysfs file */
407	strim(buf);
408
409	return __perf_pmu__new_alias(list, dir, name, NULL, buf, NULL, NULL, NULL,
410				     NULL, NULL, NULL, NULL);
411}
412
413static inline bool pmu_alias_info_file(char *name)
414{
415	size_t len;
416
417	len = strlen(name);
418	if (len > 5 && !strcmp(name + len - 5, ".unit"))
419		return true;
420	if (len > 6 && !strcmp(name + len - 6, ".scale"))
421		return true;
422	if (len > 8 && !strcmp(name + len - 8, ".per-pkg"))
423		return true;
424	if (len > 9 && !strcmp(name + len - 9, ".snapshot"))
425		return true;
426
427	return false;
428}
429
430/*
431 * Process all the sysfs attributes located under the directory
432 * specified in 'dir' parameter.
433 */
434static int pmu_aliases_parse(char *dir, struct list_head *head)
435{
436	struct dirent *evt_ent;
437	DIR *event_dir;
438
439	event_dir = opendir(dir);
440	if (!event_dir)
441		return -EINVAL;
442
443	while ((evt_ent = readdir(event_dir))) {
444		char path[PATH_MAX];
445		char *name = evt_ent->d_name;
446		FILE *file;
447
448		if (!strcmp(name, ".") || !strcmp(name, ".."))
449			continue;
450
451		/*
452		 * skip info files parsed in perf_pmu__new_alias()
453		 */
454		if (pmu_alias_info_file(name))
455			continue;
456
457		scnprintf(path, PATH_MAX, "%s/%s", dir, name);
458
459		file = fopen(path, "r");
460		if (!file) {
461			pr_debug("Cannot open %s\n", path);
462			continue;
463		}
464
465		if (perf_pmu__new_alias(head, dir, name, file) < 0)
466			pr_debug("Cannot set up %s\n", name);
467		fclose(file);
468	}
469
470	closedir(event_dir);
471	return 0;
472}
473
474/*
475 * Reading the pmu event aliases definition, which should be located at:
476 * /sys/bus/event_source/devices/<dev>/events as sysfs group attributes.
477 */
478static int pmu_aliases(const char *name, struct list_head *head)
479{
480	char path[PATH_MAX];
481	const char *sysfs = sysfs__mountpoint();
482
483	if (!sysfs)
484		return -1;
485
486	snprintf(path, PATH_MAX,
487		 "%s/bus/event_source/devices/%s/events", sysfs, name);
488
489	if (!file_available(path))
490		return 0;
491
492	if (pmu_aliases_parse(path, head))
493		return -1;
494
495	return 0;
496}
497
498static int pmu_alias_terms(struct perf_pmu_alias *alias,
499			   struct list_head *terms)
500{
501	struct parse_events_term *term, *cloned;
502	LIST_HEAD(list);
503	int ret;
504
505	list_for_each_entry(term, &alias->terms, list) {
506		ret = parse_events_term__clone(&cloned, term);
507		if (ret) {
508			parse_events_terms__purge(&list);
509			return ret;
510		}
511		/*
512		 * Weak terms don't override command line options,
513		 * which we don't want for implicit terms in aliases.
514		 */
515		cloned->weak = true;
516		list_add_tail(&cloned->list, &list);
517	}
518	list_splice(&list, terms);
519	return 0;
520}
521
522/*
523 * Reading/parsing the default pmu type value, which should be
524 * located at:
525 * /sys/bus/event_source/devices/<dev>/type as sysfs attribute.
526 */
527static int pmu_type(const char *name, __u32 *type)
528{
529	char path[PATH_MAX];
530	FILE *file;
531	int ret = 0;
532	const char *sysfs = sysfs__mountpoint();
533
534	if (!sysfs)
535		return -1;
536
537	snprintf(path, PATH_MAX,
538		 "%s" EVENT_SOURCE_DEVICE_PATH "%s/type", sysfs, name);
539
540	if (access(path, R_OK) < 0)
541		return -1;
542
543	file = fopen(path, "r");
544	if (!file)
545		return -EINVAL;
546
547	if (1 != fscanf(file, "%u", type))
548		ret = -1;
549
550	fclose(file);
551	return ret;
552}
553
554/* Add all pmus in sysfs to pmu list: */
555static void pmu_read_sysfs(void)
556{
557	char path[PATH_MAX];
558	DIR *dir;
559	struct dirent *dent;
560	const char *sysfs = sysfs__mountpoint();
561
562	if (!sysfs)
563		return;
564
565	snprintf(path, PATH_MAX,
566		 "%s" EVENT_SOURCE_DEVICE_PATH, sysfs);
567
568	dir = opendir(path);
569	if (!dir)
570		return;
571
572	while ((dent = readdir(dir))) {
573		if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, ".."))
574			continue;
575		/* add to static LIST_HEAD(pmus): */
576		perf_pmu__find(dent->d_name);
577	}
578
579	closedir(dir);
580}
581
582static struct perf_cpu_map *__pmu_cpumask(const char *path)
583{
584	FILE *file;
585	struct perf_cpu_map *cpus;
586
587	file = fopen(path, "r");
588	if (!file)
589		return NULL;
590
591	cpus = perf_cpu_map__read(file);
592	fclose(file);
593	return cpus;
594}
595
596/*
597 * Uncore PMUs have a "cpumask" file under sysfs. CPU PMUs (e.g. on arm/arm64)
598 * may have a "cpus" file.
599 */
600#define CPUS_TEMPLATE_UNCORE	"%s/bus/event_source/devices/%s/cpumask"
601#define CPUS_TEMPLATE_CPU	"%s/bus/event_source/devices/%s/cpus"
602
603static struct perf_cpu_map *pmu_cpumask(const char *name)
604{
605	char path[PATH_MAX];
606	struct perf_cpu_map *cpus;
607	const char *sysfs = sysfs__mountpoint();
608	const char *templates[] = {
609		CPUS_TEMPLATE_UNCORE,
610		CPUS_TEMPLATE_CPU,
611		NULL
612	};
613	const char **template;
614
615	if (!sysfs)
616		return NULL;
617
618	for (template = templates; *template; template++) {
619		snprintf(path, PATH_MAX, *template, sysfs, name);
620		cpus = __pmu_cpumask(path);
621		if (cpus)
622			return cpus;
623	}
624
625	return NULL;
626}
627
628static bool pmu_is_uncore(const char *name)
629{
630	char path[PATH_MAX];
631	const char *sysfs;
632
633	sysfs = sysfs__mountpoint();
634	snprintf(path, PATH_MAX, CPUS_TEMPLATE_UNCORE, sysfs, name);
635	return file_available(path);
636}
637
638/*
639 *  PMU CORE devices have different name other than cpu in sysfs on some
640 *  platforms.
641 *  Looking for possible sysfs files to identify the arm core device.
642 */
643static int is_arm_pmu_core(const char *name)
644{
645	char path[PATH_MAX];
646	const char *sysfs = sysfs__mountpoint();
647
648	if (!sysfs)
649		return 0;
650
651	/* Look for cpu sysfs (specific to arm) */
652	scnprintf(path, PATH_MAX, "%s/bus/event_source/devices/%s/cpus",
653				sysfs, name);
654	return file_available(path);
655}
656
657static char *perf_pmu__getcpuid(struct perf_pmu *pmu)
658{
659	char *cpuid;
660	static bool printed;
661
662	cpuid = getenv("PERF_CPUID");
663	if (cpuid)
664		cpuid = strdup(cpuid);
665	if (!cpuid)
666		cpuid = get_cpuid_str(pmu);
667	if (!cpuid)
668		return NULL;
669
670	if (!printed) {
671		pr_debug("Using CPUID %s\n", cpuid);
672		printed = true;
673	}
674	return cpuid;
675}
676
677struct pmu_events_map *perf_pmu__find_map(struct perf_pmu *pmu)
678{
679	struct pmu_events_map *map;
680	char *cpuid = perf_pmu__getcpuid(pmu);
681	int i;
682
683	/* on some platforms which uses cpus map, cpuid can be NULL for
684	 * PMUs other than CORE PMUs.
685	 */
686	if (!cpuid)
687		return NULL;
688
689	i = 0;
690	for (;;) {
691		map = &pmu_events_map[i++];
692		if (!map->table) {
693			map = NULL;
694			break;
695		}
696
697		if (!strcmp_cpuid_str(map->cpuid, cpuid))
698			break;
699	}
700	free(cpuid);
701	return map;
702}
703
704bool pmu_uncore_alias_match(const char *pmu_name, const char *name)
705{
706	char *tmp = NULL, *tok, *str;
707	bool res;
708
709	str = strdup(pmu_name);
710	if (!str)
711		return false;
712
713	/*
714	 * uncore alias may be from different PMU with common prefix
715	 */
716	tok = strtok_r(str, ",", &tmp);
717	if (strncmp(pmu_name, tok, strlen(tok))) {
718		res = false;
719		goto out;
720	}
721
722	/*
723	 * Match more complex aliases where the alias name is a comma-delimited
724	 * list of tokens, orderly contained in the matching PMU name.
725	 *
726	 * Example: For alias "socket,pmuname" and PMU "socketX_pmunameY", we
727	 *	    match "socket" in "socketX_pmunameY" and then "pmuname" in
728	 *	    "pmunameY".
729	 */
730	for (; tok; name += strlen(tok), tok = strtok_r(NULL, ",", &tmp)) {
731		name = strstr(name, tok);
732		if (!name) {
733			res = false;
734			goto out;
735		}
736	}
737
738	res = true;
739out:
740	free(str);
741	return res;
742}
743
744/*
745 * From the pmu_events_map, find the table of PMU events that corresponds
746 * to the current running CPU. Then, add all PMU events from that table
747 * as aliases.
748 */
749void pmu_add_cpu_aliases_map(struct list_head *head, struct perf_pmu *pmu,
750			     struct pmu_events_map *map)
751{
752	int i;
753	const char *name = pmu->name;
754	/*
755	 * Found a matching PMU events table. Create aliases
756	 */
757	i = 0;
758	while (1) {
759		const char *cpu_name = is_arm_pmu_core(name) ? name : "cpu";
760		struct pmu_event *pe = &map->table[i++];
761		const char *pname = pe->pmu ? pe->pmu : cpu_name;
762
763		if (!pe->name) {
764			if (pe->metric_group || pe->metric_name)
765				continue;
766			break;
767		}
768
769		if (pmu_is_uncore(name) &&
770		    pmu_uncore_alias_match(pname, name))
771			goto new_alias;
772
773		if (strcmp(pname, name))
774			continue;
775
776new_alias:
777		/* need type casts to override 'const' */
778		__perf_pmu__new_alias(head, NULL, (char *)pe->name,
779				(char *)pe->desc, (char *)pe->event,
780				(char *)pe->long_desc, (char *)pe->topic,
781				(char *)pe->unit, (char *)pe->perpkg,
782				(char *)pe->metric_expr,
783				(char *)pe->metric_name,
784				(char *)pe->deprecated);
785	}
786}
787
788static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu)
789{
790	struct pmu_events_map *map;
791
792	map = perf_pmu__find_map(pmu);
793	if (!map)
794		return;
795
796	pmu_add_cpu_aliases_map(head, pmu, map);
797}
798
799struct perf_event_attr * __weak
800perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused)
801{
802	return NULL;
803}
804
805static int pmu_max_precise(const char *name)
806{
807	char path[PATH_MAX];
808	int max_precise = -1;
809
810	scnprintf(path, PATH_MAX,
811		 "bus/event_source/devices/%s/caps/max_precise",
812		 name);
813
814	sysfs__read_int(path, &max_precise);
815	return max_precise;
816}
817
818static struct perf_pmu *pmu_lookup(const char *name)
819{
820	struct perf_pmu *pmu;
821	LIST_HEAD(format);
822	LIST_HEAD(aliases);
823	__u32 type;
824
825	/*
826	 * The pmu data we store & need consists of the pmu
827	 * type value and format definitions. Load both right
828	 * now.
829	 */
830	if (pmu_format(name, &format))
831		return NULL;
832
833	/*
834	 * Check the type first to avoid unnecessary work.
835	 */
836	if (pmu_type(name, &type))
837		return NULL;
838
839	if (pmu_aliases(name, &aliases))
840		return NULL;
841
842	pmu = zalloc(sizeof(*pmu));
843	if (!pmu)
844		return NULL;
845
846	pmu->cpus = pmu_cpumask(name);
847	pmu->name = strdup(name);
848	pmu->type = type;
849	pmu->is_uncore = pmu_is_uncore(name);
850	pmu->max_precise = pmu_max_precise(name);
851	pmu_add_cpu_aliases(&aliases, pmu);
852
853	INIT_LIST_HEAD(&pmu->format);
854	INIT_LIST_HEAD(&pmu->aliases);
855	INIT_LIST_HEAD(&pmu->caps);
856	list_splice(&format, &pmu->format);
857	list_splice(&aliases, &pmu->aliases);
858	list_add_tail(&pmu->list, &pmus);
859
860	pmu->default_config = perf_pmu__get_default_config(pmu);
861
862	return pmu;
863}
864
865void perf_pmu__warn_invalid_formats(struct perf_pmu *pmu)
866{
867	struct perf_pmu_format *format;
868
869	/* fake pmu doesn't have format list */
870	if (pmu == &perf_pmu__fake)
871		return;
872
873	list_for_each_entry(format, &pmu->format, list)
874		if (format->value >= PERF_PMU_FORMAT_VALUE_CONFIG_END) {
875			pr_warning("WARNING: '%s' format '%s' requires 'perf_event_attr::config%d'"
876				   "which is not supported by this version of perf!\n",
877				   pmu->name, format->name, format->value);
878			return;
879		}
880}
881
882static struct perf_pmu *pmu_find(const char *name)
883{
884	struct perf_pmu *pmu;
885
886	list_for_each_entry(pmu, &pmus, list)
887		if (!strcmp(pmu->name, name))
888			return pmu;
889
890	return NULL;
891}
892
893struct perf_pmu *perf_pmu__find_by_type(unsigned int type)
894{
895	struct perf_pmu *pmu;
896
897	list_for_each_entry(pmu, &pmus, list)
898		if (pmu->type == type)
899			return pmu;
900
901	return NULL;
902}
903
904struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu)
905{
906	/*
907	 * pmu iterator: If pmu is NULL, we start at the begin,
908	 * otherwise return the next pmu. Returns NULL on end.
909	 */
910	if (!pmu) {
911		pmu_read_sysfs();
912		pmu = list_prepare_entry(pmu, &pmus, list);
913	}
914	list_for_each_entry_continue(pmu, &pmus, list)
915		return pmu;
916	return NULL;
917}
918
919struct perf_pmu *evsel__find_pmu(struct evsel *evsel)
920{
921	struct perf_pmu *pmu = NULL;
922
923	while ((pmu = perf_pmu__scan(pmu)) != NULL) {
924		if (pmu->type == evsel->core.attr.type)
925			break;
926	}
927
928	return pmu;
929}
930
931bool evsel__is_aux_event(struct evsel *evsel)
932{
933	struct perf_pmu *pmu = evsel__find_pmu(evsel);
934
935	return pmu && pmu->auxtrace;
936}
937
938struct perf_pmu *perf_pmu__find(const char *name)
939{
940	struct perf_pmu *pmu;
941
942	/*
943	 * Once PMU is loaded it stays in the list,
944	 * so we keep us from multiple reading/parsing
945	 * the pmu format definitions.
946	 */
947	pmu = pmu_find(name);
948	if (pmu)
949		return pmu;
950
951	return pmu_lookup(name);
952}
953
954static struct perf_pmu_format *
955pmu_find_format(struct list_head *formats, const char *name)
956{
957	struct perf_pmu_format *format;
958
959	list_for_each_entry(format, formats, list)
960		if (!strcmp(format->name, name))
961			return format;
962
963	return NULL;
964}
965
966__u64 perf_pmu__format_bits(struct list_head *formats, const char *name)
967{
968	struct perf_pmu_format *format = pmu_find_format(formats, name);
969	__u64 bits = 0;
970	int fbit;
971
972	if (!format)
973		return 0;
974
975	for_each_set_bit(fbit, format->bits, PERF_PMU_FORMAT_BITS)
976		bits |= 1ULL << fbit;
977
978	return bits;
979}
980
981int perf_pmu__format_type(struct list_head *formats, const char *name)
982{
983	struct perf_pmu_format *format = pmu_find_format(formats, name);
984
985	if (!format)
986		return -1;
987
988	return format->value;
989}
990
991/*
992 * Sets value based on the format definition (format parameter)
993 * and unformated value (value parameter).
994 */
995static void pmu_format_value(unsigned long *format, __u64 value, __u64 *v,
996			     bool zero)
997{
998	unsigned long fbit, vbit;
999
1000	for (fbit = 0, vbit = 0; fbit < PERF_PMU_FORMAT_BITS; fbit++) {
1001
1002		if (!test_bit(fbit, format))
1003			continue;
1004
1005		if (value & (1llu << vbit++))
1006			*v |= (1llu << fbit);
1007		else if (zero)
1008			*v &= ~(1llu << fbit);
1009	}
1010}
1011
1012static __u64 pmu_format_max_value(const unsigned long *format)
1013{
1014	int w;
1015
1016	w = bitmap_weight(format, PERF_PMU_FORMAT_BITS);
1017	if (!w)
1018		return 0;
1019	if (w < 64)
1020		return (1ULL << w) - 1;
1021	return -1;
1022}
1023
1024/*
1025 * Term is a string term, and might be a param-term. Try to look up it's value
1026 * in the remaining terms.
1027 * - We have a term like "base-or-format-term=param-term",
1028 * - We need to find the value supplied for "param-term" (with param-term named
1029 *   in a config string) later on in the term list.
1030 */
1031static int pmu_resolve_param_term(struct parse_events_term *term,
1032				  struct list_head *head_terms,
1033				  __u64 *value)
1034{
1035	struct parse_events_term *t;
1036
1037	list_for_each_entry(t, head_terms, list) {
1038		if (t->type_val == PARSE_EVENTS__TERM_TYPE_NUM &&
1039		    t->config && !strcmp(t->config, term->config)) {
1040			t->used = true;
1041			*value = t->val.num;
1042			return 0;
1043		}
1044	}
1045
1046	if (verbose > 0)
1047		printf("Required parameter '%s' not specified\n", term->config);
1048
1049	return -1;
1050}
1051
1052static char *pmu_formats_string(struct list_head *formats)
1053{
1054	struct perf_pmu_format *format;
1055	char *str = NULL;
1056	struct strbuf buf = STRBUF_INIT;
1057	unsigned i = 0;
1058
1059	if (!formats)
1060		return NULL;
1061
1062	/* sysfs exported terms */
1063	list_for_each_entry(format, formats, list)
1064		if (strbuf_addf(&buf, i++ ? ",%s" : "%s", format->name) < 0)
1065			goto error;
1066
1067	str = strbuf_detach(&buf, NULL);
1068error:
1069	strbuf_release(&buf);
1070
1071	return str;
1072}
1073
1074/*
1075 * Setup one of config[12] attr members based on the
1076 * user input data - term parameter.
1077 */
1078static int pmu_config_term(const char *pmu_name,
1079			   struct list_head *formats,
1080			   struct perf_event_attr *attr,
1081			   struct parse_events_term *term,
1082			   struct list_head *head_terms,
1083			   bool zero, struct parse_events_error *err)
1084{
1085	struct perf_pmu_format *format;
1086	__u64 *vp;
1087	__u64 val, max_val;
1088
1089	/*
1090	 * If this is a parameter we've already used for parameterized-eval,
1091	 * skip it in normal eval.
1092	 */
1093	if (term->used)
1094		return 0;
1095
1096	/*
1097	 * Hardcoded terms should be already in, so nothing
1098	 * to be done for them.
1099	 */
1100	if (parse_events__is_hardcoded_term(term))
1101		return 0;
1102
1103	format = pmu_find_format(formats, term->config);
1104	if (!format) {
1105		char *pmu_term = pmu_formats_string(formats);
1106		char *unknown_term;
1107		char *help_msg;
1108
1109		if (asprintf(&unknown_term,
1110				"unknown term '%s' for pmu '%s'",
1111				term->config, pmu_name) < 0)
1112			unknown_term = NULL;
1113		help_msg = parse_events_formats_error_string(pmu_term);
1114		if (err) {
1115			parse_events__handle_error(err, term->err_term,
1116						   unknown_term,
1117						   help_msg);
1118		} else {
1119			pr_debug("%s (%s)\n", unknown_term, help_msg);
1120			free(unknown_term);
1121		}
1122		free(pmu_term);
1123		return -EINVAL;
1124	}
1125
1126	switch (format->value) {
1127	case PERF_PMU_FORMAT_VALUE_CONFIG:
1128		vp = &attr->config;
1129		break;
1130	case PERF_PMU_FORMAT_VALUE_CONFIG1:
1131		vp = &attr->config1;
1132		break;
1133	case PERF_PMU_FORMAT_VALUE_CONFIG2:
1134		vp = &attr->config2;
1135		break;
1136	default:
1137		return -EINVAL;
1138	}
1139
1140	/*
1141	 * Either directly use a numeric term, or try to translate string terms
1142	 * using event parameters.
1143	 */
1144	if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) {
1145		if (term->no_value &&
1146		    bitmap_weight(format->bits, PERF_PMU_FORMAT_BITS) > 1) {
1147			if (err) {
1148				parse_events__handle_error(err, term->err_val,
1149					   strdup("no value assigned for term"),
1150					   NULL);
1151			}
1152			return -EINVAL;
1153		}
1154
1155		val = term->val.num;
1156	} else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) {
1157		if (strcmp(term->val.str, "?")) {
1158			if (verbose > 0) {
1159				pr_info("Invalid sysfs entry %s=%s\n",
1160						term->config, term->val.str);
1161			}
1162			if (err) {
1163				parse_events__handle_error(err, term->err_val,
1164					strdup("expected numeric value"),
1165					NULL);
1166			}
1167			return -EINVAL;
1168		}
1169
1170		if (pmu_resolve_param_term(term, head_terms, &val))
1171			return -EINVAL;
1172	} else
1173		return -EINVAL;
1174
1175	max_val = pmu_format_max_value(format->bits);
1176	if (val > max_val) {
1177		if (err) {
1178			char *err_str;
1179
1180			parse_events__handle_error(err, term->err_val,
1181				asprintf(&err_str,
1182				    "value too big for format, maximum is %llu",
1183				    (unsigned long long)max_val) < 0
1184				    ? strdup("value too big for format")
1185				    : err_str,
1186				    NULL);
1187			return -EINVAL;
1188		}
1189		/*
1190		 * Assume we don't care if !err, in which case the value will be
1191		 * silently truncated.
1192		 */
1193	}
1194
1195	pmu_format_value(format->bits, val, vp, zero);
1196	return 0;
1197}
1198
1199int perf_pmu__config_terms(const char *pmu_name, struct list_head *formats,
1200			   struct perf_event_attr *attr,
1201			   struct list_head *head_terms,
1202			   bool zero, struct parse_events_error *err)
1203{
1204	struct parse_events_term *term;
1205
1206	list_for_each_entry(term, head_terms, list) {
1207		if (pmu_config_term(pmu_name, formats, attr, term, head_terms,
1208				    zero, err))
1209			return -EINVAL;
1210	}
1211
1212	return 0;
1213}
1214
1215/*
1216 * Configures event's 'attr' parameter based on the:
1217 * 1) users input - specified in terms parameter
1218 * 2) pmu format definitions - specified by pmu parameter
1219 */
1220int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr,
1221		     struct list_head *head_terms,
1222		     struct parse_events_error *err)
1223{
1224	bool zero = !!pmu->default_config;
1225
1226	attr->type = pmu->type;
1227	return perf_pmu__config_terms(pmu->name, &pmu->format, attr,
1228				      head_terms, zero, err);
1229}
1230
1231static struct perf_pmu_alias *pmu_find_alias(struct perf_pmu *pmu,
1232					     struct parse_events_term *term)
1233{
1234	struct perf_pmu_alias *alias;
1235	char *name;
1236
1237	if (parse_events__is_hardcoded_term(term))
1238		return NULL;
1239
1240	if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) {
1241		if (term->val.num != 1)
1242			return NULL;
1243		if (pmu_find_format(&pmu->format, term->config))
1244			return NULL;
1245		name = term->config;
1246	} else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) {
1247		if (strcasecmp(term->config, "event"))
1248			return NULL;
1249		name = term->val.str;
1250	} else {
1251		return NULL;
1252	}
1253
1254	list_for_each_entry(alias, &pmu->aliases, list) {
1255		if (!strcasecmp(alias->name, name))
1256			return alias;
1257	}
1258	return NULL;
1259}
1260
1261
1262static int check_info_data(struct perf_pmu_alias *alias,
1263			   struct perf_pmu_info *info)
1264{
1265	/*
1266	 * Only one term in event definition can
1267	 * define unit, scale and snapshot, fail
1268	 * if there's more than one.
1269	 */
1270	if ((info->unit && alias->unit[0]) ||
1271	    (info->scale && alias->scale) ||
1272	    (info->snapshot && alias->snapshot))
1273		return -EINVAL;
1274
1275	if (alias->unit[0])
1276		info->unit = alias->unit;
1277
1278	if (alias->scale)
1279		info->scale = alias->scale;
1280
1281	if (alias->snapshot)
1282		info->snapshot = alias->snapshot;
1283
1284	return 0;
1285}
1286
1287/*
1288 * Find alias in the terms list and replace it with the terms
1289 * defined for the alias
1290 */
1291int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms,
1292			  struct perf_pmu_info *info)
1293{
1294	struct parse_events_term *term, *h;
1295	struct perf_pmu_alias *alias;
1296	int ret;
1297
1298	info->per_pkg = false;
1299
1300	/*
1301	 * Mark unit and scale as not set
1302	 * (different from default values, see below)
1303	 */
1304	info->unit     = NULL;
1305	info->scale    = 0.0;
1306	info->snapshot = false;
1307	info->metric_expr = NULL;
1308	info->metric_name = NULL;
1309
1310	list_for_each_entry_safe(term, h, head_terms, list) {
1311		alias = pmu_find_alias(pmu, term);
1312		if (!alias)
1313			continue;
1314		ret = pmu_alias_terms(alias, &term->list);
1315		if (ret)
1316			return ret;
1317
1318		ret = check_info_data(alias, info);
1319		if (ret)
1320			return ret;
1321
1322		if (alias->per_pkg)
1323			info->per_pkg = true;
1324		info->metric_expr = alias->metric_expr;
1325		info->metric_name = alias->metric_name;
1326
1327		list_del_init(&term->list);
1328		parse_events_term__delete(term);
1329	}
1330
1331	/*
1332	 * if no unit or scale foundin aliases, then
1333	 * set defaults as for evsel
1334	 * unit cannot left to NULL
1335	 */
1336	if (info->unit == NULL)
1337		info->unit   = "";
1338
1339	if (info->scale == 0.0)
1340		info->scale  = 1.0;
1341
1342	return 0;
1343}
1344
1345int perf_pmu__new_format(struct list_head *list, char *name,
1346			 int config, unsigned long *bits)
1347{
1348	struct perf_pmu_format *format;
1349
1350	format = zalloc(sizeof(*format));
1351	if (!format)
1352		return -ENOMEM;
1353
1354	format->name = strdup(name);
1355	format->value = config;
1356	memcpy(format->bits, bits, sizeof(format->bits));
1357
1358	list_add_tail(&format->list, list);
1359	return 0;
1360}
1361
1362void perf_pmu__set_format(unsigned long *bits, long from, long to)
1363{
1364	long b;
1365
1366	if (!to)
1367		to = from;
1368
1369	memset(bits, 0, BITS_TO_BYTES(PERF_PMU_FORMAT_BITS));
1370	for (b = from; b <= to; b++)
1371		set_bit(b, bits);
1372}
1373
1374void perf_pmu__del_formats(struct list_head *formats)
1375{
1376	struct perf_pmu_format *fmt, *tmp;
1377
1378	list_for_each_entry_safe(fmt, tmp, formats, list) {
1379		list_del(&fmt->list);
1380		free(fmt->name);
1381		free(fmt);
1382	}
1383}
1384
1385static int sub_non_neg(int a, int b)
1386{
1387	if (b > a)
1388		return 0;
1389	return a - b;
1390}
1391
1392static char *format_alias(char *buf, int len, struct perf_pmu *pmu,
1393			  struct perf_pmu_alias *alias)
1394{
1395	struct parse_events_term *term;
1396	int used = snprintf(buf, len, "%s/%s", pmu->name, alias->name);
1397
1398	list_for_each_entry(term, &alias->terms, list) {
1399		if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR)
1400			used += snprintf(buf + used, sub_non_neg(len, used),
1401					",%s=%s", term->config,
1402					term->val.str);
1403	}
1404
1405	if (sub_non_neg(len, used) > 0) {
1406		buf[used] = '/';
1407		used++;
1408	}
1409	if (sub_non_neg(len, used) > 0) {
1410		buf[used] = '\0';
1411		used++;
1412	} else
1413		buf[len - 1] = '\0';
1414
1415	return buf;
1416}
1417
1418static char *format_alias_or(char *buf, int len, struct perf_pmu *pmu,
1419			     struct perf_pmu_alias *alias)
1420{
1421	snprintf(buf, len, "%s OR %s/%s/", alias->name, pmu->name, alias->name);
1422	return buf;
1423}
1424
1425struct sevent {
1426	char *name;
1427	char *desc;
1428	char *topic;
1429	char *str;
1430	char *pmu;
1431	char *metric_expr;
1432	char *metric_name;
1433	int is_cpu;
1434};
1435
1436static int cmp_sevent(const void *a, const void *b)
1437{
1438	const struct sevent *as = a;
1439	const struct sevent *bs = b;
1440
1441	/* Put extra events last */
1442	if (!!as->desc != !!bs->desc)
1443		return !!as->desc - !!bs->desc;
1444	if (as->topic && bs->topic) {
1445		int n = strcmp(as->topic, bs->topic);
1446
1447		if (n)
1448			return n;
1449	}
1450
1451	/* Order CPU core events to be first */
1452	if (as->is_cpu != bs->is_cpu)
1453		return bs->is_cpu - as->is_cpu;
1454
1455	return strcmp(as->name, bs->name);
1456}
1457
1458static void wordwrap(char *s, int start, int max, int corr)
1459{
1460	int column = start;
1461	int n;
1462
1463	while (*s) {
1464		int wlen = strcspn(s, " \t");
1465
1466		if (column + wlen >= max && column > start) {
1467			printf("\n%*s", start, "");
1468			column = start + corr;
1469		}
1470		n = printf("%s%.*s", column > start ? " " : "", wlen, s);
1471		if (n <= 0)
1472			break;
1473		s += wlen;
1474		column += n;
1475		s = skip_spaces(s);
1476	}
1477}
1478
1479bool is_pmu_core(const char *name)
1480{
1481	return !strcmp(name, "cpu") || is_arm_pmu_core(name);
1482}
1483
1484void print_pmu_events(const char *event_glob, bool name_only, bool quiet_flag,
1485			bool long_desc, bool details_flag, bool deprecated)
1486{
1487	struct perf_pmu *pmu;
1488	struct perf_pmu_alias *alias;
1489	char buf[1024];
1490	int printed = 0;
1491	int len, j;
1492	struct sevent *aliases;
1493	int numdesc = 0;
1494	int columns = pager_get_columns();
1495	char *topic = NULL;
1496
1497	pmu = NULL;
1498	len = 0;
1499	while ((pmu = perf_pmu__scan(pmu)) != NULL) {
1500		list_for_each_entry(alias, &pmu->aliases, list)
1501			len++;
1502		if (pmu->selectable)
1503			len++;
1504	}
1505	aliases = zalloc(sizeof(struct sevent) * len);
1506	if (!aliases)
1507		goto out_enomem;
1508	pmu = NULL;
1509	j = 0;
1510	while ((pmu = perf_pmu__scan(pmu)) != NULL) {
1511		list_for_each_entry(alias, &pmu->aliases, list) {
1512			char *name = alias->desc ? alias->name :
1513				format_alias(buf, sizeof(buf), pmu, alias);
1514			bool is_cpu = is_pmu_core(pmu->name);
1515
1516			if (alias->deprecated && !deprecated)
1517				continue;
1518
1519			if (event_glob != NULL &&
1520			    !(strglobmatch_nocase(name, event_glob) ||
1521			      (!is_cpu && strglobmatch_nocase(alias->name,
1522						       event_glob)) ||
1523			      (alias->topic &&
1524			       strglobmatch_nocase(alias->topic, event_glob))))
1525				continue;
1526
1527			if (is_cpu && !name_only && !alias->desc)
1528				name = format_alias_or(buf, sizeof(buf), pmu, alias);
1529
1530			aliases[j].name = name;
1531			if (is_cpu && !name_only && !alias->desc)
1532				aliases[j].name = format_alias_or(buf,
1533								  sizeof(buf),
1534								  pmu, alias);
1535			aliases[j].name = strdup(aliases[j].name);
1536			if (!aliases[j].name)
1537				goto out_enomem;
1538
1539			aliases[j].desc = long_desc ? alias->long_desc :
1540						alias->desc;
1541			aliases[j].topic = alias->topic;
1542			aliases[j].str = alias->str;
1543			aliases[j].pmu = pmu->name;
1544			aliases[j].metric_expr = alias->metric_expr;
1545			aliases[j].metric_name = alias->metric_name;
1546			aliases[j].is_cpu = is_cpu;
1547			j++;
1548		}
1549		if (pmu->selectable &&
1550		    (event_glob == NULL || strglobmatch(pmu->name, event_glob))) {
1551			char *s;
1552			if (asprintf(&s, "%s//", pmu->name) < 0)
1553				goto out_enomem;
1554			aliases[j].name = s;
1555			j++;
1556		}
1557	}
1558	len = j;
1559	qsort(aliases, len, sizeof(struct sevent), cmp_sevent);
1560	for (j = 0; j < len; j++) {
1561		/* Skip duplicates */
1562		if (j > 0 && !strcmp(aliases[j].name, aliases[j - 1].name))
1563			continue;
1564		if (name_only) {
1565			printf("%s ", aliases[j].name);
1566			continue;
1567		}
1568		if (aliases[j].desc && !quiet_flag) {
1569			if (numdesc++ == 0)
1570				printf("\n");
1571			if (aliases[j].topic && (!topic ||
1572					strcmp(topic, aliases[j].topic))) {
1573				printf("%s%s:\n", topic ? "\n" : "",
1574						aliases[j].topic);
1575				topic = aliases[j].topic;
1576			}
1577			printf("  %-50s\n", aliases[j].name);
1578			printf("%*s", 8, "[");
1579			wordwrap(aliases[j].desc, 8, columns, 0);
1580			printf("]\n");
1581			if (details_flag) {
1582				printf("%*s%s/%s/ ", 8, "", aliases[j].pmu, aliases[j].str);
1583				if (aliases[j].metric_name)
1584					printf(" MetricName: %s", aliases[j].metric_name);
1585				if (aliases[j].metric_expr)
1586					printf(" MetricExpr: %s", aliases[j].metric_expr);
1587				putchar('\n');
1588			}
1589		} else
1590			printf("  %-50s [Kernel PMU event]\n", aliases[j].name);
1591		printed++;
1592	}
1593	if (printed && pager_in_use())
1594		printf("\n");
1595out_free:
1596	for (j = 0; j < len; j++)
1597		zfree(&aliases[j].name);
1598	zfree(&aliases);
1599	return;
1600
1601out_enomem:
1602	printf("FATAL: not enough memory to print PMU events\n");
1603	if (aliases)
1604		goto out_free;
1605}
1606
1607bool pmu_have_event(const char *pname, const char *name)
1608{
1609	struct perf_pmu *pmu;
1610	struct perf_pmu_alias *alias;
1611
1612	pmu = NULL;
1613	while ((pmu = perf_pmu__scan(pmu)) != NULL) {
1614		if (strcmp(pname, pmu->name))
1615			continue;
1616		list_for_each_entry(alias, &pmu->aliases, list)
1617			if (!strcmp(alias->name, name))
1618				return true;
1619	}
1620	return false;
1621}
1622
1623static FILE *perf_pmu__open_file(struct perf_pmu *pmu, const char *name)
1624{
1625	char path[PATH_MAX];
1626	const char *sysfs;
1627
1628	sysfs = sysfs__mountpoint();
1629	if (!sysfs)
1630		return NULL;
1631
1632	snprintf(path, PATH_MAX,
1633		 "%s" EVENT_SOURCE_DEVICE_PATH "%s/%s", sysfs, pmu->name, name);
1634	if (!file_available(path))
1635		return NULL;
1636	return fopen(path, "r");
1637}
1638
1639int perf_pmu__scan_file(struct perf_pmu *pmu, const char *name, const char *fmt,
1640			...)
1641{
1642	va_list args;
1643	FILE *file;
1644	int ret = EOF;
1645
1646	va_start(args, fmt);
1647	file = perf_pmu__open_file(pmu, name);
1648	if (file) {
1649		ret = vfscanf(file, fmt, args);
1650		fclose(file);
1651	}
1652	va_end(args);
1653	return ret;
1654}
1655
1656static int perf_pmu__new_caps(struct list_head *list, char *name, char *value)
1657{
1658	struct perf_pmu_caps *caps = zalloc(sizeof(*caps));
1659
1660	if (!caps)
1661		return -ENOMEM;
1662
1663	caps->name = strdup(name);
1664	if (!caps->name)
1665		goto free_caps;
1666	caps->value = strndup(value, strlen(value) - 1);
1667	if (!caps->value)
1668		goto free_name;
1669	list_add_tail(&caps->list, list);
1670	return 0;
1671
1672free_name:
1673	zfree(&caps->name);
1674free_caps:
1675	free(caps);
1676
1677	return -ENOMEM;
1678}
1679
1680/*
1681 * Reading/parsing the given pmu capabilities, which should be located at:
1682 * /sys/bus/event_source/devices/<dev>/caps as sysfs group attributes.
1683 * Return the number of capabilities
1684 */
1685int perf_pmu__caps_parse(struct perf_pmu *pmu)
1686{
1687	struct stat st;
1688	char caps_path[PATH_MAX];
1689	const char *sysfs = sysfs__mountpoint();
1690	DIR *caps_dir;
1691	struct dirent *evt_ent;
1692	int nr_caps = 0;
1693
1694	if (!sysfs)
1695		return -1;
1696
1697	snprintf(caps_path, PATH_MAX,
1698		 "%s" EVENT_SOURCE_DEVICE_PATH "%s/caps", sysfs, pmu->name);
1699
1700	if (stat(caps_path, &st) < 0)
1701		return 0;	/* no error if caps does not exist */
1702
1703	caps_dir = opendir(caps_path);
1704	if (!caps_dir)
1705		return -EINVAL;
1706
1707	while ((evt_ent = readdir(caps_dir)) != NULL) {
1708		char path[PATH_MAX + NAME_MAX + 1];
1709		char *name = evt_ent->d_name;
1710		char value[128];
1711		FILE *file;
1712
1713		if (!strcmp(name, ".") || !strcmp(name, ".."))
1714			continue;
1715
1716		snprintf(path, sizeof(path), "%s/%s", caps_path, name);
1717
1718		file = fopen(path, "r");
1719		if (!file)
1720			continue;
1721
1722		if (!fgets(value, sizeof(value), file) ||
1723		    (perf_pmu__new_caps(&pmu->caps, name, value) < 0)) {
1724			fclose(file);
1725			continue;
1726		}
1727
1728		nr_caps++;
1729		fclose(file);
1730	}
1731
1732	closedir(caps_dir);
1733
1734	return nr_caps;
1735}
1736
1737void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
1738				   char *name)
1739{
1740	struct perf_pmu_format *format;
1741	__u64 masks = 0, bits;
1742	char buf[100];
1743	unsigned int i;
1744
1745	list_for_each_entry(format, &pmu->format, list)	{
1746		if (format->value != PERF_PMU_FORMAT_VALUE_CONFIG)
1747			continue;
1748
1749		for_each_set_bit(i, format->bits, PERF_PMU_FORMAT_BITS)
1750			masks |= 1ULL << i;
1751	}
1752
1753	/*
1754	 * Kernel doesn't export any valid format bits.
1755	 */
1756	if (masks == 0)
1757		return;
1758
1759	bits = config & ~masks;
1760	if (bits == 0)
1761		return;
1762
1763	bitmap_scnprintf((unsigned long *)&bits, sizeof(bits) * 8, buf, sizeof(buf));
1764
1765	pr_warning("WARNING: event '%s' not valid (bits %s of config "
1766		   "'%llx' not supported by kernel)!\n",
1767		   name ?: "N/A", buf, config);
1768}
1769