diff options
Diffstat (limited to 'tools/perf/util/parse-events.c')
-rw-r--r-- | tools/perf/util/parse-events.c | 48 |
1 files changed, 29 insertions, 19 deletions
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index e5bc0fb016b2..05d0c5c2030c 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
@@ -450,7 +450,8 @@ parse_single_tracepoint_event(char *sys_name, | |||
450 | /* sys + ':' + event + ':' + flags*/ | 450 | /* sys + ':' + event + ':' + flags*/ |
451 | #define MAX_EVOPT_LEN (MAX_EVENT_LENGTH * 2 + 2 + 128) | 451 | #define MAX_EVOPT_LEN (MAX_EVENT_LENGTH * 2 + 2 + 128) |
452 | static enum event_result | 452 | static enum event_result |
453 | parse_subsystem_tracepoint_event(char *sys_name, char *flags) | 453 | parse_multiple_tracepoint_event(char *sys_name, const char *evt_exp, |
454 | char *flags) | ||
454 | { | 455 | { |
455 | char evt_path[MAXPATHLEN]; | 456 | char evt_path[MAXPATHLEN]; |
456 | struct dirent *evt_ent; | 457 | struct dirent *evt_ent; |
@@ -474,6 +475,9 @@ parse_subsystem_tracepoint_event(char *sys_name, char *flags) | |||
474 | || !strcmp(evt_ent->d_name, "filter")) | 475 | || !strcmp(evt_ent->d_name, "filter")) |
475 | continue; | 476 | continue; |
476 | 477 | ||
478 | if (!strglobmatch(evt_ent->d_name, evt_exp)) | ||
479 | continue; | ||
480 | |||
477 | len = snprintf(event_opt, MAX_EVOPT_LEN, "%s:%s%s%s", sys_name, | 481 | len = snprintf(event_opt, MAX_EVOPT_LEN, "%s:%s%s%s", sys_name, |
478 | evt_ent->d_name, flags ? ":" : "", | 482 | evt_ent->d_name, flags ? ":" : "", |
479 | flags ?: ""); | 483 | flags ?: ""); |
@@ -522,9 +526,10 @@ static enum event_result parse_tracepoint_event(const char **strp, | |||
522 | if (evt_length >= MAX_EVENT_LENGTH) | 526 | if (evt_length >= MAX_EVENT_LENGTH) |
523 | return EVT_FAILED; | 527 | return EVT_FAILED; |
524 | 528 | ||
525 | if (!strcmp(evt_name, "*")) { | 529 | if (strpbrk(evt_name, "*?")) { |
526 | *strp = evt_name + evt_length; | 530 | *strp = evt_name + evt_length; |
527 | return parse_subsystem_tracepoint_event(sys_name, flags); | 531 | return parse_multiple_tracepoint_event(sys_name, evt_name, |
532 | flags); | ||
528 | } else | 533 | } else |
529 | return parse_single_tracepoint_event(sys_name, evt_name, | 534 | return parse_single_tracepoint_event(sys_name, evt_name, |
530 | evt_length, flags, | 535 | evt_length, flags, |
@@ -753,11 +758,11 @@ modifier: | |||
753 | return ret; | 758 | return ret; |
754 | } | 759 | } |
755 | 760 | ||
756 | static void store_event_type(const char *orgname) | 761 | static int store_event_type(const char *orgname) |
757 | { | 762 | { |
758 | char filename[PATH_MAX], *c; | 763 | char filename[PATH_MAX], *c; |
759 | FILE *file; | 764 | FILE *file; |
760 | int id; | 765 | int id, n; |
761 | 766 | ||
762 | sprintf(filename, "%s/", debugfs_path); | 767 | sprintf(filename, "%s/", debugfs_path); |
763 | strncat(filename, orgname, strlen(orgname)); | 768 | strncat(filename, orgname, strlen(orgname)); |
@@ -769,11 +774,14 @@ static void store_event_type(const char *orgname) | |||
769 | 774 | ||
770 | file = fopen(filename, "r"); | 775 | file = fopen(filename, "r"); |
771 | if (!file) | 776 | if (!file) |
772 | return; | 777 | return 0; |
773 | if (fscanf(file, "%i", &id) < 1) | 778 | n = fscanf(file, "%i", &id); |
774 | die("cannot store event ID"); | ||
775 | fclose(file); | 779 | fclose(file); |
776 | perf_header__push_event(id, orgname); | 780 | if (n < 1) { |
781 | pr_err("cannot store event ID\n"); | ||
782 | return -EINVAL; | ||
783 | } | ||
784 | return perf_header__push_event(id, orgname); | ||
777 | } | 785 | } |
778 | 786 | ||
779 | int parse_events(const struct option *opt __used, const char *str, int unset __used) | 787 | int parse_events(const struct option *opt __used, const char *str, int unset __used) |
@@ -782,7 +790,8 @@ int parse_events(const struct option *opt __used, const char *str, int unset __u | |||
782 | enum event_result ret; | 790 | enum event_result ret; |
783 | 791 | ||
784 | if (strchr(str, ':')) | 792 | if (strchr(str, ':')) |
785 | store_event_type(str); | 793 | if (store_event_type(str) < 0) |
794 | return -1; | ||
786 | 795 | ||
787 | for (;;) { | 796 | for (;;) { |
788 | if (nr_counters == MAX_COUNTERS) | 797 | if (nr_counters == MAX_COUNTERS) |
@@ -835,11 +844,12 @@ int parse_filter(const struct option *opt __used, const char *str, | |||
835 | } | 844 | } |
836 | 845 | ||
837 | static const char * const event_type_descriptors[] = { | 846 | static const char * const event_type_descriptors[] = { |
838 | "", | ||
839 | "Hardware event", | 847 | "Hardware event", |
840 | "Software event", | 848 | "Software event", |
841 | "Tracepoint event", | 849 | "Tracepoint event", |
842 | "Hardware cache event", | 850 | "Hardware cache event", |
851 | "Raw hardware event descriptor", | ||
852 | "Hardware breakpoint", | ||
843 | }; | 853 | }; |
844 | 854 | ||
845 | /* | 855 | /* |
@@ -872,7 +882,7 @@ static void print_tracepoint_events(void) | |||
872 | snprintf(evt_path, MAXPATHLEN, "%s:%s", | 882 | snprintf(evt_path, MAXPATHLEN, "%s:%s", |
873 | sys_dirent.d_name, evt_dirent.d_name); | 883 | sys_dirent.d_name, evt_dirent.d_name); |
874 | printf(" %-42s [%s]\n", evt_path, | 884 | printf(" %-42s [%s]\n", evt_path, |
875 | event_type_descriptors[PERF_TYPE_TRACEPOINT+1]); | 885 | event_type_descriptors[PERF_TYPE_TRACEPOINT]); |
876 | } | 886 | } |
877 | closedir(evt_dir); | 887 | closedir(evt_dir); |
878 | } | 888 | } |
@@ -892,9 +902,7 @@ void print_events(void) | |||
892 | printf("List of pre-defined events (to be used in -e):\n"); | 902 | printf("List of pre-defined events (to be used in -e):\n"); |
893 | 903 | ||
894 | for (i = 0; i < ARRAY_SIZE(event_symbols); i++, syms++) { | 904 | for (i = 0; i < ARRAY_SIZE(event_symbols); i++, syms++) { |
895 | type = syms->type + 1; | 905 | type = syms->type; |
896 | if (type >= ARRAY_SIZE(event_type_descriptors)) | ||
897 | type = 0; | ||
898 | 906 | ||
899 | if (type != prev_type) | 907 | if (type != prev_type) |
900 | printf("\n"); | 908 | printf("\n"); |
@@ -919,17 +927,19 @@ void print_events(void) | |||
919 | for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) { | 927 | for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) { |
920 | printf(" %-42s [%s]\n", | 928 | printf(" %-42s [%s]\n", |
921 | event_cache_name(type, op, i), | 929 | event_cache_name(type, op, i), |
922 | event_type_descriptors[4]); | 930 | event_type_descriptors[PERF_TYPE_HW_CACHE]); |
923 | } | 931 | } |
924 | } | 932 | } |
925 | } | 933 | } |
926 | 934 | ||
927 | printf("\n"); | 935 | printf("\n"); |
928 | printf(" %-42s [raw hardware event descriptor]\n", | 936 | printf(" %-42s [%s]\n", |
929 | "rNNN"); | 937 | "rNNN", event_type_descriptors[PERF_TYPE_RAW]); |
930 | printf("\n"); | 938 | printf("\n"); |
931 | 939 | ||
932 | printf(" %-42s [hardware breakpoint]\n", "mem:<addr>[:access]"); | 940 | printf(" %-42s [%s]\n", |
941 | "mem:<addr>[:access]", | ||
942 | event_type_descriptors[PERF_TYPE_BREAKPOINT]); | ||
933 | printf("\n"); | 943 | printf("\n"); |
934 | 944 | ||
935 | print_tracepoint_events(); | 945 | print_tracepoint_events(); |