perf pmu: Use __weak definition from <linux/compiler.h>
[pandora-kernel.git] / tools / perf / util / pmu.c
1 #include <linux/list.h>
2 #include <linux/compiler.h>
3 #include <sys/types.h>
4 #include <unistd.h>
5 #include <stdio.h>
6 #include <stdbool.h>
7 #include <stdarg.h>
8 #include <dirent.h>
9 #include <api/fs/fs.h>
10 #include <locale.h>
11 #include "util.h"
12 #include "pmu.h"
13 #include "parse-events.h"
14 #include "cpumap.h"
15
16 struct perf_pmu_format {
17         char *name;
18         int value;
19         DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS);
20         struct list_head list;
21 };
22
23 #define EVENT_SOURCE_DEVICE_PATH "/bus/event_source/devices/"
24
25 int perf_pmu_parse(struct list_head *list, char *name);
26 extern FILE *perf_pmu_in;
27
28 static LIST_HEAD(pmus);
29
30 /*
31  * Parse & process all the sysfs attributes located under
32  * the directory specified in 'dir' parameter.
33  */
34 int perf_pmu__format_parse(char *dir, struct list_head *head)
35 {
36         struct dirent *evt_ent;
37         DIR *format_dir;
38         int ret = 0;
39
40         format_dir = opendir(dir);
41         if (!format_dir)
42                 return -EINVAL;
43
44         while (!ret && (evt_ent = readdir(format_dir))) {
45                 char path[PATH_MAX];
46                 char *name = evt_ent->d_name;
47                 FILE *file;
48
49                 if (!strcmp(name, ".") || !strcmp(name, ".."))
50                         continue;
51
52                 snprintf(path, PATH_MAX, "%s/%s", dir, name);
53
54                 ret = -EINVAL;
55                 file = fopen(path, "r");
56                 if (!file)
57                         break;
58
59                 perf_pmu_in = file;
60                 ret = perf_pmu_parse(head, name);
61                 fclose(file);
62         }
63
64         closedir(format_dir);
65         return ret;
66 }
67
68 /*
69  * Reading/parsing the default pmu format definition, which should be
70  * located at:
71  * /sys/bus/event_source/devices/<dev>/format as sysfs group attributes.
72  */
73 static int pmu_format(const char *name, struct list_head *format)
74 {
75         struct stat st;
76         char path[PATH_MAX];
77         const char *sysfs = sysfs__mountpoint();
78
79         if (!sysfs)
80                 return -1;
81
82         snprintf(path, PATH_MAX,
83                  "%s" EVENT_SOURCE_DEVICE_PATH "%s/format", sysfs, name);
84
85         if (stat(path, &st) < 0)
86                 return 0;       /* no error if format does not exist */
87
88         if (perf_pmu__format_parse(path, format))
89                 return -1;
90
91         return 0;
92 }
93
94 static int perf_pmu__parse_scale(struct perf_pmu_alias *alias, char *dir, char *name)
95 {
96         struct stat st;
97         ssize_t sret;
98         char scale[128];
99         int fd, ret = -1;
100         char path[PATH_MAX];
101         const char *lc;
102
103         snprintf(path, PATH_MAX, "%s/%s.scale", dir, name);
104
105         fd = open(path, O_RDONLY);
106         if (fd == -1)
107                 return -1;
108
109         if (fstat(fd, &st) < 0)
110                 goto error;
111
112         sret = read(fd, scale, sizeof(scale)-1);
113         if (sret < 0)
114                 goto error;
115
116         if (scale[sret - 1] == '\n')
117                 scale[sret - 1] = '\0';
118         else
119                 scale[sret] = '\0';
120
121         /*
122          * save current locale
123          */
124         lc = setlocale(LC_NUMERIC, NULL);
125
126         /*
127          * force to C locale to ensure kernel
128          * scale string is converted correctly.
129          * kernel uses default C locale.
130          */
131         setlocale(LC_NUMERIC, "C");
132
133         alias->scale = strtod(scale, NULL);
134
135         /* restore locale */
136         setlocale(LC_NUMERIC, lc);
137
138         ret = 0;
139 error:
140         close(fd);
141         return ret;
142 }
143
144 static int perf_pmu__parse_unit(struct perf_pmu_alias *alias, char *dir, char *name)
145 {
146         char path[PATH_MAX];
147         ssize_t sret;
148         int fd;
149
150         snprintf(path, PATH_MAX, "%s/%s.unit", dir, name);
151
152         fd = open(path, O_RDONLY);
153         if (fd == -1)
154                 return -1;
155
156                 sret = read(fd, alias->unit, UNIT_MAX_LEN);
157         if (sret < 0)
158                 goto error;
159
160         close(fd);
161
162         if (alias->unit[sret - 1] == '\n')
163                 alias->unit[sret - 1] = '\0';
164         else
165                 alias->unit[sret] = '\0';
166
167         return 0;
168 error:
169         close(fd);
170         alias->unit[0] = '\0';
171         return -1;
172 }
173
174 static int
175 perf_pmu__parse_per_pkg(struct perf_pmu_alias *alias, char *dir, char *name)
176 {
177         char path[PATH_MAX];
178         int fd;
179
180         snprintf(path, PATH_MAX, "%s/%s.per-pkg", dir, name);
181
182         fd = open(path, O_RDONLY);
183         if (fd == -1)
184                 return -1;
185
186         close(fd);
187
188         alias->per_pkg = true;
189         return 0;
190 }
191
192 static int perf_pmu__parse_snapshot(struct perf_pmu_alias *alias,
193                                     char *dir, char *name)
194 {
195         char path[PATH_MAX];
196         int fd;
197
198         snprintf(path, PATH_MAX, "%s/%s.snapshot", dir, name);
199
200         fd = open(path, O_RDONLY);
201         if (fd == -1)
202                 return -1;
203
204         alias->snapshot = true;
205         close(fd);
206         return 0;
207 }
208
209 static int perf_pmu__new_alias(struct list_head *list, char *dir, char *name, FILE *file)
210 {
211         struct perf_pmu_alias *alias;
212         char buf[256];
213         int ret;
214
215         ret = fread(buf, 1, sizeof(buf), file);
216         if (ret == 0)
217                 return -EINVAL;
218         buf[ret] = 0;
219
220         alias = malloc(sizeof(*alias));
221         if (!alias)
222                 return -ENOMEM;
223
224         INIT_LIST_HEAD(&alias->terms);
225         alias->scale = 1.0;
226         alias->unit[0] = '\0';
227         alias->per_pkg = false;
228
229         ret = parse_events_terms(&alias->terms, buf);
230         if (ret) {
231                 free(alias);
232                 return ret;
233         }
234
235         alias->name = strdup(name);
236         /*
237          * load unit name and scale if available
238          */
239         perf_pmu__parse_unit(alias, dir, name);
240         perf_pmu__parse_scale(alias, dir, name);
241         perf_pmu__parse_per_pkg(alias, dir, name);
242         perf_pmu__parse_snapshot(alias, dir, name);
243
244         list_add_tail(&alias->list, list);
245
246         return 0;
247 }
248
249 static inline bool pmu_alias_info_file(char *name)
250 {
251         size_t len;
252
253         len = strlen(name);
254         if (len > 5 && !strcmp(name + len - 5, ".unit"))
255                 return true;
256         if (len > 6 && !strcmp(name + len - 6, ".scale"))
257                 return true;
258         if (len > 8 && !strcmp(name + len - 8, ".per-pkg"))
259                 return true;
260         if (len > 9 && !strcmp(name + len - 9, ".snapshot"))
261                 return true;
262
263         return false;
264 }
265
266 /*
267  * Process all the sysfs attributes located under the directory
268  * specified in 'dir' parameter.
269  */
270 static int pmu_aliases_parse(char *dir, struct list_head *head)
271 {
272         struct dirent *evt_ent;
273         DIR *event_dir;
274         int ret = 0;
275
276         event_dir = opendir(dir);
277         if (!event_dir)
278                 return -EINVAL;
279
280         while (!ret && (evt_ent = readdir(event_dir))) {
281                 char path[PATH_MAX];
282                 char *name = evt_ent->d_name;
283                 FILE *file;
284
285                 if (!strcmp(name, ".") || !strcmp(name, ".."))
286                         continue;
287
288                 /*
289                  * skip info files parsed in perf_pmu__new_alias()
290                  */
291                 if (pmu_alias_info_file(name))
292                         continue;
293
294                 snprintf(path, PATH_MAX, "%s/%s", dir, name);
295
296                 ret = -EINVAL;
297                 file = fopen(path, "r");
298                 if (!file)
299                         break;
300
301                 ret = perf_pmu__new_alias(head, dir, name, file);
302                 fclose(file);
303         }
304
305         closedir(event_dir);
306         return ret;
307 }
308
309 /*
310  * Reading the pmu event aliases definition, which should be located at:
311  * /sys/bus/event_source/devices/<dev>/events as sysfs group attributes.
312  */
313 static int pmu_aliases(const char *name, struct list_head *head)
314 {
315         struct stat st;
316         char path[PATH_MAX];
317         const char *sysfs = sysfs__mountpoint();
318
319         if (!sysfs)
320                 return -1;
321
322         snprintf(path, PATH_MAX,
323                  "%s/bus/event_source/devices/%s/events", sysfs, name);
324
325         if (stat(path, &st) < 0)
326                 return 0;        /* no error if 'events' does not exist */
327
328         if (pmu_aliases_parse(path, head))
329                 return -1;
330
331         return 0;
332 }
333
334 static int pmu_alias_terms(struct perf_pmu_alias *alias,
335                            struct list_head *terms)
336 {
337         struct parse_events_term *term, *cloned;
338         LIST_HEAD(list);
339         int ret;
340
341         list_for_each_entry(term, &alias->terms, list) {
342                 ret = parse_events_term__clone(&cloned, term);
343                 if (ret) {
344                         parse_events__free_terms(&list);
345                         return ret;
346                 }
347                 list_add_tail(&cloned->list, &list);
348         }
349         list_splice(&list, terms);
350         return 0;
351 }
352
353 /*
354  * Reading/parsing the default pmu type value, which should be
355  * located at:
356  * /sys/bus/event_source/devices/<dev>/type as sysfs attribute.
357  */
358 static int pmu_type(const char *name, __u32 *type)
359 {
360         struct stat st;
361         char path[PATH_MAX];
362         FILE *file;
363         int ret = 0;
364         const char *sysfs = sysfs__mountpoint();
365
366         if (!sysfs)
367                 return -1;
368
369         snprintf(path, PATH_MAX,
370                  "%s" EVENT_SOURCE_DEVICE_PATH "%s/type", sysfs, name);
371
372         if (stat(path, &st) < 0)
373                 return -1;
374
375         file = fopen(path, "r");
376         if (!file)
377                 return -EINVAL;
378
379         if (1 != fscanf(file, "%u", type))
380                 ret = -1;
381
382         fclose(file);
383         return ret;
384 }
385
386 /* Add all pmus in sysfs to pmu list: */
387 static void pmu_read_sysfs(void)
388 {
389         char path[PATH_MAX];
390         DIR *dir;
391         struct dirent *dent;
392         const char *sysfs = sysfs__mountpoint();
393
394         if (!sysfs)
395                 return;
396
397         snprintf(path, PATH_MAX,
398                  "%s" EVENT_SOURCE_DEVICE_PATH, sysfs);
399
400         dir = opendir(path);
401         if (!dir)
402                 return;
403
404         while ((dent = readdir(dir))) {
405                 if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, ".."))
406                         continue;
407                 /* add to static LIST_HEAD(pmus): */
408                 perf_pmu__find(dent->d_name);
409         }
410
411         closedir(dir);
412 }
413
414 static struct cpu_map *pmu_cpumask(const char *name)
415 {
416         struct stat st;
417         char path[PATH_MAX];
418         FILE *file;
419         struct cpu_map *cpus;
420         const char *sysfs = sysfs__mountpoint();
421
422         if (!sysfs)
423                 return NULL;
424
425         snprintf(path, PATH_MAX,
426                  "%s/bus/event_source/devices/%s/cpumask", sysfs, name);
427
428         if (stat(path, &st) < 0)
429                 return NULL;
430
431         file = fopen(path, "r");
432         if (!file)
433                 return NULL;
434
435         cpus = cpu_map__read(file);
436         fclose(file);
437         return cpus;
438 }
439
440 struct perf_event_attr * __weak
441 perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused)
442 {
443         return NULL;
444 }
445
446 static struct perf_pmu *pmu_lookup(const char *name)
447 {
448         struct perf_pmu *pmu;
449         LIST_HEAD(format);
450         LIST_HEAD(aliases);
451         __u32 type;
452
453         /* No support for intel_bts or intel_pt so disallow them */
454         if (!strcmp(name, "intel_bts") || !strcmp(name, "intel_pt"))
455                 return NULL;
456
457         /*
458          * The pmu data we store & need consists of the pmu
459          * type value and format definitions. Load both right
460          * now.
461          */
462         if (pmu_format(name, &format))
463                 return NULL;
464
465         if (pmu_aliases(name, &aliases))
466                 return NULL;
467
468         if (pmu_type(name, &type))
469                 return NULL;
470
471         pmu = zalloc(sizeof(*pmu));
472         if (!pmu)
473                 return NULL;
474
475         pmu->cpus = pmu_cpumask(name);
476
477         INIT_LIST_HEAD(&pmu->format);
478         INIT_LIST_HEAD(&pmu->aliases);
479         list_splice(&format, &pmu->format);
480         list_splice(&aliases, &pmu->aliases);
481         pmu->name = strdup(name);
482         pmu->type = type;
483         list_add_tail(&pmu->list, &pmus);
484
485         pmu->default_config = perf_pmu__get_default_config(pmu);
486
487         return pmu;
488 }
489
490 static struct perf_pmu *pmu_find(const char *name)
491 {
492         struct perf_pmu *pmu;
493
494         list_for_each_entry(pmu, &pmus, list)
495                 if (!strcmp(pmu->name, name))
496                         return pmu;
497
498         return NULL;
499 }
500
501 struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu)
502 {
503         /*
504          * pmu iterator: If pmu is NULL, we start at the begin,
505          * otherwise return the next pmu. Returns NULL on end.
506          */
507         if (!pmu) {
508                 pmu_read_sysfs();
509                 pmu = list_prepare_entry(pmu, &pmus, list);
510         }
511         list_for_each_entry_continue(pmu, &pmus, list)
512                 return pmu;
513         return NULL;
514 }
515
516 struct perf_pmu *perf_pmu__find(const char *name)
517 {
518         struct perf_pmu *pmu;
519
520         /*
521          * Once PMU is loaded it stays in the list,
522          * so we keep us from multiple reading/parsing
523          * the pmu format definitions.
524          */
525         pmu = pmu_find(name);
526         if (pmu)
527                 return pmu;
528
529         return pmu_lookup(name);
530 }
531
532 static struct perf_pmu_format *
533 pmu_find_format(struct list_head *formats, char *name)
534 {
535         struct perf_pmu_format *format;
536
537         list_for_each_entry(format, formats, list)
538                 if (!strcmp(format->name, name))
539                         return format;
540
541         return NULL;
542 }
543
544 /*
545  * Sets value based on the format definition (format parameter)
546  * and unformated value (value parameter).
547  */
548 static void pmu_format_value(unsigned long *format, __u64 value, __u64 *v,
549                              bool zero)
550 {
551         unsigned long fbit, vbit;
552
553         for (fbit = 0, vbit = 0; fbit < PERF_PMU_FORMAT_BITS; fbit++) {
554
555                 if (!test_bit(fbit, format))
556                         continue;
557
558                 if (value & (1llu << vbit++))
559                         *v |= (1llu << fbit);
560                 else if (zero)
561                         *v &= ~(1llu << fbit);
562         }
563 }
564
565 /*
566  * Term is a string term, and might be a param-term. Try to look up it's value
567  * in the remaining terms.
568  * - We have a term like "base-or-format-term=param-term",
569  * - We need to find the value supplied for "param-term" (with param-term named
570  *   in a config string) later on in the term list.
571  */
572 static int pmu_resolve_param_term(struct parse_events_term *term,
573                                   struct list_head *head_terms,
574                                   __u64 *value)
575 {
576         struct parse_events_term *t;
577
578         list_for_each_entry(t, head_terms, list) {
579                 if (t->type_val == PARSE_EVENTS__TERM_TYPE_NUM) {
580                         if (!strcmp(t->config, term->config)) {
581                                 t->used = true;
582                                 *value = t->val.num;
583                                 return 0;
584                         }
585                 }
586         }
587
588         if (verbose)
589                 printf("Required parameter '%s' not specified\n", term->config);
590
591         return -1;
592 }
593
594 static char *formats_error_string(struct list_head *formats)
595 {
596         struct perf_pmu_format *format;
597         char *err, *str;
598         static const char *static_terms = "config,config1,config2,name,period,branch_type\n";
599         unsigned i = 0;
600
601         if (!asprintf(&str, "valid terms:"))
602                 return NULL;
603
604         /* sysfs exported terms */
605         list_for_each_entry(format, formats, list) {
606                 char c = i++ ? ',' : ' ';
607
608                 err = str;
609                 if (!asprintf(&str, "%s%c%s", err, c, format->name))
610                         goto fail;
611                 free(err);
612         }
613
614         /* static terms */
615         err = str;
616         if (!asprintf(&str, "%s,%s", err, static_terms))
617                 goto fail;
618
619         free(err);
620         return str;
621 fail:
622         free(err);
623         return NULL;
624 }
625
626 /*
627  * Setup one of config[12] attr members based on the
628  * user input data - term parameter.
629  */
630 static int pmu_config_term(struct list_head *formats,
631                            struct perf_event_attr *attr,
632                            struct parse_events_term *term,
633                            struct list_head *head_terms,
634                            bool zero, struct parse_events_error *err)
635 {
636         struct perf_pmu_format *format;
637         __u64 *vp;
638         __u64 val;
639
640         /*
641          * If this is a parameter we've already used for parameterized-eval,
642          * skip it in normal eval.
643          */
644         if (term->used)
645                 return 0;
646
647         /*
648          * Hardcoded terms should be already in, so nothing
649          * to be done for them.
650          */
651         if (parse_events__is_hardcoded_term(term))
652                 return 0;
653
654         format = pmu_find_format(formats, term->config);
655         if (!format) {
656                 if (verbose)
657                         printf("Invalid event/parameter '%s'\n", term->config);
658                 if (err) {
659                         err->idx  = term->err_term;
660                         err->str  = strdup("unknown term");
661                         err->help = formats_error_string(formats);
662                 }
663                 return -EINVAL;
664         }
665
666         switch (format->value) {
667         case PERF_PMU_FORMAT_VALUE_CONFIG:
668                 vp = &attr->config;
669                 break;
670         case PERF_PMU_FORMAT_VALUE_CONFIG1:
671                 vp = &attr->config1;
672                 break;
673         case PERF_PMU_FORMAT_VALUE_CONFIG2:
674                 vp = &attr->config2;
675                 break;
676         default:
677                 return -EINVAL;
678         }
679
680         /*
681          * Either directly use a numeric term, or try to translate string terms
682          * using event parameters.
683          */
684         if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
685                 val = term->val.num;
686         else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) {
687                 if (strcmp(term->val.str, "?")) {
688                         if (verbose) {
689                                 pr_info("Invalid sysfs entry %s=%s\n",
690                                                 term->config, term->val.str);
691                         }
692                         if (err) {
693                                 err->idx = term->err_val;
694                                 err->str = strdup("expected numeric value");
695                         }
696                         return -EINVAL;
697                 }
698
699                 if (pmu_resolve_param_term(term, head_terms, &val))
700                         return -EINVAL;
701         } else
702                 return -EINVAL;
703
704         pmu_format_value(format->bits, val, vp, zero);
705         return 0;
706 }
707
708 int perf_pmu__config_terms(struct list_head *formats,
709                            struct perf_event_attr *attr,
710                            struct list_head *head_terms,
711                            bool zero, struct parse_events_error *err)
712 {
713         struct parse_events_term *term;
714
715         list_for_each_entry(term, head_terms, list) {
716                 if (pmu_config_term(formats, attr, term, head_terms,
717                                     zero, err))
718                         return -EINVAL;
719         }
720
721         return 0;
722 }
723
724 /*
725  * Configures event's 'attr' parameter based on the:
726  * 1) users input - specified in terms parameter
727  * 2) pmu format definitions - specified by pmu parameter
728  */
729 int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr,
730                      struct list_head *head_terms,
731                      struct parse_events_error *err)
732 {
733         bool zero = !!pmu->default_config;
734
735         attr->type = pmu->type;
736         return perf_pmu__config_terms(&pmu->format, attr, head_terms,
737                                       zero, err);
738 }
739
740 static struct perf_pmu_alias *pmu_find_alias(struct perf_pmu *pmu,
741                                              struct parse_events_term *term)
742 {
743         struct perf_pmu_alias *alias;
744         char *name;
745
746         if (parse_events__is_hardcoded_term(term))
747                 return NULL;
748
749         if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) {
750                 if (term->val.num != 1)
751                         return NULL;
752                 if (pmu_find_format(&pmu->format, term->config))
753                         return NULL;
754                 name = term->config;
755         } else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) {
756                 if (strcasecmp(term->config, "event"))
757                         return NULL;
758                 name = term->val.str;
759         } else {
760                 return NULL;
761         }
762
763         list_for_each_entry(alias, &pmu->aliases, list) {
764                 if (!strcasecmp(alias->name, name))
765                         return alias;
766         }
767         return NULL;
768 }
769
770
771 static int check_info_data(struct perf_pmu_alias *alias,
772                            struct perf_pmu_info *info)
773 {
774         /*
775          * Only one term in event definition can
776          * define unit, scale and snapshot, fail
777          * if there's more than one.
778          */
779         if ((info->unit && alias->unit) ||
780             (info->scale && alias->scale) ||
781             (info->snapshot && alias->snapshot))
782                 return -EINVAL;
783
784         if (alias->unit)
785                 info->unit = alias->unit;
786
787         if (alias->scale)
788                 info->scale = alias->scale;
789
790         if (alias->snapshot)
791                 info->snapshot = alias->snapshot;
792
793         return 0;
794 }
795
796 /*
797  * Find alias in the terms list and replace it with the terms
798  * defined for the alias
799  */
800 int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms,
801                           struct perf_pmu_info *info)
802 {
803         struct parse_events_term *term, *h;
804         struct perf_pmu_alias *alias;
805         int ret;
806
807         info->per_pkg = false;
808
809         /*
810          * Mark unit and scale as not set
811          * (different from default values, see below)
812          */
813         info->unit     = NULL;
814         info->scale    = 0.0;
815         info->snapshot = false;
816
817         list_for_each_entry_safe(term, h, head_terms, list) {
818                 alias = pmu_find_alias(pmu, term);
819                 if (!alias)
820                         continue;
821                 ret = pmu_alias_terms(alias, &term->list);
822                 if (ret)
823                         return ret;
824
825                 ret = check_info_data(alias, info);
826                 if (ret)
827                         return ret;
828
829                 if (alias->per_pkg)
830                         info->per_pkg = true;
831
832                 list_del(&term->list);
833                 free(term);
834         }
835
836         /*
837          * if no unit or scale foundin aliases, then
838          * set defaults as for evsel
839          * unit cannot left to NULL
840          */
841         if (info->unit == NULL)
842                 info->unit   = "";
843
844         if (info->scale == 0.0)
845                 info->scale  = 1.0;
846
847         return 0;
848 }
849
850 int perf_pmu__new_format(struct list_head *list, char *name,
851                          int config, unsigned long *bits)
852 {
853         struct perf_pmu_format *format;
854
855         format = zalloc(sizeof(*format));
856         if (!format)
857                 return -ENOMEM;
858
859         format->name = strdup(name);
860         format->value = config;
861         memcpy(format->bits, bits, sizeof(format->bits));
862
863         list_add_tail(&format->list, list);
864         return 0;
865 }
866
867 void perf_pmu__set_format(unsigned long *bits, long from, long to)
868 {
869         long b;
870
871         if (!to)
872                 to = from;
873
874         memset(bits, 0, BITS_TO_BYTES(PERF_PMU_FORMAT_BITS));
875         for (b = from; b <= to; b++)
876                 set_bit(b, bits);
877 }
878
879 static int sub_non_neg(int a, int b)
880 {
881         if (b > a)
882                 return 0;
883         return a - b;
884 }
885
886 static char *format_alias(char *buf, int len, struct perf_pmu *pmu,
887                           struct perf_pmu_alias *alias)
888 {
889         struct parse_events_term *term;
890         int used = snprintf(buf, len, "%s/%s", pmu->name, alias->name);
891
892         list_for_each_entry(term, &alias->terms, list) {
893                 if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR)
894                         used += snprintf(buf + used, sub_non_neg(len, used),
895                                         ",%s=%s", term->config,
896                                         term->val.str);
897         }
898
899         if (sub_non_neg(len, used) > 0) {
900                 buf[used] = '/';
901                 used++;
902         }
903         if (sub_non_neg(len, used) > 0) {
904                 buf[used] = '\0';
905                 used++;
906         } else
907                 buf[len - 1] = '\0';
908
909         return buf;
910 }
911
912 static char *format_alias_or(char *buf, int len, struct perf_pmu *pmu,
913                              struct perf_pmu_alias *alias)
914 {
915         snprintf(buf, len, "%s OR %s/%s/", alias->name, pmu->name, alias->name);
916         return buf;
917 }
918
919 static int cmp_string(const void *a, const void *b)
920 {
921         const char * const *as = a;
922         const char * const *bs = b;
923         return strcmp(*as, *bs);
924 }
925
926 void print_pmu_events(const char *event_glob, bool name_only)
927 {
928         struct perf_pmu *pmu;
929         struct perf_pmu_alias *alias;
930         char buf[1024];
931         int printed = 0;
932         int len, j;
933         char **aliases;
934
935         pmu = NULL;
936         len = 0;
937         while ((pmu = perf_pmu__scan(pmu)) != NULL) {
938                 list_for_each_entry(alias, &pmu->aliases, list)
939                         len++;
940                 if (pmu->selectable)
941                         len++;
942         }
943         aliases = zalloc(sizeof(char *) * len);
944         if (!aliases)
945                 goto out_enomem;
946         pmu = NULL;
947         j = 0;
948         while ((pmu = perf_pmu__scan(pmu)) != NULL) {
949                 list_for_each_entry(alias, &pmu->aliases, list) {
950                         char *name = format_alias(buf, sizeof(buf), pmu, alias);
951                         bool is_cpu = !strcmp(pmu->name, "cpu");
952
953                         if (event_glob != NULL &&
954                             !(strglobmatch(name, event_glob) ||
955                               (!is_cpu && strglobmatch(alias->name,
956                                                        event_glob))))
957                                 continue;
958
959                         if (is_cpu && !name_only)
960                                 name = format_alias_or(buf, sizeof(buf), pmu, alias);
961
962                         aliases[j] = strdup(name);
963                         if (aliases[j] == NULL)
964                                 goto out_enomem;
965                         j++;
966                 }
967                 if (pmu->selectable) {
968                         char *s;
969                         if (asprintf(&s, "%s//", pmu->name) < 0)
970                                 goto out_enomem;
971                         aliases[j] = s;
972                         j++;
973                 }
974         }
975         len = j;
976         qsort(aliases, len, sizeof(char *), cmp_string);
977         for (j = 0; j < len; j++) {
978                 if (name_only) {
979                         printf("%s ", aliases[j]);
980                         continue;
981                 }
982                 printf("  %-50s [Kernel PMU event]\n", aliases[j]);
983                 printed++;
984         }
985         if (printed)
986                 printf("\n");
987 out_free:
988         for (j = 0; j < len; j++)
989                 zfree(&aliases[j]);
990         zfree(&aliases);
991         return;
992
993 out_enomem:
994         printf("FATAL: not enough memory to print PMU events\n");
995         if (aliases)
996                 goto out_free;
997 }
998
999 bool pmu_have_event(const char *pname, const char *name)
1000 {
1001         struct perf_pmu *pmu;
1002         struct perf_pmu_alias *alias;
1003
1004         pmu = NULL;
1005         while ((pmu = perf_pmu__scan(pmu)) != NULL) {
1006                 if (strcmp(pname, pmu->name))
1007                         continue;
1008                 list_for_each_entry(alias, &pmu->aliases, list)
1009                         if (!strcmp(alias->name, name))
1010                                 return true;
1011         }
1012         return false;
1013 }
1014
1015 static FILE *perf_pmu__open_file(struct perf_pmu *pmu, const char *name)
1016 {
1017         struct stat st;
1018         char path[PATH_MAX];
1019         const char *sysfs;
1020
1021         sysfs = sysfs__mountpoint();
1022         if (!sysfs)
1023                 return NULL;
1024
1025         snprintf(path, PATH_MAX,
1026                  "%s" EVENT_SOURCE_DEVICE_PATH "%s/%s", sysfs, pmu->name, name);
1027
1028         if (stat(path, &st) < 0)
1029                 return NULL;
1030
1031         return fopen(path, "r");
1032 }
1033
1034 int perf_pmu__scan_file(struct perf_pmu *pmu, const char *name, const char *fmt,
1035                         ...)
1036 {
1037         va_list args;
1038         FILE *file;
1039         int ret = EOF;
1040
1041         va_start(args, fmt);
1042         file = perf_pmu__open_file(pmu, name);
1043         if (file) {
1044                 ret = vfscanf(file, fmt, args);
1045                 fclose(file);
1046         }
1047         va_end(args);
1048         return ret;
1049 }