1 // SPDX-License-Identifier: GPL-2.0
2 #include <stdio.h>
3 #include "pmu.h"
4 #include "pmu-hybrid.h"
5 #include "topdown.h"
6
topdown_filter_events(const char ** attr,char ** str,bool use_group,const char * pmu_name)7 int topdown_filter_events(const char **attr, char **str, bool use_group,
8 const char *pmu_name)
9 {
10 int off = 0;
11 int i;
12 int len = 0;
13 char *s;
14 bool is_hybrid = perf_pmu__is_hybrid(pmu_name);
15
16 for (i = 0; attr[i]; i++) {
17 if (pmu_have_event(pmu_name, attr[i])) {
18 if (is_hybrid)
19 len += strlen(attr[i]) + strlen(pmu_name) + 3;
20 else
21 len += strlen(attr[i]) + 1;
22 attr[i - off] = attr[i];
23 } else
24 off++;
25 }
26 attr[i - off] = NULL;
27
28 *str = malloc(len + 1 + 2);
29 if (!*str)
30 return -1;
31 s = *str;
32 if (i - off == 0) {
33 *s = 0;
34 return 0;
35 }
36 if (use_group)
37 *s++ = '{';
38 for (i = 0; attr[i]; i++) {
39 if (!is_hybrid)
40 strcpy(s, attr[i]);
41 else
42 sprintf(s, "%s/%s/", pmu_name, attr[i]);
43 s += strlen(s);
44 *s++ = ',';
45 }
46 if (use_group) {
47 s[-1] = '}';
48 *s = 0;
49 } else
50 s[-1] = 0;
51 return 0;
52 }
53
arch_topdown_check_group(bool * warn)54 __weak bool arch_topdown_check_group(bool *warn)
55 {
56 *warn = false;
57 return false;
58 }
59
arch_topdown_group_warn(void)60 __weak void arch_topdown_group_warn(void)
61 {
62 }
63
arch_topdown_sample_read(struct evsel * leader __maybe_unused)64 __weak bool arch_topdown_sample_read(struct evsel *leader __maybe_unused)
65 {
66 return false;
67 }
68
arch_get_topdown_pmu_name(struct evlist * evlist __maybe_unused,bool warn __maybe_unused)69 __weak const char *arch_get_topdown_pmu_name(struct evlist *evlist
70 __maybe_unused,
71 bool warn __maybe_unused)
72 {
73 return "cpu";
74 }
75