]> Git Repo - J-linux.git/blob - tools/perf/tests/parse-events.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / tools / perf / tests / parse-events.c
1 // SPDX-License-Identifier: GPL-2.0
2 #include "parse-events.h"
3 #include "evsel.h"
4 #include "evlist.h"
5 #include <api/fs/fs.h>
6 #include "tests.h"
7 #include "debug.h"
8 #include "pmu.h"
9 #include "pmus.h"
10 #include <dirent.h>
11 #include <errno.h>
12 #include "fncache.h"
13 #include <sys/types.h>
14 #include <sys/stat.h>
15 #include <unistd.h>
16 #include <linux/kernel.h>
17 #include <linux/hw_breakpoint.h>
18 #include <api/fs/tracing_path.h>
19
20 #define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \
21                              PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
22
23 static int num_core_entries(void)
24 {
25         /*
26          * If the kernel supports extended type, expect events to be
27          * opened once for each core PMU type. Otherwise fall back to the legacy
28          * behavior of opening only one event even though there are multiple
29          * PMUs
30          */
31         if (perf_pmus__supports_extended_type())
32                 return perf_pmus__num_core_pmus();
33
34         return 1;
35 }
36
37 static bool test_config(const struct evsel *evsel, __u64 expected_config)
38 {
39         __u32 type = evsel->core.attr.type;
40         __u64 config = evsel->core.attr.config;
41
42         if (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE) {
43                 /*
44                  * HARDWARE and HW_CACHE events encode the PMU's extended type
45                  * in the top 32-bits. Mask in order to ignore.
46                  */
47                 config &= PERF_HW_EVENT_MASK;
48         }
49         return config == expected_config;
50 }
51
52 static bool test_perf_config(const struct perf_evsel *evsel, __u64 expected_config)
53 {
54         return (evsel->attr.config & PERF_HW_EVENT_MASK) == expected_config;
55 }
56
57 #ifdef HAVE_LIBTRACEEVENT
58
59 #if defined(__s390x__)
60 /* Return true if kvm module is available and loaded. Test this
61  * and return success when trace point kvm_s390_create_vm
62  * exists. Otherwise this test always fails.
63  */
64 static bool kvm_s390_create_vm_valid(void)
65 {
66         char *eventfile;
67         bool rc = false;
68
69         eventfile = get_events_file("kvm-s390");
70
71         if (eventfile) {
72                 DIR *mydir = opendir(eventfile);
73
74                 if (mydir) {
75                         rc = true;
76                         closedir(mydir);
77                 }
78                 put_events_file(eventfile);
79         }
80
81         return rc;
82 }
83 #endif
84
85 static int test__checkevent_tracepoint(struct evlist *evlist)
86 {
87         struct evsel *evsel = evlist__first(evlist);
88
89         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
90         TEST_ASSERT_VAL("wrong number of groups", 0 == evlist__nr_groups(evlist));
91         TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->core.attr.type);
92         TEST_ASSERT_VAL("wrong sample_type",
93                 PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type);
94         TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->core.attr.sample_period);
95         return TEST_OK;
96 }
97
98 static int test__checkevent_tracepoint_multi(struct evlist *evlist)
99 {
100         struct evsel *evsel;
101
102         TEST_ASSERT_VAL("wrong number of entries", evlist->core.nr_entries > 1);
103         TEST_ASSERT_VAL("wrong number of groups", 0 == evlist__nr_groups(evlist));
104
105         evlist__for_each_entry(evlist, evsel) {
106                 TEST_ASSERT_VAL("wrong type",
107                         PERF_TYPE_TRACEPOINT == evsel->core.attr.type);
108                 TEST_ASSERT_VAL("wrong sample_type",
109                         PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type);
110                 TEST_ASSERT_VAL("wrong sample_period",
111                         1 == evsel->core.attr.sample_period);
112         }
113         return TEST_OK;
114 }
115 #endif /* HAVE_LIBTRACEEVENT */
116
117 static int test__checkevent_raw(struct evlist *evlist)
118 {
119         struct perf_evsel *evsel;
120         bool raw_type_match = false;
121
122         TEST_ASSERT_VAL("wrong number of entries", 0 != evlist->core.nr_entries);
123
124         perf_evlist__for_each_evsel(&evlist->core, evsel) {
125                 struct perf_pmu *pmu __maybe_unused = NULL;
126                 bool type_matched = false;
127
128                 TEST_ASSERT_VAL("wrong config", test_perf_config(evsel, 0x1a));
129                 TEST_ASSERT_VAL("event not parsed as raw type",
130                                 evsel->attr.type == PERF_TYPE_RAW);
131 #if defined(__aarch64__)
132                 /*
133                  * Arm doesn't have a real raw type PMU in sysfs, so raw events
134                  * would never match any PMU. However, RAW events on Arm will
135                  * always successfully open on the first available core PMU
136                  * so no need to test for a matching type here.
137                  */
138                 type_matched = raw_type_match = true;
139 #else
140                 while ((pmu = perf_pmus__scan(pmu)) != NULL) {
141                         if (pmu->type == evsel->attr.type) {
142                                 TEST_ASSERT_VAL("PMU type expected once", !type_matched);
143                                 type_matched = true;
144                                 if (pmu->type == PERF_TYPE_RAW)
145                                         raw_type_match = true;
146                         }
147                 }
148 #endif
149                 TEST_ASSERT_VAL("No PMU found for type", type_matched);
150         }
151         TEST_ASSERT_VAL("Raw PMU not matched", raw_type_match);
152         return TEST_OK;
153 }
154
155 static int test__checkevent_numeric(struct evlist *evlist)
156 {
157         struct evsel *evsel = evlist__first(evlist);
158
159         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
160         TEST_ASSERT_VAL("wrong type", 1 == evsel->core.attr.type);
161         TEST_ASSERT_VAL("wrong config", test_config(evsel, 1));
162         return TEST_OK;
163 }
164
165
166 static int assert_hw(struct perf_evsel *evsel, enum perf_hw_id id, const char *name)
167 {
168         struct perf_pmu *pmu;
169
170         if (evsel->attr.type == PERF_TYPE_HARDWARE) {
171                 TEST_ASSERT_VAL("wrong config", test_perf_config(evsel, id));
172                 return 0;
173         }
174         pmu = perf_pmus__find_by_type(evsel->attr.type);
175
176         TEST_ASSERT_VAL("unexpected PMU type", pmu);
177         TEST_ASSERT_VAL("PMU missing event", perf_pmu__have_event(pmu, name));
178         return 0;
179 }
180
181 static int test__checkevent_symbolic_name(struct evlist *evlist)
182 {
183         struct perf_evsel *evsel;
184
185         TEST_ASSERT_VAL("wrong number of entries", 0 != evlist->core.nr_entries);
186
187         perf_evlist__for_each_evsel(&evlist->core, evsel) {
188                 int ret = assert_hw(evsel, PERF_COUNT_HW_INSTRUCTIONS, "instructions");
189
190                 if (ret)
191                         return ret;
192         }
193
194         return TEST_OK;
195 }
196
197 static int test__checkevent_symbolic_name_config(struct evlist *evlist)
198 {
199         struct perf_evsel *evsel;
200
201         TEST_ASSERT_VAL("wrong number of entries", 0 != evlist->core.nr_entries);
202
203         perf_evlist__for_each_evsel(&evlist->core, evsel) {
204                 int ret = assert_hw(evsel, PERF_COUNT_HW_CPU_CYCLES, "cycles");
205
206                 if (ret)
207                         return ret;
208                 /*
209                  * The period value gets configured within evlist__config,
210                  * while this test executes only parse events method.
211                  */
212                 TEST_ASSERT_VAL("wrong period", 0 == evsel->attr.sample_period);
213                 TEST_ASSERT_VAL("wrong config1", 0 == evsel->attr.config1);
214                 TEST_ASSERT_VAL("wrong config2", 1 == evsel->attr.config2);
215         }
216         return TEST_OK;
217 }
218
219 static int test__checkevent_symbolic_alias(struct evlist *evlist)
220 {
221         struct evsel *evsel = evlist__first(evlist);
222
223         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
224         TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
225         TEST_ASSERT_VAL("wrong config", test_config(evsel, PERF_COUNT_SW_PAGE_FAULTS));
226         return TEST_OK;
227 }
228
229 static int test__checkevent_genhw(struct evlist *evlist)
230 {
231         struct perf_evsel *evsel;
232
233         TEST_ASSERT_VAL("wrong number of entries", 0 != evlist->core.nr_entries);
234
235         perf_evlist__for_each_entry(&evlist->core, evsel) {
236                 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->attr.type);
237                 TEST_ASSERT_VAL("wrong config", test_perf_config(evsel, 1 << 16));
238         }
239         return TEST_OK;
240 }
241
242 static int test__checkevent_breakpoint(struct evlist *evlist)
243 {
244         struct evsel *evsel = evlist__first(evlist);
245
246         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
247         TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
248         TEST_ASSERT_VAL("wrong config", test_config(evsel, 0));
249         TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
250                                          evsel->core.attr.bp_type);
251         TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_4 ==
252                                         evsel->core.attr.bp_len);
253         return TEST_OK;
254 }
255
256 static int test__checkevent_breakpoint_x(struct evlist *evlist)
257 {
258         struct evsel *evsel = evlist__first(evlist);
259
260         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
261         TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
262         TEST_ASSERT_VAL("wrong config", test_config(evsel, 0));
263         TEST_ASSERT_VAL("wrong bp_type",
264                         HW_BREAKPOINT_X == evsel->core.attr.bp_type);
265         TEST_ASSERT_VAL("wrong bp_len", default_breakpoint_len() == evsel->core.attr.bp_len);
266         return TEST_OK;
267 }
268
269 static int test__checkevent_breakpoint_r(struct evlist *evlist)
270 {
271         struct evsel *evsel = evlist__first(evlist);
272
273         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
274         TEST_ASSERT_VAL("wrong type",
275                         PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
276         TEST_ASSERT_VAL("wrong config", test_config(evsel, 0));
277         TEST_ASSERT_VAL("wrong bp_type",
278                         HW_BREAKPOINT_R == evsel->core.attr.bp_type);
279         TEST_ASSERT_VAL("wrong bp_len",
280                         HW_BREAKPOINT_LEN_4 == evsel->core.attr.bp_len);
281         return TEST_OK;
282 }
283
284 static int test__checkevent_breakpoint_w(struct evlist *evlist)
285 {
286         struct evsel *evsel = evlist__first(evlist);
287
288         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
289         TEST_ASSERT_VAL("wrong type",
290                         PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
291         TEST_ASSERT_VAL("wrong config", test_config(evsel, 0));
292         TEST_ASSERT_VAL("wrong bp_type",
293                         HW_BREAKPOINT_W == evsel->core.attr.bp_type);
294         TEST_ASSERT_VAL("wrong bp_len",
295                         HW_BREAKPOINT_LEN_4 == evsel->core.attr.bp_len);
296         return TEST_OK;
297 }
298
299 static int test__checkevent_breakpoint_rw(struct evlist *evlist)
300 {
301         struct evsel *evsel = evlist__first(evlist);
302
303         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
304         TEST_ASSERT_VAL("wrong type",
305                         PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
306         TEST_ASSERT_VAL("wrong config", test_config(evsel, 0));
307         TEST_ASSERT_VAL("wrong bp_type",
308                 (HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->core.attr.bp_type);
309         TEST_ASSERT_VAL("wrong bp_len",
310                         HW_BREAKPOINT_LEN_4 == evsel->core.attr.bp_len);
311         return TEST_OK;
312 }
313
314 #ifdef HAVE_LIBTRACEEVENT
315 static int test__checkevent_tracepoint_modifier(struct evlist *evlist)
316 {
317         struct evsel *evsel = evlist__first(evlist);
318
319         TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
320         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
321         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
322         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
323
324         return test__checkevent_tracepoint(evlist);
325 }
326
327 static int
328 test__checkevent_tracepoint_multi_modifier(struct evlist *evlist)
329 {
330         struct perf_evsel *evsel;
331
332         TEST_ASSERT_VAL("wrong number of entries", evlist->core.nr_entries > 1);
333
334         perf_evlist__for_each_entry(&evlist->core, evsel) {
335                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
336                 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
337                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
338                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
339         }
340
341         return test__checkevent_tracepoint_multi(evlist);
342 }
343 #endif /* HAVE_LIBTRACEEVENT */
344
345 static int test__checkevent_raw_modifier(struct evlist *evlist)
346 {
347         struct perf_evsel *evsel;
348
349         perf_evlist__for_each_entry(&evlist->core, evsel) {
350                 TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
351                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
352                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
353                 TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
354         }
355         return test__checkevent_raw(evlist);
356 }
357
358 static int test__checkevent_numeric_modifier(struct evlist *evlist)
359 {
360         struct perf_evsel *evsel;
361
362         perf_evlist__for_each_entry(&evlist->core, evsel) {
363                 TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
364                 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
365                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
366                 TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
367         }
368         return test__checkevent_numeric(evlist);
369 }
370
371 static int test__checkevent_symbolic_name_modifier(struct evlist *evlist)
372 {
373         struct perf_evsel *evsel;
374
375         TEST_ASSERT_VAL("wrong number of entries",
376                         evlist->core.nr_entries == num_core_entries());
377
378         perf_evlist__for_each_entry(&evlist->core, evsel) {
379                 TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
380                 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
381                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
382                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
383         }
384         return test__checkevent_symbolic_name(evlist);
385 }
386
387 static int test__checkevent_exclude_host_modifier(struct evlist *evlist)
388 {
389         struct perf_evsel *evsel;
390
391         perf_evlist__for_each_entry(&evlist->core, evsel) {
392                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
393                 TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
394         }
395         return test__checkevent_symbolic_name(evlist);
396 }
397
398 static int test__checkevent_exclude_guest_modifier(struct evlist *evlist)
399 {
400         struct perf_evsel *evsel;
401
402         perf_evlist__for_each_entry(&evlist->core, evsel) {
403                 TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
404                 TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
405         }
406         return test__checkevent_symbolic_name(evlist);
407 }
408
409 static int test__checkevent_symbolic_alias_modifier(struct evlist *evlist)
410 {
411         struct evsel *evsel = evlist__first(evlist);
412
413         TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
414         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
415         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
416         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
417
418         return test__checkevent_symbolic_alias(evlist);
419 }
420
421 static int test__checkevent_genhw_modifier(struct evlist *evlist)
422 {
423         struct perf_evsel *evsel;
424
425         perf_evlist__for_each_entry(&evlist->core, evsel) {
426                 TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
427                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
428                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
429                 TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
430         }
431         return test__checkevent_genhw(evlist);
432 }
433
434 static int test__checkevent_exclude_idle_modifier(struct evlist *evlist)
435 {
436         struct evsel *evsel = evlist__first(evlist);
437
438         TEST_ASSERT_VAL("wrong exclude idle", evsel->core.attr.exclude_idle);
439         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
440         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
441         TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
442         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
443         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
444         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
445
446         return test__checkevent_symbolic_name(evlist);
447 }
448
449 static int test__checkevent_exclude_idle_modifier_1(struct evlist *evlist)
450 {
451         struct evsel *evsel = evlist__first(evlist);
452
453         TEST_ASSERT_VAL("wrong exclude idle", evsel->core.attr.exclude_idle);
454         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
455         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
456         TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
457         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
458         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
459         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
460
461         return test__checkevent_symbolic_name(evlist);
462 }
463
464 static int test__checkevent_breakpoint_modifier(struct evlist *evlist)
465 {
466         struct evsel *evsel = evlist__first(evlist);
467
468
469         TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
470         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
471         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
472         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
473         TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:u"));
474
475         return test__checkevent_breakpoint(evlist);
476 }
477
478 static int test__checkevent_breakpoint_x_modifier(struct evlist *evlist)
479 {
480         struct evsel *evsel = evlist__first(evlist);
481
482         TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
483         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
484         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
485         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
486         TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:x:k"));
487
488         return test__checkevent_breakpoint_x(evlist);
489 }
490
491 static int test__checkevent_breakpoint_r_modifier(struct evlist *evlist)
492 {
493         struct evsel *evsel = evlist__first(evlist);
494
495         TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
496         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
497         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
498         TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
499         TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:r:hp"));
500
501         return test__checkevent_breakpoint_r(evlist);
502 }
503
504 static int test__checkevent_breakpoint_w_modifier(struct evlist *evlist)
505 {
506         struct evsel *evsel = evlist__first(evlist);
507
508         TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
509         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
510         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
511         TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
512         TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:w:up"));
513
514         return test__checkevent_breakpoint_w(evlist);
515 }
516
517 static int test__checkevent_breakpoint_rw_modifier(struct evlist *evlist)
518 {
519         struct evsel *evsel = evlist__first(evlist);
520
521         TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
522         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
523         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
524         TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
525         TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:rw:kp"));
526
527         return test__checkevent_breakpoint_rw(evlist);
528 }
529
530 static int test__checkevent_breakpoint_modifier_name(struct evlist *evlist)
531 {
532         struct evsel *evsel = evlist__first(evlist);
533
534         TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
535         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
536         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
537         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
538         TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint"));
539
540         return test__checkevent_breakpoint(evlist);
541 }
542
543 static int test__checkevent_breakpoint_x_modifier_name(struct evlist *evlist)
544 {
545         struct evsel *evsel = evlist__first(evlist);
546
547         TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
548         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
549         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
550         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
551         TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint"));
552
553         return test__checkevent_breakpoint_x(evlist);
554 }
555
556 static int test__checkevent_breakpoint_r_modifier_name(struct evlist *evlist)
557 {
558         struct evsel *evsel = evlist__first(evlist);
559
560         TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
561         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
562         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
563         TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
564         TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint"));
565
566         return test__checkevent_breakpoint_r(evlist);
567 }
568
569 static int test__checkevent_breakpoint_w_modifier_name(struct evlist *evlist)
570 {
571         struct evsel *evsel = evlist__first(evlist);
572
573         TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
574         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
575         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
576         TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
577         TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint"));
578
579         return test__checkevent_breakpoint_w(evlist);
580 }
581
582 static int test__checkevent_breakpoint_rw_modifier_name(struct evlist *evlist)
583 {
584         struct evsel *evsel = evlist__first(evlist);
585
586         TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
587         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
588         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
589         TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
590         TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint"));
591
592         return test__checkevent_breakpoint_rw(evlist);
593 }
594
595 static int test__checkevent_breakpoint_2_events(struct evlist *evlist)
596 {
597         struct evsel *evsel = evlist__first(evlist);
598
599         TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
600
601         TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
602         TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint1"));
603
604         evsel = evsel__next(evsel);
605
606         TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
607         TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint2"));
608
609         return TEST_OK;
610 }
611
612 static int test__checkevent_pmu(struct evlist *evlist)
613 {
614
615         struct evsel *evsel = evlist__first(evlist);
616
617         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
618         TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
619         TEST_ASSERT_VAL("wrong config",    test_config(evsel, 10));
620         TEST_ASSERT_VAL("wrong config1",    1 == evsel->core.attr.config1);
621         TEST_ASSERT_VAL("wrong config2",    3 == evsel->core.attr.config2);
622         TEST_ASSERT_VAL("wrong config3",    0 == evsel->core.attr.config3);
623         /*
624          * The period value gets configured within evlist__config,
625          * while this test executes only parse events method.
626          */
627         TEST_ASSERT_VAL("wrong period",     0 == evsel->core.attr.sample_period);
628
629         return TEST_OK;
630 }
631
632 #ifdef HAVE_LIBTRACEEVENT
633 static int test__checkevent_list(struct evlist *evlist)
634 {
635         struct evsel *evsel = evlist__first(evlist);
636
637         TEST_ASSERT_VAL("wrong number of entries", 3 <= evlist->core.nr_entries);
638
639         /* r1 */
640         TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT != evsel->core.attr.type);
641         while (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) {
642                 TEST_ASSERT_VAL("wrong config", test_config(evsel, 1));
643                 TEST_ASSERT_VAL("wrong config1", 0 == evsel->core.attr.config1);
644                 TEST_ASSERT_VAL("wrong config2", 0 == evsel->core.attr.config2);
645                 TEST_ASSERT_VAL("wrong config3", 0 == evsel->core.attr.config3);
646                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
647                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
648                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
649                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
650                 evsel = evsel__next(evsel);
651         }
652
653         /* syscalls:sys_enter_openat:k */
654         TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->core.attr.type);
655         TEST_ASSERT_VAL("wrong sample_type",
656                 PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type);
657         TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->core.attr.sample_period);
658         TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
659         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
660         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
661         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
662
663         /* 1:1:hp */
664         evsel = evsel__next(evsel);
665         TEST_ASSERT_VAL("wrong type", 1 == evsel->core.attr.type);
666         TEST_ASSERT_VAL("wrong config", test_config(evsel, 1));
667         TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
668         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
669         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
670         TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
671
672         return TEST_OK;
673 }
674 #endif
675
676 static int test__checkevent_pmu_name(struct evlist *evlist)
677 {
678         struct evsel *evsel = evlist__first(evlist);
679
680         /* cpu/config=1,name=krava/u */
681         TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
682         TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
683         TEST_ASSERT_VAL("wrong config", test_config(evsel, 1));
684         TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "krava"));
685
686         /* cpu/config=2/u" */
687         evsel = evsel__next(evsel);
688         TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
689         TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
690         TEST_ASSERT_VAL("wrong config", test_config(evsel, 2));
691         TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "cpu/config=2/u"));
692
693         return TEST_OK;
694 }
695
696 static int test__checkevent_pmu_partial_time_callgraph(struct evlist *evlist)
697 {
698         struct evsel *evsel = evlist__first(evlist);
699
700         /* cpu/config=1,call-graph=fp,time,period=100000/ */
701         TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
702         TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
703         TEST_ASSERT_VAL("wrong config", test_config(evsel, 1));
704         /*
705          * The period, time and callgraph value gets configured within evlist__config,
706          * while this test executes only parse events method.
707          */
708         TEST_ASSERT_VAL("wrong period",     0 == evsel->core.attr.sample_period);
709         TEST_ASSERT_VAL("wrong callgraph",  !evsel__has_callchain(evsel));
710         TEST_ASSERT_VAL("wrong time",  !(PERF_SAMPLE_TIME & evsel->core.attr.sample_type));
711
712         /* cpu/config=2,call-graph=no,time=0,period=2000/ */
713         evsel = evsel__next(evsel);
714         TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
715         TEST_ASSERT_VAL("wrong config", test_config(evsel, 2));
716         /*
717          * The period, time and callgraph value gets configured within evlist__config,
718          * while this test executes only parse events method.
719          */
720         TEST_ASSERT_VAL("wrong period",     0 == evsel->core.attr.sample_period);
721         TEST_ASSERT_VAL("wrong callgraph",  !evsel__has_callchain(evsel));
722         TEST_ASSERT_VAL("wrong time",  !(PERF_SAMPLE_TIME & evsel->core.attr.sample_type));
723
724         return TEST_OK;
725 }
726
727 static int test__checkevent_pmu_events(struct evlist *evlist)
728 {
729         struct evsel *evsel = evlist__first(evlist);
730
731         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
732         TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type ||
733                                       strcmp(evsel->pmu->name, "cpu"));
734         TEST_ASSERT_VAL("wrong exclude_user",
735                         !evsel->core.attr.exclude_user);
736         TEST_ASSERT_VAL("wrong exclude_kernel",
737                         evsel->core.attr.exclude_kernel);
738         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
739         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
740         TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
741         TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
742
743         return TEST_OK;
744 }
745
746
747 static int test__checkevent_pmu_events_mix(struct evlist *evlist)
748 {
749         struct evsel *evsel = NULL;
750
751         /*
752          * The wild card event will be opened at least once, but it may be
753          * opened on each core PMU.
754          */
755         TEST_ASSERT_VAL("wrong number of entries", evlist->core.nr_entries >= 2);
756         for (int i = 0; i < evlist->core.nr_entries - 1; i++) {
757                 evsel = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
758                 /* pmu-event:u */
759                 TEST_ASSERT_VAL("wrong exclude_user",
760                                 !evsel->core.attr.exclude_user);
761                 TEST_ASSERT_VAL("wrong exclude_kernel",
762                                 evsel->core.attr.exclude_kernel);
763                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
764                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
765                 TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
766                 TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
767         }
768         /* cpu/pmu-event/u*/
769         evsel = evsel__next(evsel);
770         TEST_ASSERT_VAL("wrong type", evsel__find_pmu(evsel)->is_core);
771         TEST_ASSERT_VAL("wrong exclude_user",
772                         !evsel->core.attr.exclude_user);
773         TEST_ASSERT_VAL("wrong exclude_kernel",
774                         evsel->core.attr.exclude_kernel);
775         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
776         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
777         TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
778         TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.pinned);
779
780         return TEST_OK;
781 }
782
783 static int test__checkterms_simple(struct parse_events_terms *terms)
784 {
785         struct parse_events_term *term;
786
787         /* config=10 */
788         term = list_entry(terms->terms.next, struct parse_events_term, list);
789         TEST_ASSERT_VAL("wrong type term",
790                         term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG);
791         TEST_ASSERT_VAL("wrong type val",
792                         term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
793         TEST_ASSERT_VAL("wrong val", term->val.num == 10);
794         TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "config"));
795
796         /* config1 */
797         term = list_entry(term->list.next, struct parse_events_term, list);
798         TEST_ASSERT_VAL("wrong type term",
799                         term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG1);
800         TEST_ASSERT_VAL("wrong type val",
801                         term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
802         TEST_ASSERT_VAL("wrong val", term->val.num == 1);
803         TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "config1"));
804
805         /* config2=3 */
806         term = list_entry(term->list.next, struct parse_events_term, list);
807         TEST_ASSERT_VAL("wrong type term",
808                         term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG2);
809         TEST_ASSERT_VAL("wrong type val",
810                         term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
811         TEST_ASSERT_VAL("wrong val", term->val.num == 3);
812         TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "config2"));
813
814         /* config3=4 */
815         term = list_entry(term->list.next, struct parse_events_term, list);
816         TEST_ASSERT_VAL("wrong type term",
817                         term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG3);
818         TEST_ASSERT_VAL("wrong type val",
819                         term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
820         TEST_ASSERT_VAL("wrong val", term->val.num == 4);
821         TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "config3"));
822
823         /* umask=1*/
824         term = list_entry(term->list.next, struct parse_events_term, list);
825         TEST_ASSERT_VAL("wrong type term",
826                         term->type_term == PARSE_EVENTS__TERM_TYPE_USER);
827         TEST_ASSERT_VAL("wrong type val",
828                         term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
829         TEST_ASSERT_VAL("wrong val", term->val.num == 1);
830         TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "umask"));
831
832         /*
833          * read
834          *
835          * The perf_pmu__test_parse_init injects 'read' term into
836          * perf_pmu_events_list, so 'read' is evaluated as read term
837          * and not as raw event with 'ead' hex value.
838          */
839         term = list_entry(term->list.next, struct parse_events_term, list);
840         TEST_ASSERT_VAL("wrong type term",
841                         term->type_term == PARSE_EVENTS__TERM_TYPE_RAW);
842         TEST_ASSERT_VAL("wrong type val",
843                         term->type_val == PARSE_EVENTS__TERM_TYPE_STR);
844         TEST_ASSERT_VAL("wrong val", !strcmp(term->val.str, "read"));
845         TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "raw"));
846
847         /*
848          * r0xead
849          *
850          * To be still able to pass 'ead' value with 'r' syntax,
851          * we added support to parse 'r0xHEX' event.
852          */
853         term = list_entry(term->list.next, struct parse_events_term, list);
854         TEST_ASSERT_VAL("wrong type term",
855                         term->type_term == PARSE_EVENTS__TERM_TYPE_RAW);
856         TEST_ASSERT_VAL("wrong type val",
857                         term->type_val == PARSE_EVENTS__TERM_TYPE_STR);
858         TEST_ASSERT_VAL("wrong val", !strcmp(term->val.str, "r0xead"));
859         TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "raw"));
860         return TEST_OK;
861 }
862
863 static int test__group1(struct evlist *evlist)
864 {
865         struct evsel *evsel, *leader;
866
867         TEST_ASSERT_VAL("wrong number of entries",
868                         evlist->core.nr_entries == (num_core_entries() * 2));
869         TEST_ASSERT_VAL("wrong number of groups",
870                         evlist__nr_groups(evlist) == num_core_entries());
871
872         for (int i = 0; i < num_core_entries(); i++) {
873                 int ret;
874
875                 /* instructions:k */
876                 evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
877                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_INSTRUCTIONS, "instructions");
878                 if (ret)
879                         return ret;
880
881                 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
882                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
883                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
884                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
885                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
886                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
887                 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
888                 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
889                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
890                 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
891
892                 /* cycles:upp */
893                 evsel = evsel__next(evsel);
894                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
895                 if (ret)
896                         return ret;
897
898                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
899                 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
900                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
901                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
902                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
903                 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 2);
904                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
905                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
906                 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
907         }
908         return TEST_OK;
909 }
910
911 static int test__group2(struct evlist *evlist)
912 {
913         struct evsel *evsel, *leader = NULL;
914
915         TEST_ASSERT_VAL("wrong number of entries",
916                         evlist->core.nr_entries == (2 * num_core_entries() + 1));
917         /*
918          * TODO: Currently the software event won't be grouped with the hardware
919          * event except for 1 PMU.
920          */
921         TEST_ASSERT_VAL("wrong number of groups", 1 == evlist__nr_groups(evlist));
922
923         evlist__for_each_entry(evlist, evsel) {
924                 int ret;
925
926                 if (evsel->core.attr.type == PERF_TYPE_SOFTWARE) {
927                         /* faults + :ku modifier */
928                         leader = evsel;
929                         TEST_ASSERT_VAL("wrong config",
930                                         test_config(evsel, PERF_COUNT_SW_PAGE_FAULTS));
931                         TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
932                         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
933                         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
934                         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
935                         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
936                         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
937                         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
938                         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
939                         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
940                         TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
941                         continue;
942                 }
943                 if (evsel->core.attr.type == PERF_TYPE_HARDWARE &&
944                     test_config(evsel, PERF_COUNT_HW_BRANCH_INSTRUCTIONS)) {
945                         /* branches + :u modifier */
946                         TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
947                         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
948                         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
949                         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
950                         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
951                         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
952                         if (evsel__has_leader(evsel, leader))
953                                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
954                         TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
955                         continue;
956                 }
957                 /* cycles:k */
958                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
959                 if (ret)
960                         return ret;
961
962                 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
963                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
964                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
965                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
966                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
967                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
968                 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
969                 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
970         }
971         return TEST_OK;
972 }
973
974 #ifdef HAVE_LIBTRACEEVENT
975 static int test__group3(struct evlist *evlist __maybe_unused)
976 {
977         struct evsel *evsel, *group1_leader = NULL, *group2_leader = NULL;
978         int ret;
979
980         TEST_ASSERT_VAL("wrong number of entries",
981                         evlist->core.nr_entries == (3 * perf_pmus__num_core_pmus() + 2));
982         /*
983          * Currently the software event won't be grouped with the hardware event
984          * except for 1 PMU. This means there are always just 2 groups
985          * regardless of the number of core PMUs.
986          */
987         TEST_ASSERT_VAL("wrong number of groups", 2 == evlist__nr_groups(evlist));
988
989         evlist__for_each_entry(evlist, evsel) {
990                 if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT) {
991                         /* group1 syscalls:sys_enter_openat:H */
992                         group1_leader = evsel;
993                         TEST_ASSERT_VAL("wrong sample_type",
994                                         evsel->core.attr.sample_type == PERF_TP_SAMPLE_TYPE);
995                         TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->core.attr.sample_period);
996                         TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
997                         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
998                         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
999                         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
1000                         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1001                         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1002                         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1003                         TEST_ASSERT_VAL("wrong group name", !strcmp(evsel->group_name, "group1"));
1004                         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
1005                         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
1006                         TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
1007                         continue;
1008                 }
1009                 if (evsel->core.attr.type == PERF_TYPE_HARDWARE &&
1010                     test_config(evsel, PERF_COUNT_HW_CPU_CYCLES)) {
1011                         if (evsel->core.attr.exclude_user) {
1012                                 /* group1 cycles:kppp */
1013                                 TEST_ASSERT_VAL("wrong exclude_user",
1014                                                 evsel->core.attr.exclude_user);
1015                                 TEST_ASSERT_VAL("wrong exclude_kernel",
1016                                                 !evsel->core.attr.exclude_kernel);
1017                                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1018                                 TEST_ASSERT_VAL("wrong exclude guest",
1019                                                 !evsel->core.attr.exclude_guest);
1020                                 TEST_ASSERT_VAL("wrong exclude host",
1021                                                 !evsel->core.attr.exclude_host);
1022                                 TEST_ASSERT_VAL("wrong precise_ip",
1023                                                 evsel->core.attr.precise_ip == 3);
1024                                 if (evsel__has_leader(evsel, group1_leader)) {
1025                                         TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1026                                         TEST_ASSERT_VAL("wrong group_idx",
1027                                                         evsel__group_idx(evsel) == 1);
1028                                 }
1029                                 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
1030                         } else {
1031                                 /* group2 cycles + G modifier */
1032                                 group2_leader = evsel;
1033                                 TEST_ASSERT_VAL("wrong exclude_kernel",
1034                                                 !evsel->core.attr.exclude_kernel);
1035                                 TEST_ASSERT_VAL("wrong exclude_hv",
1036                                                 !evsel->core.attr.exclude_hv);
1037                                 TEST_ASSERT_VAL("wrong exclude guest",
1038                                                 !evsel->core.attr.exclude_guest);
1039                                 TEST_ASSERT_VAL("wrong exclude host",
1040                                                 evsel->core.attr.exclude_host);
1041                                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1042                                 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1043                                 if (evsel->core.nr_members == 2) {
1044                                         TEST_ASSERT_VAL("wrong group_idx",
1045                                                         evsel__group_idx(evsel) == 0);
1046                                 }
1047                                 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
1048                         }
1049                         continue;
1050                 }
1051                 if (evsel->core.attr.type == 1) {
1052                         /* group2 1:3 + G modifier */
1053                         TEST_ASSERT_VAL("wrong config", test_config(evsel, 3));
1054                         TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1055                         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1056                         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1057                         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1058                         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
1059                         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1060                         if (evsel__has_leader(evsel, group2_leader))
1061                                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
1062                         TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
1063                         continue;
1064                 }
1065                 /* instructions:u */
1066                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_INSTRUCTIONS, "instructions");
1067                 if (ret)
1068                         return ret;
1069
1070                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1071                 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1072                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1073                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1074                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1075                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1076                 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1077                 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
1078         }
1079         return TEST_OK;
1080 }
1081 #endif
1082
1083 static int test__group4(struct evlist *evlist __maybe_unused)
1084 {
1085         struct evsel *evsel, *leader;
1086
1087         TEST_ASSERT_VAL("wrong number of entries",
1088                         evlist->core.nr_entries == (num_core_entries() * 2));
1089         TEST_ASSERT_VAL("wrong number of groups",
1090                         num_core_entries() == evlist__nr_groups(evlist));
1091
1092         for (int i = 0; i < num_core_entries(); i++) {
1093                 int ret;
1094
1095                 /* cycles:u + p */
1096                 evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
1097                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1098                 if (ret)
1099                         return ret;
1100
1101                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1102                 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1103                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1104                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1105                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1106                 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 1);
1107                 TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1108                 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1109                 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
1110                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
1111                 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
1112
1113                 /* instructions:kp + p */
1114                 evsel = evsel__next(evsel);
1115                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_INSTRUCTIONS, "instructions");
1116                 if (ret)
1117                         return ret;
1118
1119                 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
1120                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1121                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1122                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1123                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1124                 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 2);
1125                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
1126                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
1127                 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
1128         }
1129         return TEST_OK;
1130 }
1131
1132 static int test__group5(struct evlist *evlist __maybe_unused)
1133 {
1134         struct evsel *evsel = NULL, *leader;
1135         int ret;
1136
1137         TEST_ASSERT_VAL("wrong number of entries",
1138                         evlist->core.nr_entries == (5 * num_core_entries()));
1139         TEST_ASSERT_VAL("wrong number of groups",
1140                         evlist__nr_groups(evlist) == (2 * num_core_entries()));
1141
1142         for (int i = 0; i < num_core_entries(); i++) {
1143                 /* cycles + G */
1144                 evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
1145                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1146                 if (ret)
1147                         return ret;
1148
1149                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1150                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1151                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1152                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1153                 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
1154                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1155                 TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1156                 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1157                 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
1158                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
1159                 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
1160
1161                 /* instructions + G */
1162                 evsel = evsel__next(evsel);
1163                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_INSTRUCTIONS, "instructions");
1164                 if (ret)
1165                         return ret;
1166
1167                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1168                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1169                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1170                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1171                 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
1172                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1173                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
1174                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
1175                 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
1176         }
1177         for (int i = 0; i < num_core_entries(); i++) {
1178                 /* cycles:G */
1179                 evsel = leader = evsel__next(evsel);
1180                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1181                 if (ret)
1182                         return ret;
1183
1184                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1185                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1186                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1187                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1188                 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
1189                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1190                 TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1191                 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1192                 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
1193                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
1194                 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
1195
1196                 /* instructions:G */
1197                 evsel = evsel__next(evsel);
1198                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_INSTRUCTIONS, "instructions");
1199                 if (ret)
1200                         return ret;
1201
1202                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1203                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1204                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1205                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1206                 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
1207                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1208                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
1209                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
1210         }
1211         for (int i = 0; i < num_core_entries(); i++) {
1212                 /* cycles */
1213                 evsel = evsel__next(evsel);
1214                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1215                 if (ret)
1216                         return ret;
1217
1218                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1219                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1220                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1221                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1222                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1223                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1224                 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1225         }
1226         return TEST_OK;
1227 }
1228
1229 static int test__group_gh1(struct evlist *evlist)
1230 {
1231         struct evsel *evsel = NULL, *leader;
1232
1233         TEST_ASSERT_VAL("wrong number of entries",
1234                         evlist->core.nr_entries == (2 * num_core_entries()));
1235         TEST_ASSERT_VAL("wrong number of groups",
1236                         evlist__nr_groups(evlist) == num_core_entries());
1237
1238         for (int i = 0; i < num_core_entries(); i++) {
1239                 int ret;
1240
1241                 /* cycles + :H group modifier */
1242                 evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
1243                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1244                 if (ret)
1245                         return ret;
1246
1247                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1248                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1249                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1250                 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
1251                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1252                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1253                 TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1254                 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1255                 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
1256                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
1257
1258                 /* cache-misses:G + :H group modifier */
1259                 evsel = evsel__next(evsel);
1260                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CACHE_MISSES, "cache-misses");
1261                 if (ret)
1262                         return ret;
1263
1264                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1265                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1266                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1267                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1268                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1269                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1270                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
1271                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
1272         }
1273         return TEST_OK;
1274 }
1275
1276 static int test__group_gh2(struct evlist *evlist)
1277 {
1278         struct evsel *evsel = NULL, *leader;
1279
1280         TEST_ASSERT_VAL("wrong number of entries",
1281                         evlist->core.nr_entries == (2 * num_core_entries()));
1282         TEST_ASSERT_VAL("wrong number of groups",
1283                         evlist__nr_groups(evlist) == num_core_entries());
1284
1285         for (int i = 0; i < num_core_entries(); i++) {
1286                 int ret;
1287
1288                 /* cycles + :G group modifier */
1289                 evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
1290                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1291                 if (ret)
1292                         return ret;
1293
1294                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1295                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1296                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1297                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1298                 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
1299                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1300                 TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1301                 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1302                 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
1303                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
1304
1305                 /* cache-misses:H + :G group modifier */
1306                 evsel = evsel__next(evsel);
1307                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CACHE_MISSES, "cache-misses");
1308                 if (ret)
1309                         return ret;
1310
1311                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1312                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1313                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1314                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1315                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1316                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1317                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
1318                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
1319         }
1320         return TEST_OK;
1321 }
1322
1323 static int test__group_gh3(struct evlist *evlist)
1324 {
1325         struct evsel *evsel = NULL, *leader;
1326
1327         TEST_ASSERT_VAL("wrong number of entries",
1328                         evlist->core.nr_entries == (2 * num_core_entries()));
1329         TEST_ASSERT_VAL("wrong number of groups",
1330                         evlist__nr_groups(evlist) == num_core_entries());
1331
1332         for (int i = 0; i < num_core_entries(); i++) {
1333                 int ret;
1334
1335                 /* cycles:G + :u group modifier */
1336                 evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
1337                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1338                 if (ret)
1339                         return ret;
1340
1341                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1342                 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1343                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1344                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1345                 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
1346                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1347                 TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1348                 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1349                 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
1350                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
1351
1352                 /* cache-misses:H + :u group modifier */
1353                 evsel = evsel__next(evsel);
1354                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CACHE_MISSES, "cache-misses");
1355                 if (ret)
1356                         return ret;
1357
1358                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1359                 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1360                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1361                 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
1362                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1363                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1364                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
1365                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
1366         }
1367         return TEST_OK;
1368 }
1369
1370 static int test__group_gh4(struct evlist *evlist)
1371 {
1372         struct evsel *evsel = NULL, *leader;
1373
1374         TEST_ASSERT_VAL("wrong number of entries",
1375                         evlist->core.nr_entries == (2 * num_core_entries()));
1376         TEST_ASSERT_VAL("wrong number of groups",
1377                         evlist__nr_groups(evlist) == num_core_entries());
1378
1379         for (int i = 0; i < num_core_entries(); i++) {
1380                 int ret;
1381
1382                 /* cycles:G + :uG group modifier */
1383                 evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
1384                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1385                 if (ret)
1386                         return ret;
1387
1388                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1389                 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1390                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1391                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1392                 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
1393                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1394                 TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1395                 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1396                 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
1397                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
1398
1399                 /* cache-misses:H + :uG group modifier */
1400                 evsel = evsel__next(evsel);
1401                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CACHE_MISSES, "cache-misses");
1402                 if (ret)
1403                         return ret;
1404
1405                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1406                 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1407                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1408                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1409                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1410                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1411                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
1412                 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
1413         }
1414         return TEST_OK;
1415 }
1416
1417 static int test__leader_sample1(struct evlist *evlist)
1418 {
1419         struct evsel *evsel = NULL, *leader;
1420
1421         TEST_ASSERT_VAL("wrong number of entries",
1422                         evlist->core.nr_entries == (3 * num_core_entries()));
1423
1424         for (int i = 0; i < num_core_entries(); i++) {
1425                 int ret;
1426
1427                 /* cycles - sampling group leader */
1428                 evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
1429                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1430                 if (ret)
1431                         return ret;
1432
1433                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1434                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1435                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1436                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1437                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1438                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1439                 TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1440                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
1441                 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1442
1443                 /* cache-misses - not sampling */
1444                 evsel = evsel__next(evsel);
1445                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CACHE_MISSES, "cache-misses");
1446                 if (ret)
1447                         return ret;
1448
1449                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1450                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1451                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1452                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1453                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1454                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1455                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
1456                 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1457
1458                 /* branch-misses - not sampling */
1459                 evsel = evsel__next(evsel);
1460                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_BRANCH_MISSES, "branch-misses");
1461                 if (ret)
1462                         return ret;
1463
1464                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1465                 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1466                 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1467                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1468                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1469                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1470                 TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1471                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
1472                 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1473         }
1474         return TEST_OK;
1475 }
1476
1477 static int test__leader_sample2(struct evlist *evlist __maybe_unused)
1478 {
1479         struct evsel *evsel = NULL, *leader;
1480
1481         TEST_ASSERT_VAL("wrong number of entries",
1482                         evlist->core.nr_entries == (2 * num_core_entries()));
1483
1484         for (int i = 0; i < num_core_entries(); i++) {
1485                 int ret;
1486
1487                 /* instructions - sampling group leader */
1488                 evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
1489                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_INSTRUCTIONS, "instructions");
1490                 if (ret)
1491                         return ret;
1492
1493                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1494                 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1495                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1496                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1497                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1498                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1499                 TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1500                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
1501                 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1502
1503                 /* branch-misses - not sampling */
1504                 evsel = evsel__next(evsel);
1505                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_BRANCH_MISSES, "branch-misses");
1506                 if (ret)
1507                         return ret;
1508
1509                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1510                 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1511                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1512                 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1513                 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1514                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1515                 TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1516                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
1517                 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1518         }
1519         return TEST_OK;
1520 }
1521
1522 static int test__checkevent_pinned_modifier(struct evlist *evlist)
1523 {
1524         struct evsel *evsel = NULL;
1525
1526         TEST_ASSERT_VAL("wrong number of entries",
1527                         evlist->core.nr_entries == num_core_entries());
1528
1529         for (int i = 0; i < num_core_entries(); i++) {
1530                 evsel = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
1531                 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1532                 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1533                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1534                 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
1535                 TEST_ASSERT_VAL("wrong pinned", evsel->core.attr.pinned);
1536         }
1537         return test__checkevent_symbolic_name(evlist);
1538 }
1539
1540 static int test__pinned_group(struct evlist *evlist)
1541 {
1542         struct evsel *evsel = NULL, *leader;
1543
1544         TEST_ASSERT_VAL("wrong number of entries",
1545                         evlist->core.nr_entries == (3 * num_core_entries()));
1546
1547         for (int i = 0; i < num_core_entries(); i++) {
1548                 int ret;
1549
1550                 /* cycles - group leader */
1551                 evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
1552                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1553                 if (ret)
1554                         return ret;
1555
1556                 TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1557                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
1558                 /* TODO: The group modifier is not copied to the split group leader. */
1559                 if (perf_pmus__num_core_pmus() == 1)
1560                         TEST_ASSERT_VAL("wrong pinned", evsel->core.attr.pinned);
1561
1562                 /* cache-misses - can not be pinned, but will go on with the leader */
1563                 evsel = evsel__next(evsel);
1564                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CACHE_MISSES, "cache-misses");
1565                 if (ret)
1566                         return ret;
1567
1568                 TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
1569
1570                 /* branch-misses - ditto */
1571                 evsel = evsel__next(evsel);
1572                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_BRANCH_MISSES, "branch-misses");
1573                 if (ret)
1574                         return ret;
1575
1576                 TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
1577         }
1578         return TEST_OK;
1579 }
1580
1581 static int test__checkevent_exclusive_modifier(struct evlist *evlist)
1582 {
1583         struct evsel *evsel = evlist__first(evlist);
1584
1585         TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1586         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1587         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1588         TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
1589         TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive);
1590
1591         return test__checkevent_symbolic_name(evlist);
1592 }
1593
1594 static int test__exclusive_group(struct evlist *evlist)
1595 {
1596         struct evsel *evsel = NULL, *leader;
1597
1598         TEST_ASSERT_VAL("wrong number of entries",
1599                         evlist->core.nr_entries == 3 * num_core_entries());
1600
1601         for (int i = 0; i < num_core_entries(); i++) {
1602                 int ret;
1603
1604                 /* cycles - group leader */
1605                 evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
1606                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1607                 if (ret)
1608                         return ret;
1609
1610                 TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1611                 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
1612                 /* TODO: The group modifier is not copied to the split group leader. */
1613                 if (perf_pmus__num_core_pmus() == 1)
1614                         TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive);
1615
1616                 /* cache-misses - can not be pinned, but will go on with the leader */
1617                 evsel = evsel__next(evsel);
1618                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_CACHE_MISSES, "cache-misses");
1619                 if (ret)
1620                         return ret;
1621
1622                 TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
1623
1624                 /* branch-misses - ditto */
1625                 evsel = evsel__next(evsel);
1626                 ret = assert_hw(&evsel->core, PERF_COUNT_HW_BRANCH_MISSES, "branch-misses");
1627                 if (ret)
1628                         return ret;
1629
1630                 TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
1631         }
1632         return TEST_OK;
1633 }
1634 static int test__checkevent_breakpoint_len(struct evlist *evlist)
1635 {
1636         struct evsel *evsel = evlist__first(evlist);
1637
1638         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
1639         TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
1640         TEST_ASSERT_VAL("wrong config", test_config(evsel, 0));
1641         TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
1642                                          evsel->core.attr.bp_type);
1643         TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_1 ==
1644                                         evsel->core.attr.bp_len);
1645
1646         return TEST_OK;
1647 }
1648
1649 static int test__checkevent_breakpoint_len_w(struct evlist *evlist)
1650 {
1651         struct evsel *evsel = evlist__first(evlist);
1652
1653         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
1654         TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
1655         TEST_ASSERT_VAL("wrong config", test_config(evsel, 0));
1656         TEST_ASSERT_VAL("wrong bp_type", HW_BREAKPOINT_W ==
1657                                          evsel->core.attr.bp_type);
1658         TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_2 ==
1659                                         evsel->core.attr.bp_len);
1660
1661         return TEST_OK;
1662 }
1663
1664 static int
1665 test__checkevent_breakpoint_len_rw_modifier(struct evlist *evlist)
1666 {
1667         struct evsel *evsel = evlist__first(evlist);
1668
1669         TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1670         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1671         TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1672         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1673
1674         return test__checkevent_breakpoint_rw(evlist);
1675 }
1676
1677 static int test__checkevent_precise_max_modifier(struct evlist *evlist)
1678 {
1679         struct evsel *evsel = evlist__first(evlist);
1680
1681         TEST_ASSERT_VAL("wrong number of entries",
1682                         evlist->core.nr_entries == 1 + num_core_entries());
1683         TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
1684         TEST_ASSERT_VAL("wrong config", test_config(evsel, PERF_COUNT_SW_TASK_CLOCK));
1685         return TEST_OK;
1686 }
1687
1688 static int test__checkevent_config_symbol(struct evlist *evlist)
1689 {
1690         struct evsel *evsel = evlist__first(evlist);
1691
1692         TEST_ASSERT_VAL("wrong name setting", evsel__name_is(evsel, "insn"));
1693         return TEST_OK;
1694 }
1695
1696 static int test__checkevent_config_raw(struct evlist *evlist)
1697 {
1698         struct evsel *evsel = evlist__first(evlist);
1699
1700         TEST_ASSERT_VAL("wrong name setting", evsel__name_is(evsel, "rawpmu"));
1701         return TEST_OK;
1702 }
1703
1704 static int test__checkevent_config_num(struct evlist *evlist)
1705 {
1706         struct evsel *evsel = evlist__first(evlist);
1707
1708         TEST_ASSERT_VAL("wrong name setting", evsel__name_is(evsel, "numpmu"));
1709         return TEST_OK;
1710 }
1711
1712 static int test__checkevent_config_cache(struct evlist *evlist)
1713 {
1714         struct evsel *evsel = evlist__first(evlist);
1715
1716         TEST_ASSERT_VAL("wrong name setting", evsel__name_is(evsel, "cachepmu"));
1717         return test__checkevent_genhw(evlist);
1718 }
1719
1720 static bool test__pmu_cpu_valid(void)
1721 {
1722         return !!perf_pmus__find("cpu");
1723 }
1724
1725 static bool test__pmu_cpu_event_valid(void)
1726 {
1727         struct perf_pmu *pmu = perf_pmus__find("cpu");
1728
1729         if (!pmu)
1730                 return false;
1731
1732         return perf_pmu__has_format(pmu, "event");
1733 }
1734
1735 static bool test__intel_pt_valid(void)
1736 {
1737         return !!perf_pmus__find("intel_pt");
1738 }
1739
1740 static int test__intel_pt(struct evlist *evlist)
1741 {
1742         struct evsel *evsel = evlist__first(evlist);
1743
1744         TEST_ASSERT_VAL("wrong name setting", evsel__name_is(evsel, "intel_pt//u"));
1745         return TEST_OK;
1746 }
1747
1748 static int test__checkevent_complex_name(struct evlist *evlist)
1749 {
1750         struct evsel *evsel = evlist__first(evlist);
1751
1752         TEST_ASSERT_VAL("wrong complex name parsing",
1753                         evsel__name_is(evsel,
1754                                        "COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks"));
1755         return TEST_OK;
1756 }
1757
1758 static int test__checkevent_raw_pmu(struct evlist *evlist)
1759 {
1760         struct evsel *evsel = evlist__first(evlist);
1761
1762         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
1763         TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
1764         TEST_ASSERT_VAL("wrong config", test_config(evsel, 0x1a));
1765         return TEST_OK;
1766 }
1767
1768 static int test__sym_event_slash(struct evlist *evlist)
1769 {
1770         struct evsel *evsel = evlist__first(evlist);
1771         int ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1772
1773         if (ret)
1774                 return ret;
1775
1776         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1777         return TEST_OK;
1778 }
1779
1780 static int test__sym_event_dc(struct evlist *evlist)
1781 {
1782         struct evsel *evsel = evlist__first(evlist);
1783         int ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1784
1785         if (ret)
1786                 return ret;
1787
1788         TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
1789         return TEST_OK;
1790 }
1791
1792 static int test__term_equal_term(struct evlist *evlist)
1793 {
1794         struct evsel *evsel = evlist__first(evlist);
1795         int ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1796
1797         if (ret)
1798                 return ret;
1799
1800         TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "name") == 0);
1801         return TEST_OK;
1802 }
1803
1804 static int test__term_equal_legacy(struct evlist *evlist)
1805 {
1806         struct evsel *evsel = evlist__first(evlist);
1807         int ret = assert_hw(&evsel->core, PERF_COUNT_HW_CPU_CYCLES, "cycles");
1808
1809         if (ret)
1810                 return ret;
1811
1812         TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "l1d") == 0);
1813         return TEST_OK;
1814 }
1815
1816 #ifdef HAVE_LIBTRACEEVENT
1817 static int count_tracepoints(void)
1818 {
1819         struct dirent *events_ent;
1820         DIR *events_dir;
1821         int cnt = 0;
1822
1823         events_dir = tracing_events__opendir();
1824
1825         TEST_ASSERT_VAL("Can't open events dir", events_dir);
1826
1827         while ((events_ent = readdir(events_dir))) {
1828                 char *sys_path;
1829                 struct dirent *sys_ent;
1830                 DIR *sys_dir;
1831
1832                 if (!strcmp(events_ent->d_name, ".")
1833                     || !strcmp(events_ent->d_name, "..")
1834                     || !strcmp(events_ent->d_name, "enable")
1835                     || !strcmp(events_ent->d_name, "header_event")
1836                     || !strcmp(events_ent->d_name, "header_page"))
1837                         continue;
1838
1839                 sys_path = get_events_file(events_ent->d_name);
1840                 TEST_ASSERT_VAL("Can't get sys path", sys_path);
1841
1842                 sys_dir = opendir(sys_path);
1843                 TEST_ASSERT_VAL("Can't open sys dir", sys_dir);
1844
1845                 while ((sys_ent = readdir(sys_dir))) {
1846                         if (!strcmp(sys_ent->d_name, ".")
1847                             || !strcmp(sys_ent->d_name, "..")
1848                             || !strcmp(sys_ent->d_name, "enable")
1849                             || !strcmp(sys_ent->d_name, "filter"))
1850                                 continue;
1851
1852                         cnt++;
1853                 }
1854
1855                 closedir(sys_dir);
1856                 put_events_file(sys_path);
1857         }
1858
1859         closedir(events_dir);
1860         return cnt;
1861 }
1862
1863 static int test__all_tracepoints(struct evlist *evlist)
1864 {
1865         TEST_ASSERT_VAL("wrong events count",
1866                         count_tracepoints() == evlist->core.nr_entries);
1867
1868         return test__checkevent_tracepoint_multi(evlist);
1869 }
1870 #endif /* HAVE_LIBTRACEVENT */
1871
1872 struct evlist_test {
1873         const char *name;
1874         bool (*valid)(void);
1875         int (*check)(struct evlist *evlist);
1876 };
1877
1878 static const struct evlist_test test__events[] = {
1879 #ifdef HAVE_LIBTRACEEVENT
1880         {
1881                 .name  = "syscalls:sys_enter_openat",
1882                 .check = test__checkevent_tracepoint,
1883                 /* 0 */
1884         },
1885         {
1886                 .name  = "syscalls:*",
1887                 .check = test__checkevent_tracepoint_multi,
1888                 /* 1 */
1889         },
1890 #endif
1891         {
1892                 .name  = "r1a",
1893                 .check = test__checkevent_raw,
1894                 /* 2 */
1895         },
1896         {
1897                 .name  = "1:1",
1898                 .check = test__checkevent_numeric,
1899                 /* 3 */
1900         },
1901         {
1902                 .name  = "instructions",
1903                 .check = test__checkevent_symbolic_name,
1904                 /* 4 */
1905         },
1906         {
1907                 .name  = "cycles/period=100000,config2/",
1908                 .check = test__checkevent_symbolic_name_config,
1909                 /* 5 */
1910         },
1911         {
1912                 .name  = "faults",
1913                 .check = test__checkevent_symbolic_alias,
1914                 /* 6 */
1915         },
1916         {
1917                 .name  = "L1-dcache-load-miss",
1918                 .check = test__checkevent_genhw,
1919                 /* 7 */
1920         },
1921         {
1922                 .name  = "mem:0",
1923                 .check = test__checkevent_breakpoint,
1924                 /* 8 */
1925         },
1926         {
1927                 .name  = "mem:0:x",
1928                 .check = test__checkevent_breakpoint_x,
1929                 /* 9 */
1930         },
1931         {
1932                 .name  = "mem:0:r",
1933                 .check = test__checkevent_breakpoint_r,
1934                 /* 0 */
1935         },
1936         {
1937                 .name  = "mem:0:w",
1938                 .check = test__checkevent_breakpoint_w,
1939                 /* 1 */
1940         },
1941 #ifdef HAVE_LIBTRACEEVENT
1942         {
1943                 .name  = "syscalls:sys_enter_openat:k",
1944                 .check = test__checkevent_tracepoint_modifier,
1945                 /* 2 */
1946         },
1947         {
1948                 .name  = "syscalls:*:u",
1949                 .check = test__checkevent_tracepoint_multi_modifier,
1950                 /* 3 */
1951         },
1952 #endif
1953         {
1954                 .name  = "r1a:kp",
1955                 .check = test__checkevent_raw_modifier,
1956                 /* 4 */
1957         },
1958         {
1959                 .name  = "1:1:hp",
1960                 .check = test__checkevent_numeric_modifier,
1961                 /* 5 */
1962         },
1963         {
1964                 .name  = "instructions:h",
1965                 .check = test__checkevent_symbolic_name_modifier,
1966                 /* 6 */
1967         },
1968         {
1969                 .name  = "faults:u",
1970                 .check = test__checkevent_symbolic_alias_modifier,
1971                 /* 7 */
1972         },
1973         {
1974                 .name  = "L1-dcache-load-miss:kp",
1975                 .check = test__checkevent_genhw_modifier,
1976                 /* 8 */
1977         },
1978         {
1979                 .name  = "mem:0:u",
1980                 .check = test__checkevent_breakpoint_modifier,
1981                 /* 9 */
1982         },
1983         {
1984                 .name  = "mem:0:x:k",
1985                 .check = test__checkevent_breakpoint_x_modifier,
1986                 /* 0 */
1987         },
1988         {
1989                 .name  = "mem:0:r:hp",
1990                 .check = test__checkevent_breakpoint_r_modifier,
1991                 /* 1 */
1992         },
1993         {
1994                 .name  = "mem:0:w:up",
1995                 .check = test__checkevent_breakpoint_w_modifier,
1996                 /* 2 */
1997         },
1998 #ifdef HAVE_LIBTRACEEVENT
1999         {
2000                 .name  = "r1,syscalls:sys_enter_openat:k,1:1:hp",
2001                 .check = test__checkevent_list,
2002                 /* 3 */
2003         },
2004 #endif
2005         {
2006                 .name  = "instructions:G",
2007                 .check = test__checkevent_exclude_host_modifier,
2008                 /* 4 */
2009         },
2010         {
2011                 .name  = "instructions:H",
2012                 .check = test__checkevent_exclude_guest_modifier,
2013                 /* 5 */
2014         },
2015         {
2016                 .name  = "mem:0:rw",
2017                 .check = test__checkevent_breakpoint_rw,
2018                 /* 6 */
2019         },
2020         {
2021                 .name  = "mem:0:rw:kp",
2022                 .check = test__checkevent_breakpoint_rw_modifier,
2023                 /* 7 */
2024         },
2025         {
2026                 .name  = "{instructions:k,cycles:upp}",
2027                 .check = test__group1,
2028                 /* 8 */
2029         },
2030         {
2031                 .name  = "{faults:k,branches}:u,cycles:k",
2032                 .check = test__group2,
2033                 /* 9 */
2034         },
2035 #ifdef HAVE_LIBTRACEEVENT
2036         {
2037                 .name  = "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
2038                 .check = test__group3,
2039                 /* 0 */
2040         },
2041 #endif
2042         {
2043                 .name  = "{cycles:u,instructions:kp}:p",
2044                 .check = test__group4,
2045                 /* 1 */
2046         },
2047         {
2048                 .name  = "{cycles,instructions}:G,{cycles:G,instructions:G},cycles",
2049                 .check = test__group5,
2050                 /* 2 */
2051         },
2052 #ifdef HAVE_LIBTRACEEVENT
2053         {
2054                 .name  = "*:*",
2055                 .check = test__all_tracepoints,
2056                 /* 3 */
2057         },
2058 #endif
2059         {
2060                 .name  = "{cycles,cache-misses:G}:H",
2061                 .check = test__group_gh1,
2062                 /* 4 */
2063         },
2064         {
2065                 .name  = "{cycles,cache-misses:H}:G",
2066                 .check = test__group_gh2,
2067                 /* 5 */
2068         },
2069         {
2070                 .name  = "{cycles:G,cache-misses:H}:u",
2071                 .check = test__group_gh3,
2072                 /* 6 */
2073         },
2074         {
2075                 .name  = "{cycles:G,cache-misses:H}:uG",
2076                 .check = test__group_gh4,
2077                 /* 7 */
2078         },
2079         {
2080                 .name  = "{cycles,cache-misses,branch-misses}:S",
2081                 .check = test__leader_sample1,
2082                 /* 8 */
2083         },
2084         {
2085                 .name  = "{instructions,branch-misses}:Su",
2086                 .check = test__leader_sample2,
2087                 /* 9 */
2088         },
2089         {
2090                 .name  = "instructions:uDp",
2091                 .check = test__checkevent_pinned_modifier,
2092                 /* 0 */
2093         },
2094         {
2095                 .name  = "{cycles,cache-misses,branch-misses}:D",
2096                 .check = test__pinned_group,
2097                 /* 1 */
2098         },
2099         {
2100                 .name  = "mem:0/1",
2101                 .check = test__checkevent_breakpoint_len,
2102                 /* 2 */
2103         },
2104         {
2105                 .name  = "mem:0/2:w",
2106                 .check = test__checkevent_breakpoint_len_w,
2107                 /* 3 */
2108         },
2109         {
2110                 .name  = "mem:0/4:rw:u",
2111                 .check = test__checkevent_breakpoint_len_rw_modifier,
2112                 /* 4 */
2113         },
2114 #if defined(__s390x__) && defined(HAVE_LIBTRACEEVENT)
2115         {
2116                 .name  = "kvm-s390:kvm_s390_create_vm",
2117                 .check = test__checkevent_tracepoint,
2118                 .valid = kvm_s390_create_vm_valid,
2119                 /* 0 */
2120         },
2121 #endif
2122         {
2123                 .name  = "instructions:I",
2124                 .check = test__checkevent_exclude_idle_modifier,
2125                 /* 5 */
2126         },
2127         {
2128                 .name  = "instructions:kIG",
2129                 .check = test__checkevent_exclude_idle_modifier_1,
2130                 /* 6 */
2131         },
2132         {
2133                 .name  = "task-clock:P,cycles",
2134                 .check = test__checkevent_precise_max_modifier,
2135                 /* 7 */
2136         },
2137         {
2138                 .name  = "instructions/name=insn/",
2139                 .check = test__checkevent_config_symbol,
2140                 /* 8 */
2141         },
2142         {
2143                 .name  = "r1234/name=rawpmu/",
2144                 .check = test__checkevent_config_raw,
2145                 /* 9 */
2146         },
2147         {
2148                 .name  = "4:0x6530160/name=numpmu/",
2149                 .check = test__checkevent_config_num,
2150                 /* 0 */
2151         },
2152         {
2153                 .name  = "L1-dcache-misses/name=cachepmu/",
2154                 .check = test__checkevent_config_cache,
2155                 /* 1 */
2156         },
2157         {
2158                 .name  = "intel_pt//u",
2159                 .valid = test__intel_pt_valid,
2160                 .check = test__intel_pt,
2161                 /* 2 */
2162         },
2163         {
2164                 .name  = "cycles/name='COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks'/Duk",
2165                 .check = test__checkevent_complex_name,
2166                 /* 3 */
2167         },
2168         {
2169                 .name  = "cycles//u",
2170                 .check = test__sym_event_slash,
2171                 /* 4 */
2172         },
2173         {
2174                 .name  = "cycles:k",
2175                 .check = test__sym_event_dc,
2176                 /* 5 */
2177         },
2178         {
2179                 .name  = "instructions:uep",
2180                 .check = test__checkevent_exclusive_modifier,
2181                 /* 6 */
2182         },
2183         {
2184                 .name  = "{cycles,cache-misses,branch-misses}:e",
2185                 .check = test__exclusive_group,
2186                 /* 7 */
2187         },
2188         {
2189                 .name  = "cycles/name=name/",
2190                 .check = test__term_equal_term,
2191                 /* 8 */
2192         },
2193         {
2194                 .name  = "cycles/name=l1d/",
2195                 .check = test__term_equal_legacy,
2196                 /* 9 */
2197         },
2198         {
2199                 .name  = "mem:0/name=breakpoint/",
2200                 .check = test__checkevent_breakpoint,
2201                 /* 0 */
2202         },
2203         {
2204                 .name  = "mem:0:x/name=breakpoint/",
2205                 .check = test__checkevent_breakpoint_x,
2206                 /* 1 */
2207         },
2208         {
2209                 .name  = "mem:0:r/name=breakpoint/",
2210                 .check = test__checkevent_breakpoint_r,
2211                 /* 2 */
2212         },
2213         {
2214                 .name  = "mem:0:w/name=breakpoint/",
2215                 .check = test__checkevent_breakpoint_w,
2216                 /* 3 */
2217         },
2218         {
2219                 .name  = "mem:0/name=breakpoint/u",
2220                 .check = test__checkevent_breakpoint_modifier_name,
2221                 /* 4 */
2222         },
2223         {
2224                 .name  = "mem:0:x/name=breakpoint/k",
2225                 .check = test__checkevent_breakpoint_x_modifier_name,
2226                 /* 5 */
2227         },
2228         {
2229                 .name  = "mem:0:r/name=breakpoint/hp",
2230                 .check = test__checkevent_breakpoint_r_modifier_name,
2231                 /* 6 */
2232         },
2233         {
2234                 .name  = "mem:0:w/name=breakpoint/up",
2235                 .check = test__checkevent_breakpoint_w_modifier_name,
2236                 /* 7 */
2237         },
2238         {
2239                 .name  = "mem:0:rw/name=breakpoint/",
2240                 .check = test__checkevent_breakpoint_rw,
2241                 /* 8 */
2242         },
2243         {
2244                 .name  = "mem:0:rw/name=breakpoint/kp",
2245                 .check = test__checkevent_breakpoint_rw_modifier_name,
2246                 /* 9 */
2247         },
2248         {
2249                 .name  = "mem:0/1/name=breakpoint/",
2250                 .check = test__checkevent_breakpoint_len,
2251                 /* 0 */
2252         },
2253         {
2254                 .name  = "mem:0/2:w/name=breakpoint/",
2255                 .check = test__checkevent_breakpoint_len_w,
2256                 /* 1 */
2257         },
2258         {
2259                 .name  = "mem:0/4:rw/name=breakpoint/u",
2260                 .check = test__checkevent_breakpoint_len_rw_modifier,
2261                 /* 2 */
2262         },
2263         {
2264                 .name  = "mem:0/1/name=breakpoint1/,mem:0/4:rw/name=breakpoint2/",
2265                 .check = test__checkevent_breakpoint_2_events,
2266                 /* 3 */
2267         },
2268 #ifdef HAVE_LIBTRACEEVENT
2269         {
2270                 .name = "9p:9p_client_req",
2271                 .check = test__checkevent_tracepoint,
2272                 /* 4 */
2273         },
2274 #endif
2275 };
2276
2277 static const struct evlist_test test__events_pmu[] = {
2278         {
2279                 .name  = "cpu/config=10,config1=1,config2=3,period=1000/u",
2280                 .valid = test__pmu_cpu_valid,
2281                 .check = test__checkevent_pmu,
2282                 /* 0 */
2283         },
2284         {
2285                 .name  = "cpu/config=1,name=krava/u,cpu/config=2/u",
2286                 .valid = test__pmu_cpu_valid,
2287                 .check = test__checkevent_pmu_name,
2288                 /* 1 */
2289         },
2290         {
2291                 .name  = "cpu/config=1,call-graph=fp,time,period=100000/,cpu/config=2,call-graph=no,time=0,period=2000/",
2292                 .valid = test__pmu_cpu_valid,
2293                 .check = test__checkevent_pmu_partial_time_callgraph,
2294                 /* 2 */
2295         },
2296         {
2297                 .name  = "cpu/name='COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks',period=0x1,event=0x2/ukp",
2298                 .valid = test__pmu_cpu_event_valid,
2299                 .check = test__checkevent_complex_name,
2300                 /* 3 */
2301         },
2302         {
2303                 .name  = "software/r1a/",
2304                 .check = test__checkevent_raw_pmu,
2305                 /* 4 */
2306         },
2307         {
2308                 .name  = "software/r0x1a/",
2309                 .check = test__checkevent_raw_pmu,
2310                 /* 5 */
2311         },
2312         {
2313                 .name  = "cpu/L1-dcache-load-miss/",
2314                 .valid = test__pmu_cpu_valid,
2315                 .check = test__checkevent_genhw,
2316                 /* 6 */
2317         },
2318         {
2319                 .name  = "cpu/L1-dcache-load-miss/kp",
2320                 .valid = test__pmu_cpu_valid,
2321                 .check = test__checkevent_genhw_modifier,
2322                 /* 7 */
2323         },
2324         {
2325                 .name  = "cpu/L1-dcache-misses,name=cachepmu/",
2326                 .valid = test__pmu_cpu_valid,
2327                 .check = test__checkevent_config_cache,
2328                 /* 8 */
2329         },
2330         {
2331                 .name  = "cpu/instructions/",
2332                 .valid = test__pmu_cpu_valid,
2333                 .check = test__checkevent_symbolic_name,
2334                 /* 9 */
2335         },
2336         {
2337                 .name  = "cpu/cycles,period=100000,config2/",
2338                 .valid = test__pmu_cpu_valid,
2339                 .check = test__checkevent_symbolic_name_config,
2340                 /* 0 */
2341         },
2342         {
2343                 .name  = "cpu/instructions/h",
2344                 .valid = test__pmu_cpu_valid,
2345                 .check = test__checkevent_symbolic_name_modifier,
2346                 /* 1 */
2347         },
2348         {
2349                 .name  = "cpu/instructions/G",
2350                 .valid = test__pmu_cpu_valid,
2351                 .check = test__checkevent_exclude_host_modifier,
2352                 /* 2 */
2353         },
2354         {
2355                 .name  = "cpu/instructions/H",
2356                 .valid = test__pmu_cpu_valid,
2357                 .check = test__checkevent_exclude_guest_modifier,
2358                 /* 3 */
2359         },
2360         {
2361                 .name  = "{cpu/instructions/k,cpu/cycles/upp}",
2362                 .valid = test__pmu_cpu_valid,
2363                 .check = test__group1,
2364                 /* 4 */
2365         },
2366         {
2367                 .name  = "{cpu/cycles/u,cpu/instructions/kp}:p",
2368                 .valid = test__pmu_cpu_valid,
2369                 .check = test__group4,
2370                 /* 5 */
2371         },
2372         {
2373                 .name  = "{cpu/cycles/,cpu/cache-misses/G}:H",
2374                 .valid = test__pmu_cpu_valid,
2375                 .check = test__group_gh1,
2376                 /* 6 */
2377         },
2378         {
2379                 .name  = "{cpu/cycles/,cpu/cache-misses/H}:G",
2380                 .valid = test__pmu_cpu_valid,
2381                 .check = test__group_gh2,
2382                 /* 7 */
2383         },
2384         {
2385                 .name  = "{cpu/cycles/G,cpu/cache-misses/H}:u",
2386                 .valid = test__pmu_cpu_valid,
2387                 .check = test__group_gh3,
2388                 /* 8 */
2389         },
2390         {
2391                 .name  = "{cpu/cycles/G,cpu/cache-misses/H}:uG",
2392                 .valid = test__pmu_cpu_valid,
2393                 .check = test__group_gh4,
2394                 /* 9 */
2395         },
2396         {
2397                 .name  = "{cpu/cycles/,cpu/cache-misses/,cpu/branch-misses/}:S",
2398                 .valid = test__pmu_cpu_valid,
2399                 .check = test__leader_sample1,
2400                 /* 0 */
2401         },
2402         {
2403                 .name  = "{cpu/instructions/,cpu/branch-misses/}:Su",
2404                 .valid = test__pmu_cpu_valid,
2405                 .check = test__leader_sample2,
2406                 /* 1 */
2407         },
2408         {
2409                 .name  = "cpu/instructions/uDp",
2410                 .valid = test__pmu_cpu_valid,
2411                 .check = test__checkevent_pinned_modifier,
2412                 /* 2 */
2413         },
2414         {
2415                 .name  = "{cpu/cycles/,cpu/cache-misses/,cpu/branch-misses/}:D",
2416                 .valid = test__pmu_cpu_valid,
2417                 .check = test__pinned_group,
2418                 /* 3 */
2419         },
2420         {
2421                 .name  = "cpu/instructions/I",
2422                 .valid = test__pmu_cpu_valid,
2423                 .check = test__checkevent_exclude_idle_modifier,
2424                 /* 4 */
2425         },
2426         {
2427                 .name  = "cpu/instructions/kIG",
2428                 .valid = test__pmu_cpu_valid,
2429                 .check = test__checkevent_exclude_idle_modifier_1,
2430                 /* 5 */
2431         },
2432         {
2433                 .name  = "cpu/cycles/u",
2434                 .valid = test__pmu_cpu_valid,
2435                 .check = test__sym_event_slash,
2436                 /* 6 */
2437         },
2438         {
2439                 .name  = "cpu/cycles/k",
2440                 .valid = test__pmu_cpu_valid,
2441                 .check = test__sym_event_dc,
2442                 /* 7 */
2443         },
2444         {
2445                 .name  = "cpu/instructions/uep",
2446                 .valid = test__pmu_cpu_valid,
2447                 .check = test__checkevent_exclusive_modifier,
2448                 /* 8 */
2449         },
2450         {
2451                 .name  = "{cpu/cycles/,cpu/cache-misses/,cpu/branch-misses/}:e",
2452                 .valid = test__pmu_cpu_valid,
2453                 .check = test__exclusive_group,
2454                 /* 9 */
2455         },
2456         {
2457                 .name  = "cpu/cycles,name=name/",
2458                 .valid = test__pmu_cpu_valid,
2459                 .check = test__term_equal_term,
2460                 /* 0 */
2461         },
2462         {
2463                 .name  = "cpu/cycles,name=l1d/",
2464                 .valid = test__pmu_cpu_valid,
2465                 .check = test__term_equal_legacy,
2466                 /* 1 */
2467         },
2468 };
2469
2470 struct terms_test {
2471         const char *str;
2472         int (*check)(struct parse_events_terms *terms);
2473 };
2474
2475 static const struct terms_test test__terms[] = {
2476         [0] = {
2477                 .str   = "config=10,config1,config2=3,config3=4,umask=1,read,r0xead",
2478                 .check = test__checkterms_simple,
2479         },
2480 };
2481
2482 static int test_event(const struct evlist_test *e)
2483 {
2484         struct parse_events_error err;
2485         struct evlist *evlist;
2486         int ret;
2487
2488         if (e->valid && !e->valid()) {
2489                 pr_debug("... SKIP\n");
2490                 return TEST_OK;
2491         }
2492
2493         evlist = evlist__new();
2494         if (evlist == NULL) {
2495                 pr_err("Failed allocation");
2496                 return TEST_FAIL;
2497         }
2498         parse_events_error__init(&err);
2499         ret = __parse_events(evlist, e->name, /*pmu_filter=*/NULL, &err, /*fake_pmu=*/false,
2500                              /*warn_if_reordered=*/true, /*fake_tp=*/true);
2501         if (ret) {
2502                 pr_debug("failed to parse event '%s', err %d\n", e->name, ret);
2503                 parse_events_error__print(&err, e->name);
2504                 ret = TEST_FAIL;
2505                 if (parse_events_error__contains(&err, "can't access trace events"))
2506                         ret = TEST_SKIP;
2507         } else {
2508                 ret = e->check(evlist);
2509         }
2510         parse_events_error__exit(&err);
2511         evlist__delete(evlist);
2512
2513         return ret;
2514 }
2515
2516 static int test_event_fake_pmu(const char *str)
2517 {
2518         struct parse_events_error err;
2519         struct evlist *evlist;
2520         int ret;
2521
2522         evlist = evlist__new();
2523         if (!evlist)
2524                 return -ENOMEM;
2525
2526         parse_events_error__init(&err);
2527         ret = __parse_events(evlist, str, /*pmu_filter=*/NULL, &err,
2528                              /*fake_pmu=*/true, /*warn_if_reordered=*/true,
2529                              /*fake_tp=*/true);
2530         if (ret) {
2531                 pr_debug("failed to parse event '%s', err %d\n",
2532                          str, ret);
2533                 parse_events_error__print(&err, str);
2534         }
2535
2536         parse_events_error__exit(&err);
2537         evlist__delete(evlist);
2538
2539         return ret;
2540 }
2541
2542 static int combine_test_results(int existing, int latest)
2543 {
2544         if (existing == TEST_FAIL)
2545                 return TEST_FAIL;
2546         if (existing == TEST_SKIP)
2547                 return latest == TEST_OK ? TEST_SKIP : latest;
2548         return latest;
2549 }
2550
2551 static int test_events(const struct evlist_test *events, int cnt)
2552 {
2553         int ret = TEST_OK;
2554
2555         for (int i = 0; i < cnt; i++) {
2556                 const struct evlist_test *e = &events[i];
2557                 int test_ret;
2558
2559                 pr_debug("running test %d '%s'\n", i, e->name);
2560                 test_ret = test_event(e);
2561                 if (test_ret != TEST_OK) {
2562                         pr_debug("Event test failure: test %d '%s'", i, e->name);
2563                         ret = combine_test_results(ret, test_ret);
2564                 }
2565         }
2566
2567         return ret;
2568 }
2569
2570 static int test__events2(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
2571 {
2572         return test_events(test__events, ARRAY_SIZE(test__events));
2573 }
2574
2575 static int test_term(const struct terms_test *t)
2576 {
2577         struct parse_events_terms terms;
2578         int ret;
2579
2580
2581         parse_events_terms__init(&terms);
2582         ret = parse_events_terms(&terms, t->str, /*input=*/ NULL);
2583         if (ret) {
2584                 pr_debug("failed to parse terms '%s', err %d\n",
2585                          t->str , ret);
2586                 return ret;
2587         }
2588
2589         ret = t->check(&terms);
2590         parse_events_terms__exit(&terms);
2591
2592         return ret;
2593 }
2594
2595 static int test_terms(const struct terms_test *terms, int cnt)
2596 {
2597         int ret = 0;
2598
2599         for (int i = 0; i < cnt; i++) {
2600                 const struct terms_test *t = &terms[i];
2601
2602                 pr_debug("running test %d '%s'\n", i, t->str);
2603                 ret = test_term(t);
2604                 if (ret)
2605                         break;
2606         }
2607
2608         return ret;
2609 }
2610
2611 static int test__terms2(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
2612 {
2613         return test_terms(test__terms, ARRAY_SIZE(test__terms));
2614 }
2615
2616 static int test__pmu_events(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
2617 {
2618         struct perf_pmu *pmu = NULL;
2619         int ret = TEST_OK;
2620
2621         while ((pmu = perf_pmus__scan(pmu)) != NULL) {
2622                 struct stat st;
2623                 char path[PATH_MAX];
2624                 char pmu_event[PATH_MAX];
2625                 char *buf = NULL;
2626                 FILE *file;
2627                 struct dirent *ent;
2628                 size_t len = 0;
2629                 DIR *dir;
2630                 int err;
2631                 int n;
2632
2633                 snprintf(path, PATH_MAX, "%s/bus/event_source/devices/%s/events/",
2634                         sysfs__mountpoint(), pmu->name);
2635
2636                 err = stat(path, &st);
2637                 if (err) {
2638                         pr_debug("skipping PMU %s events tests: %s\n", pmu->name, path);
2639                         continue;
2640                 }
2641
2642                 dir = opendir(path);
2643                 if (!dir) {
2644                         pr_debug("can't open pmu event dir: %s\n", path);
2645                         ret = combine_test_results(ret, TEST_SKIP);
2646                         continue;
2647                 }
2648
2649                 while ((ent = readdir(dir))) {
2650                         struct evlist_test e = { .name = NULL, };
2651                         char name[2 * NAME_MAX + 1 + 12 + 3];
2652                         int test_ret;
2653                         bool is_event_parameterized = 0;
2654
2655                         /* Names containing . are special and cannot be used directly */
2656                         if (strchr(ent->d_name, '.'))
2657                                 continue;
2658
2659                         /* exclude parameterized ones (name contains '?') */
2660                         n = snprintf(pmu_event, sizeof(pmu_event), "%s%s", path, ent->d_name);
2661                         if (n >= PATH_MAX) {
2662                                 pr_err("pmu event name crossed PATH_MAX(%d) size\n", PATH_MAX);
2663                                 continue;
2664                         }
2665
2666                         file = fopen(pmu_event, "r");
2667                         if (!file) {
2668                                 pr_debug("can't open pmu event file for '%s'\n", ent->d_name);
2669                                 ret = combine_test_results(ret, TEST_FAIL);
2670                                 continue;
2671                         }
2672
2673                         if (getline(&buf, &len, file) < 0) {
2674                                 pr_debug(" pmu event: %s is a null event\n", ent->d_name);
2675                                 ret = combine_test_results(ret, TEST_FAIL);
2676                                 fclose(file);
2677                                 continue;
2678                         }
2679
2680                         if (strchr(buf, '?'))
2681                                 is_event_parameterized = 1;
2682
2683                         free(buf);
2684                         buf = NULL;
2685                         fclose(file);
2686
2687                         if (is_event_parameterized == 1) {
2688                                 pr_debug("skipping parameterized PMU event: %s which contains ?\n", pmu_event);
2689                                 continue;
2690                         }
2691
2692                         snprintf(name, sizeof(name), "%s/event=%s/u", pmu->name, ent->d_name);
2693
2694                         e.name  = name;
2695                         e.check = test__checkevent_pmu_events;
2696
2697                         test_ret = test_event(&e);
2698                         if (test_ret != TEST_OK) {
2699                                 pr_debug("Test PMU event failed for '%s'", name);
2700                                 ret = combine_test_results(ret, test_ret);
2701                         }
2702
2703                         if (!is_pmu_core(pmu->name))
2704                                 continue;
2705
2706                         /*
2707                          * Names containing '-' are recognized as prefixes and suffixes
2708                          * due to '-' being a legacy PMU separator. This fails when the
2709                          * prefix or suffix collides with an existing legacy token. For
2710                          * example, branch-brs has a prefix (branch) that collides with
2711                          * a PE_NAME_CACHE_TYPE token causing a parse error as a suffix
2712                          * isn't expected after this. As event names in the config
2713                          * slashes are allowed a '-' in the name we check this works
2714                          * above.
2715                          */
2716                         if (strchr(ent->d_name, '-'))
2717                                 continue;
2718
2719                         snprintf(name, sizeof(name), "%s:u,%s/event=%s/u",
2720                                  ent->d_name, pmu->name, ent->d_name);
2721                         e.name  = name;
2722                         e.check = test__checkevent_pmu_events_mix;
2723                         test_ret = test_event(&e);
2724                         if (test_ret != TEST_OK) {
2725                                 pr_debug("Test PMU event failed for '%s'", name);
2726                                 ret = combine_test_results(ret, test_ret);
2727                         }
2728                 }
2729
2730                 closedir(dir);
2731         }
2732         return ret;
2733 }
2734
2735 static int test__pmu_events2(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
2736 {
2737         return test_events(test__events_pmu, ARRAY_SIZE(test__events_pmu));
2738 }
2739
2740 static bool test_alias(char **event, char **alias)
2741 {
2742         char path[PATH_MAX];
2743         DIR *dir;
2744         struct dirent *dent;
2745         const char *sysfs = sysfs__mountpoint();
2746         char buf[128];
2747         FILE *file;
2748
2749         if (!sysfs)
2750                 return false;
2751
2752         snprintf(path, PATH_MAX, "%s/bus/event_source/devices/", sysfs);
2753         dir = opendir(path);
2754         if (!dir)
2755                 return false;
2756
2757         while ((dent = readdir(dir))) {
2758                 if (!strcmp(dent->d_name, ".") ||
2759                     !strcmp(dent->d_name, ".."))
2760                         continue;
2761
2762                 snprintf(path, PATH_MAX, "%s/bus/event_source/devices/%s/alias",
2763                          sysfs, dent->d_name);
2764
2765                 if (!file_available(path))
2766                         continue;
2767
2768                 file = fopen(path, "r");
2769                 if (!file)
2770                         continue;
2771
2772                 if (!fgets(buf, sizeof(buf), file)) {
2773                         fclose(file);
2774                         continue;
2775                 }
2776
2777                 /* Remove the last '\n' */
2778                 buf[strlen(buf) - 1] = 0;
2779
2780                 fclose(file);
2781                 *event = strdup(dent->d_name);
2782                 *alias = strdup(buf);
2783                 closedir(dir);
2784
2785                 if (*event == NULL || *alias == NULL) {
2786                         free(*event);
2787                         free(*alias);
2788                         return false;
2789                 }
2790
2791                 return true;
2792         }
2793
2794         closedir(dir);
2795         return false;
2796 }
2797
2798 static int test__checkevent_pmu_events_alias(struct evlist *evlist)
2799 {
2800         struct evsel *evsel1 = evlist__first(evlist);
2801         struct evsel *evsel2 = evlist__last(evlist);
2802
2803         TEST_ASSERT_VAL("wrong type", evsel1->core.attr.type == evsel2->core.attr.type);
2804         TEST_ASSERT_VAL("wrong config", evsel1->core.attr.config == evsel2->core.attr.config);
2805         return TEST_OK;
2806 }
2807
2808 static int test__pmu_events_alias(char *event, char *alias)
2809 {
2810         struct evlist_test e = { .name = NULL, };
2811         char name[2 * NAME_MAX + 20];
2812
2813         snprintf(name, sizeof(name), "%s/event=1/,%s/event=1/",
2814                  event, alias);
2815
2816         e.name  = name;
2817         e.check = test__checkevent_pmu_events_alias;
2818         return test_event(&e);
2819 }
2820
2821 static int test__alias(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
2822 {
2823         char *event, *alias;
2824         int ret;
2825
2826         if (!test_alias(&event, &alias))
2827                 return TEST_SKIP;
2828
2829         ret = test__pmu_events_alias(event, alias);
2830
2831         free(event);
2832         free(alias);
2833         return ret;
2834 }
2835
2836 static int test__pmu_events_alias2(struct test_suite *test __maybe_unused,
2837                                    int subtest __maybe_unused)
2838 {
2839         static const char events[][30] = {
2840                         "event-hyphen",
2841                         "event-two-hyph",
2842         };
2843         int ret = TEST_OK;
2844
2845         for (unsigned int i = 0; i < ARRAY_SIZE(events); i++) {
2846                 int test_ret = test_event_fake_pmu(&events[i][0]);
2847
2848                 if (test_ret != TEST_OK) {
2849                         pr_debug("check_parse_fake %s failed\n", &events[i][0]);
2850                         ret = combine_test_results(ret, test_ret);
2851                 }
2852         }
2853
2854         return ret;
2855 }
2856
2857 static struct test_case tests__parse_events[] = {
2858         TEST_CASE_REASON("Test event parsing",
2859                          events2,
2860                          "permissions"),
2861         TEST_CASE_REASON("Parsing of all PMU events from sysfs",
2862                          pmu_events,
2863                          "permissions"),
2864         TEST_CASE_REASON("Parsing of given PMU events from sysfs",
2865                          pmu_events2,
2866                          "permissions"),
2867         TEST_CASE_REASON("Parsing of aliased events from sysfs", alias,
2868                          "no aliases in sysfs"),
2869         TEST_CASE("Parsing of aliased events", pmu_events_alias2),
2870         TEST_CASE("Parsing of terms (event modifiers)", terms2),
2871         {       .name = NULL, }
2872 };
2873
2874 struct test_suite suite__parse_events = {
2875         .desc = "Parse event definition strings",
2876         .test_cases = tests__parse_events,
2877 };
This page took 0.191856 seconds and 4 git commands to generate.