cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

parse-events.c (83160B)


      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 "pmu-hybrid.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#if defined(__s390x__)
     24/* Return true if kvm module is available and loaded. Test this
     25 * and return success when trace point kvm_s390_create_vm
     26 * exists. Otherwise this test always fails.
     27 */
     28static bool kvm_s390_create_vm_valid(void)
     29{
     30	char *eventfile;
     31	bool rc = false;
     32
     33	eventfile = get_events_file("kvm-s390");
     34
     35	if (eventfile) {
     36		DIR *mydir = opendir(eventfile);
     37
     38		if (mydir) {
     39			rc = true;
     40			closedir(mydir);
     41		}
     42		put_events_file(eventfile);
     43	}
     44
     45	return rc;
     46}
     47#endif
     48
     49static int test__checkevent_tracepoint(struct evlist *evlist)
     50{
     51	struct evsel *evsel = evlist__first(evlist);
     52
     53	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
     54	TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->core.nr_groups);
     55	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->core.attr.type);
     56	TEST_ASSERT_VAL("wrong sample_type",
     57		PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type);
     58	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->core.attr.sample_period);
     59	return TEST_OK;
     60}
     61
     62static int test__checkevent_tracepoint_multi(struct evlist *evlist)
     63{
     64	struct evsel *evsel;
     65
     66	TEST_ASSERT_VAL("wrong number of entries", evlist->core.nr_entries > 1);
     67	TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->core.nr_groups);
     68
     69	evlist__for_each_entry(evlist, evsel) {
     70		TEST_ASSERT_VAL("wrong type",
     71			PERF_TYPE_TRACEPOINT == evsel->core.attr.type);
     72		TEST_ASSERT_VAL("wrong sample_type",
     73			PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type);
     74		TEST_ASSERT_VAL("wrong sample_period",
     75			1 == evsel->core.attr.sample_period);
     76	}
     77	return TEST_OK;
     78}
     79
     80static int test__checkevent_raw(struct evlist *evlist)
     81{
     82	struct evsel *evsel = evlist__first(evlist);
     83
     84	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
     85	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
     86	TEST_ASSERT_VAL("wrong config", 0x1a == evsel->core.attr.config);
     87	return TEST_OK;
     88}
     89
     90static int test__checkevent_numeric(struct evlist *evlist)
     91{
     92	struct evsel *evsel = evlist__first(evlist);
     93
     94	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
     95	TEST_ASSERT_VAL("wrong type", 1 == evsel->core.attr.type);
     96	TEST_ASSERT_VAL("wrong config", 1 == evsel->core.attr.config);
     97	return TEST_OK;
     98}
     99
    100static int test__checkevent_symbolic_name(struct evlist *evlist)
    101{
    102	struct evsel *evsel = evlist__first(evlist);
    103
    104	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
    105	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    106	TEST_ASSERT_VAL("wrong config",
    107			PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config);
    108	return TEST_OK;
    109}
    110
    111static int test__checkevent_symbolic_name_config(struct evlist *evlist)
    112{
    113	struct evsel *evsel = evlist__first(evlist);
    114
    115	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
    116	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    117	TEST_ASSERT_VAL("wrong config",
    118			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
    119	/*
    120	 * The period value gets configured within evlist__config,
    121	 * while this test executes only parse events method.
    122	 */
    123	TEST_ASSERT_VAL("wrong period",
    124			0 == evsel->core.attr.sample_period);
    125	TEST_ASSERT_VAL("wrong config1",
    126			0 == evsel->core.attr.config1);
    127	TEST_ASSERT_VAL("wrong config2",
    128			1 == evsel->core.attr.config2);
    129	return TEST_OK;
    130}
    131
    132static int test__checkevent_symbolic_alias(struct evlist *evlist)
    133{
    134	struct evsel *evsel = evlist__first(evlist);
    135
    136	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
    137	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
    138	TEST_ASSERT_VAL("wrong config",
    139			PERF_COUNT_SW_PAGE_FAULTS == evsel->core.attr.config);
    140	return TEST_OK;
    141}
    142
    143static int test__checkevent_genhw(struct evlist *evlist)
    144{
    145	struct evsel *evsel = evlist__first(evlist);
    146
    147	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
    148	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->core.attr.type);
    149	TEST_ASSERT_VAL("wrong config", (1 << 16) == evsel->core.attr.config);
    150	return TEST_OK;
    151}
    152
    153static int test__checkevent_breakpoint(struct evlist *evlist)
    154{
    155	struct evsel *evsel = evlist__first(evlist);
    156
    157	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
    158	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
    159	TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config);
    160	TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
    161					 evsel->core.attr.bp_type);
    162	TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_4 ==
    163					evsel->core.attr.bp_len);
    164	return TEST_OK;
    165}
    166
    167static int test__checkevent_breakpoint_x(struct evlist *evlist)
    168{
    169	struct evsel *evsel = evlist__first(evlist);
    170
    171	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
    172	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
    173	TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config);
    174	TEST_ASSERT_VAL("wrong bp_type",
    175			HW_BREAKPOINT_X == evsel->core.attr.bp_type);
    176	TEST_ASSERT_VAL("wrong bp_len", sizeof(long) == evsel->core.attr.bp_len);
    177	return TEST_OK;
    178}
    179
    180static int test__checkevent_breakpoint_r(struct evlist *evlist)
    181{
    182	struct evsel *evsel = evlist__first(evlist);
    183
    184	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
    185	TEST_ASSERT_VAL("wrong type",
    186			PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
    187	TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config);
    188	TEST_ASSERT_VAL("wrong bp_type",
    189			HW_BREAKPOINT_R == evsel->core.attr.bp_type);
    190	TEST_ASSERT_VAL("wrong bp_len",
    191			HW_BREAKPOINT_LEN_4 == evsel->core.attr.bp_len);
    192	return TEST_OK;
    193}
    194
    195static int test__checkevent_breakpoint_w(struct evlist *evlist)
    196{
    197	struct evsel *evsel = evlist__first(evlist);
    198
    199	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
    200	TEST_ASSERT_VAL("wrong type",
    201			PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
    202	TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config);
    203	TEST_ASSERT_VAL("wrong bp_type",
    204			HW_BREAKPOINT_W == evsel->core.attr.bp_type);
    205	TEST_ASSERT_VAL("wrong bp_len",
    206			HW_BREAKPOINT_LEN_4 == evsel->core.attr.bp_len);
    207	return TEST_OK;
    208}
    209
    210static int test__checkevent_breakpoint_rw(struct evlist *evlist)
    211{
    212	struct evsel *evsel = evlist__first(evlist);
    213
    214	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
    215	TEST_ASSERT_VAL("wrong type",
    216			PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
    217	TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config);
    218	TEST_ASSERT_VAL("wrong bp_type",
    219		(HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->core.attr.bp_type);
    220	TEST_ASSERT_VAL("wrong bp_len",
    221			HW_BREAKPOINT_LEN_4 == evsel->core.attr.bp_len);
    222	return TEST_OK;
    223}
    224
    225static int test__checkevent_tracepoint_modifier(struct evlist *evlist)
    226{
    227	struct evsel *evsel = evlist__first(evlist);
    228
    229	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    230	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    231	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    232	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    233
    234	return test__checkevent_tracepoint(evlist);
    235}
    236
    237static int
    238test__checkevent_tracepoint_multi_modifier(struct evlist *evlist)
    239{
    240	struct evsel *evsel;
    241
    242	TEST_ASSERT_VAL("wrong number of entries", evlist->core.nr_entries > 1);
    243
    244	evlist__for_each_entry(evlist, evsel) {
    245		TEST_ASSERT_VAL("wrong exclude_user",
    246				!evsel->core.attr.exclude_user);
    247		TEST_ASSERT_VAL("wrong exclude_kernel",
    248				evsel->core.attr.exclude_kernel);
    249		TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    250		TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    251	}
    252
    253	return test__checkevent_tracepoint_multi(evlist);
    254}
    255
    256static int test__checkevent_raw_modifier(struct evlist *evlist)
    257{
    258	struct evsel *evsel = evlist__first(evlist);
    259
    260	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    261	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    262	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    263	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
    264
    265	return test__checkevent_raw(evlist);
    266}
    267
    268static int test__checkevent_numeric_modifier(struct evlist *evlist)
    269{
    270	struct evsel *evsel = evlist__first(evlist);
    271
    272	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    273	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
    274	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
    275	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
    276
    277	return test__checkevent_numeric(evlist);
    278}
    279
    280static int test__checkevent_symbolic_name_modifier(struct evlist *evlist)
    281{
    282	struct evsel *evsel = evlist__first(evlist);
    283
    284	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    285	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
    286	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
    287	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    288
    289	return test__checkevent_symbolic_name(evlist);
    290}
    291
    292static int test__checkevent_exclude_host_modifier(struct evlist *evlist)
    293{
    294	struct evsel *evsel = evlist__first(evlist);
    295
    296	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
    297	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
    298
    299	return test__checkevent_symbolic_name(evlist);
    300}
    301
    302static int test__checkevent_exclude_guest_modifier(struct evlist *evlist)
    303{
    304	struct evsel *evsel = evlist__first(evlist);
    305
    306	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
    307	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
    308
    309	return test__checkevent_symbolic_name(evlist);
    310}
    311
    312static int test__checkevent_symbolic_alias_modifier(struct evlist *evlist)
    313{
    314	struct evsel *evsel = evlist__first(evlist);
    315
    316	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    317	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
    318	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    319	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    320
    321	return test__checkevent_symbolic_alias(evlist);
    322}
    323
    324static int test__checkevent_genhw_modifier(struct evlist *evlist)
    325{
    326	struct evsel *evsel = evlist__first(evlist);
    327
    328	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    329	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    330	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    331	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
    332
    333	return test__checkevent_genhw(evlist);
    334}
    335
    336static int test__checkevent_exclude_idle_modifier(struct evlist *evlist)
    337{
    338	struct evsel *evsel = evlist__first(evlist);
    339
    340	TEST_ASSERT_VAL("wrong exclude idle", evsel->core.attr.exclude_idle);
    341	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
    342	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
    343	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    344	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    345	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
    346	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    347
    348	return test__checkevent_symbolic_name(evlist);
    349}
    350
    351static int test__checkevent_exclude_idle_modifier_1(struct evlist *evlist)
    352{
    353	struct evsel *evsel = evlist__first(evlist);
    354
    355	TEST_ASSERT_VAL("wrong exclude idle", evsel->core.attr.exclude_idle);
    356	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
    357	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
    358	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    359	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    360	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    361	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    362
    363	return test__checkevent_symbolic_name(evlist);
    364}
    365
    366static int test__checkevent_breakpoint_modifier(struct evlist *evlist)
    367{
    368	struct evsel *evsel = evlist__first(evlist);
    369
    370
    371	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    372	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
    373	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    374	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    375	TEST_ASSERT_VAL("wrong name",
    376			!strcmp(evsel__name(evsel), "mem:0:u"));
    377
    378	return test__checkevent_breakpoint(evlist);
    379}
    380
    381static int test__checkevent_breakpoint_x_modifier(struct evlist *evlist)
    382{
    383	struct evsel *evsel = evlist__first(evlist);
    384
    385	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    386	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    387	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    388	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    389	TEST_ASSERT_VAL("wrong name",
    390			!strcmp(evsel__name(evsel), "mem:0:x:k"));
    391
    392	return test__checkevent_breakpoint_x(evlist);
    393}
    394
    395static int test__checkevent_breakpoint_r_modifier(struct evlist *evlist)
    396{
    397	struct evsel *evsel = evlist__first(evlist);
    398
    399	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    400	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
    401	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
    402	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
    403	TEST_ASSERT_VAL("wrong name",
    404			!strcmp(evsel__name(evsel), "mem:0:r:hp"));
    405
    406	return test__checkevent_breakpoint_r(evlist);
    407}
    408
    409static int test__checkevent_breakpoint_w_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	TEST_ASSERT_VAL("wrong name",
    418			!strcmp(evsel__name(evsel), "mem:0:w:up"));
    419
    420	return test__checkevent_breakpoint_w(evlist);
    421}
    422
    423static int test__checkevent_breakpoint_rw_modifier(struct evlist *evlist)
    424{
    425	struct evsel *evsel = evlist__first(evlist);
    426
    427	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    428	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    429	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    430	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
    431	TEST_ASSERT_VAL("wrong name",
    432			!strcmp(evsel__name(evsel), "mem:0:rw:kp"));
    433
    434	return test__checkevent_breakpoint_rw(evlist);
    435}
    436
    437static int test__checkevent_pmu(struct evlist *evlist)
    438{
    439
    440	struct evsel *evsel = evlist__first(evlist);
    441
    442	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
    443	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
    444	TEST_ASSERT_VAL("wrong config",    10 == evsel->core.attr.config);
    445	TEST_ASSERT_VAL("wrong config1",    1 == evsel->core.attr.config1);
    446	TEST_ASSERT_VAL("wrong config2",    3 == evsel->core.attr.config2);
    447	/*
    448	 * The period value gets configured within evlist__config,
    449	 * while this test executes only parse events method.
    450	 */
    451	TEST_ASSERT_VAL("wrong period",     0 == evsel->core.attr.sample_period);
    452
    453	return TEST_OK;
    454}
    455
    456static int test__checkevent_list(struct evlist *evlist)
    457{
    458	struct evsel *evsel = evlist__first(evlist);
    459
    460	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
    461
    462	/* r1 */
    463	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
    464	TEST_ASSERT_VAL("wrong config", 1 == evsel->core.attr.config);
    465	TEST_ASSERT_VAL("wrong config1", 0 == evsel->core.attr.config1);
    466	TEST_ASSERT_VAL("wrong config2", 0 == evsel->core.attr.config2);
    467	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    468	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    469	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
    470	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    471
    472	/* syscalls:sys_enter_openat:k */
    473	evsel = evsel__next(evsel);
    474	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->core.attr.type);
    475	TEST_ASSERT_VAL("wrong sample_type",
    476		PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type);
    477	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->core.attr.sample_period);
    478	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    479	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    480	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    481	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    482
    483	/* 1:1:hp */
    484	evsel = evsel__next(evsel);
    485	TEST_ASSERT_VAL("wrong type", 1 == evsel->core.attr.type);
    486	TEST_ASSERT_VAL("wrong config", 1 == evsel->core.attr.config);
    487	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    488	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
    489	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
    490	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
    491
    492	return TEST_OK;
    493}
    494
    495static int test__checkevent_pmu_name(struct evlist *evlist)
    496{
    497	struct evsel *evsel = evlist__first(evlist);
    498
    499	/* cpu/config=1,name=krava/u */
    500	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
    501	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
    502	TEST_ASSERT_VAL("wrong config",  1 == evsel->core.attr.config);
    503	TEST_ASSERT_VAL("wrong name", !strcmp(evsel__name(evsel), "krava"));
    504
    505	/* cpu/config=2/u" */
    506	evsel = evsel__next(evsel);
    507	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
    508	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
    509	TEST_ASSERT_VAL("wrong config",  2 == evsel->core.attr.config);
    510	TEST_ASSERT_VAL("wrong name",
    511			!strcmp(evsel__name(evsel), "cpu/config=2/u"));
    512
    513	return TEST_OK;
    514}
    515
    516static int test__checkevent_pmu_partial_time_callgraph(struct evlist *evlist)
    517{
    518	struct evsel *evsel = evlist__first(evlist);
    519
    520	/* cpu/config=1,call-graph=fp,time,period=100000/ */
    521	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
    522	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
    523	TEST_ASSERT_VAL("wrong config",  1 == evsel->core.attr.config);
    524	/*
    525	 * The period, time and callgraph value gets configured within evlist__config,
    526	 * while this test executes only parse events method.
    527	 */
    528	TEST_ASSERT_VAL("wrong period",     0 == evsel->core.attr.sample_period);
    529	TEST_ASSERT_VAL("wrong callgraph",  !evsel__has_callchain(evsel));
    530	TEST_ASSERT_VAL("wrong time",  !(PERF_SAMPLE_TIME & evsel->core.attr.sample_type));
    531
    532	/* cpu/config=2,call-graph=no,time=0,period=2000/ */
    533	evsel = evsel__next(evsel);
    534	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
    535	TEST_ASSERT_VAL("wrong config",  2 == evsel->core.attr.config);
    536	/*
    537	 * The period, time and callgraph value gets configured within evlist__config,
    538	 * while this test executes only parse events method.
    539	 */
    540	TEST_ASSERT_VAL("wrong period",     0 == evsel->core.attr.sample_period);
    541	TEST_ASSERT_VAL("wrong callgraph",  !evsel__has_callchain(evsel));
    542	TEST_ASSERT_VAL("wrong time",  !(PERF_SAMPLE_TIME & evsel->core.attr.sample_type));
    543
    544	return TEST_OK;
    545}
    546
    547static int test__checkevent_pmu_events(struct evlist *evlist)
    548{
    549	struct evsel *evsel = evlist__first(evlist);
    550
    551	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
    552	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
    553	TEST_ASSERT_VAL("wrong exclude_user",
    554			!evsel->core.attr.exclude_user);
    555	TEST_ASSERT_VAL("wrong exclude_kernel",
    556			evsel->core.attr.exclude_kernel);
    557	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    558	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    559	TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
    560	TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
    561
    562	return TEST_OK;
    563}
    564
    565
    566static int test__checkevent_pmu_events_mix(struct evlist *evlist)
    567{
    568	struct evsel *evsel = evlist__first(evlist);
    569
    570	/* pmu-event:u */
    571	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
    572	TEST_ASSERT_VAL("wrong exclude_user",
    573			!evsel->core.attr.exclude_user);
    574	TEST_ASSERT_VAL("wrong exclude_kernel",
    575			evsel->core.attr.exclude_kernel);
    576	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    577	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    578	TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
    579	TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
    580
    581	/* cpu/pmu-event/u*/
    582	evsel = evsel__next(evsel);
    583	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
    584	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
    585	TEST_ASSERT_VAL("wrong exclude_user",
    586			!evsel->core.attr.exclude_user);
    587	TEST_ASSERT_VAL("wrong exclude_kernel",
    588			evsel->core.attr.exclude_kernel);
    589	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    590	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    591	TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
    592	TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.pinned);
    593
    594	return TEST_OK;
    595}
    596
    597static int test__checkterms_simple(struct list_head *terms)
    598{
    599	struct parse_events_term *term;
    600
    601	/* config=10 */
    602	term = list_entry(terms->next, struct parse_events_term, list);
    603	TEST_ASSERT_VAL("wrong type term",
    604			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG);
    605	TEST_ASSERT_VAL("wrong type val",
    606			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
    607	TEST_ASSERT_VAL("wrong val", term->val.num == 10);
    608	TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "config"));
    609
    610	/* config1 */
    611	term = list_entry(term->list.next, struct parse_events_term, list);
    612	TEST_ASSERT_VAL("wrong type term",
    613			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG1);
    614	TEST_ASSERT_VAL("wrong type val",
    615			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
    616	TEST_ASSERT_VAL("wrong val", term->val.num == 1);
    617	TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "config1"));
    618
    619	/* config2=3 */
    620	term = list_entry(term->list.next, struct parse_events_term, list);
    621	TEST_ASSERT_VAL("wrong type term",
    622			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG2);
    623	TEST_ASSERT_VAL("wrong type val",
    624			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
    625	TEST_ASSERT_VAL("wrong val", term->val.num == 3);
    626	TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "config2"));
    627
    628	/* umask=1*/
    629	term = list_entry(term->list.next, struct parse_events_term, list);
    630	TEST_ASSERT_VAL("wrong type term",
    631			term->type_term == PARSE_EVENTS__TERM_TYPE_USER);
    632	TEST_ASSERT_VAL("wrong type val",
    633			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
    634	TEST_ASSERT_VAL("wrong val", term->val.num == 1);
    635	TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "umask"));
    636
    637	/*
    638	 * read
    639	 *
    640	 * The perf_pmu__test_parse_init injects 'read' term into
    641	 * perf_pmu_events_list, so 'read' is evaluated as read term
    642	 * and not as raw event with 'ead' hex value.
    643	 */
    644	term = list_entry(term->list.next, struct parse_events_term, list);
    645	TEST_ASSERT_VAL("wrong type term",
    646			term->type_term == PARSE_EVENTS__TERM_TYPE_USER);
    647	TEST_ASSERT_VAL("wrong type val",
    648			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
    649	TEST_ASSERT_VAL("wrong val", term->val.num == 1);
    650	TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "read"));
    651
    652	/*
    653	 * r0xead
    654	 *
    655	 * To be still able to pass 'ead' value with 'r' syntax,
    656	 * we added support to parse 'r0xHEX' event.
    657	 */
    658	term = list_entry(term->list.next, struct parse_events_term, list);
    659	TEST_ASSERT_VAL("wrong type term",
    660			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG);
    661	TEST_ASSERT_VAL("wrong type val",
    662			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
    663	TEST_ASSERT_VAL("wrong val", term->val.num == 0xead);
    664	TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "config"));
    665	return TEST_OK;
    666}
    667
    668static int test__group1(struct evlist *evlist)
    669{
    670	struct evsel *evsel, *leader;
    671
    672	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
    673	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->core.nr_groups);
    674
    675	/* instructions:k */
    676	evsel = leader = evlist__first(evlist);
    677	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    678	TEST_ASSERT_VAL("wrong config",
    679			PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config);
    680	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    681	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    682	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    683	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
    684	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
    685	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    686	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
    687	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
    688	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
    689	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    690
    691	/* cycles:upp */
    692	evsel = evsel__next(evsel);
    693	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    694	TEST_ASSERT_VAL("wrong config",
    695			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
    696	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    697	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
    698	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    699	/* use of precise requires exclude_guest */
    700	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
    701	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
    702	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 2);
    703	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
    704	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
    705	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    706
    707	return TEST_OK;
    708}
    709
    710static int test__group2(struct evlist *evlist)
    711{
    712	struct evsel *evsel, *leader;
    713
    714	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
    715	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->core.nr_groups);
    716
    717	/* faults + :ku modifier */
    718	evsel = leader = evlist__first(evlist);
    719	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
    720	TEST_ASSERT_VAL("wrong config",
    721			PERF_COUNT_SW_PAGE_FAULTS == evsel->core.attr.config);
    722	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    723	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    724	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    725	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
    726	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
    727	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    728	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
    729	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
    730	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
    731	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    732
    733	/* cache-references + :u modifier */
    734	evsel = evsel__next(evsel);
    735	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    736	TEST_ASSERT_VAL("wrong config",
    737			PERF_COUNT_HW_CACHE_REFERENCES == evsel->core.attr.config);
    738	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    739	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
    740	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    741	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
    742	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
    743	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    744	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
    745	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
    746	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    747
    748	/* cycles:k */
    749	evsel = evsel__next(evsel);
    750	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    751	TEST_ASSERT_VAL("wrong config",
    752			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
    753	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    754	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    755	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    756	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
    757	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
    758	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    759	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
    760	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    761
    762	return TEST_OK;
    763}
    764
    765static int test__group3(struct evlist *evlist __maybe_unused)
    766{
    767	struct evsel *evsel, *leader;
    768
    769	TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->core.nr_entries);
    770	TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->core.nr_groups);
    771
    772	/* group1 syscalls:sys_enter_openat:H */
    773	evsel = leader = evlist__first(evlist);
    774	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->core.attr.type);
    775	TEST_ASSERT_VAL("wrong sample_type",
    776		PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type);
    777	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->core.attr.sample_period);
    778	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    779	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    780	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
    781	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
    782	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
    783	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    784	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
    785	TEST_ASSERT_VAL("wrong group name",
    786		!strcmp(leader->group_name, "group1"));
    787	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
    788	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
    789	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    790
    791	/* group1 cycles:kppp */
    792	evsel = evsel__next(evsel);
    793	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    794	TEST_ASSERT_VAL("wrong config",
    795			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
    796	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    797	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    798	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    799	/* use of precise requires exclude_guest */
    800	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
    801	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
    802	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 3);
    803	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
    804	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
    805	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
    806	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    807
    808	/* group2 cycles + G modifier */
    809	evsel = leader = evsel__next(evsel);
    810	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    811	TEST_ASSERT_VAL("wrong config",
    812			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
    813	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    814	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    815	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
    816	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
    817	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
    818	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    819	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
    820	TEST_ASSERT_VAL("wrong group name",
    821		!strcmp(leader->group_name, "group2"));
    822	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
    823	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
    824	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    825
    826	/* group2 1:3 + G modifier */
    827	evsel = evsel__next(evsel);
    828	TEST_ASSERT_VAL("wrong type", 1 == evsel->core.attr.type);
    829	TEST_ASSERT_VAL("wrong config", 3 == evsel->core.attr.config);
    830	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    831	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    832	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
    833	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
    834	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
    835	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    836	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
    837	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
    838	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    839
    840	/* instructions:u */
    841	evsel = evsel__next(evsel);
    842	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    843	TEST_ASSERT_VAL("wrong config",
    844			PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config);
    845	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    846	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
    847	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    848	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
    849	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
    850	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    851	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
    852	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    853
    854	return TEST_OK;
    855}
    856
    857static int test__group4(struct evlist *evlist __maybe_unused)
    858{
    859	struct evsel *evsel, *leader;
    860
    861	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
    862	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->core.nr_groups);
    863
    864	/* cycles:u + p */
    865	evsel = leader = evlist__first(evlist);
    866	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    867	TEST_ASSERT_VAL("wrong config",
    868			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
    869	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    870	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
    871	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    872	/* use of precise requires exclude_guest */
    873	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
    874	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
    875	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 1);
    876	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
    877	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
    878	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
    879	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
    880	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    881
    882	/* instructions:kp + p */
    883	evsel = evsel__next(evsel);
    884	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    885	TEST_ASSERT_VAL("wrong config",
    886			PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config);
    887	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
    888	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    889	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
    890	/* use of precise requires exclude_guest */
    891	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
    892	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
    893	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 2);
    894	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
    895	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
    896	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    897
    898	return TEST_OK;
    899}
    900
    901static int test__group5(struct evlist *evlist __maybe_unused)
    902{
    903	struct evsel *evsel, *leader;
    904
    905	TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->core.nr_entries);
    906	TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->core.nr_groups);
    907
    908	/* cycles + G */
    909	evsel = leader = evlist__first(evlist);
    910	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    911	TEST_ASSERT_VAL("wrong config",
    912			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
    913	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    914	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    915	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
    916	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
    917	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
    918	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    919	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
    920	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
    921	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
    922	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
    923	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    924
    925	/* instructions + G */
    926	evsel = evsel__next(evsel);
    927	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    928	TEST_ASSERT_VAL("wrong config",
    929			PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config);
    930	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    931	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    932	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
    933	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
    934	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
    935	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    936	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
    937	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
    938	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    939
    940	/* cycles:G */
    941	evsel = leader = evsel__next(evsel);
    942	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    943	TEST_ASSERT_VAL("wrong config",
    944			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
    945	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    946	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    947	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
    948	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
    949	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
    950	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    951	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
    952	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
    953	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
    954	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
    955	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
    956
    957	/* instructions:G */
    958	evsel = evsel__next(evsel);
    959	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    960	TEST_ASSERT_VAL("wrong config",
    961			PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config);
    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__has_leader(evsel, leader));
    969	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
    970
    971	/* cycles */
    972	evsel = evsel__next(evsel);
    973	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    974	TEST_ASSERT_VAL("wrong config",
    975			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
    976	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
    977	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
    978	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
    979	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
    980	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
    981	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
    982	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
    983
    984	return TEST_OK;
    985}
    986
    987static int test__group_gh1(struct evlist *evlist)
    988{
    989	struct evsel *evsel, *leader;
    990
    991	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
    992	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->core.nr_groups);
    993
    994	/* cycles + :H group modifier */
    995	evsel = leader = evlist__first(evlist);
    996	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
    997	TEST_ASSERT_VAL("wrong config",
    998			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
    999	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1000	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
   1001	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
   1002	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
   1003	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
   1004	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
   1005	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
   1006	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
   1007	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
   1008	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
   1009
   1010	/* cache-misses:G + :H group modifier */
   1011	evsel = evsel__next(evsel);
   1012	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1013	TEST_ASSERT_VAL("wrong config",
   1014			PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
   1015	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1016	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
   1017	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
   1018	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
   1019	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
   1020	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
   1021	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1022	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
   1023
   1024	return TEST_OK;
   1025}
   1026
   1027static int test__group_gh2(struct evlist *evlist)
   1028{
   1029	struct evsel *evsel, *leader;
   1030
   1031	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
   1032	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->core.nr_groups);
   1033
   1034	/* cycles + :G group modifier */
   1035	evsel = leader = evlist__first(evlist);
   1036	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1037	TEST_ASSERT_VAL("wrong config",
   1038			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
   1039	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1040	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
   1041	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
   1042	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
   1043	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
   1044	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
   1045	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
   1046	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
   1047	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
   1048	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
   1049
   1050	/* cache-misses:H + :G group modifier */
   1051	evsel = evsel__next(evsel);
   1052	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1053	TEST_ASSERT_VAL("wrong config",
   1054			PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
   1055	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1056	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
   1057	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
   1058	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
   1059	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
   1060	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
   1061	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1062	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
   1063
   1064	return TEST_OK;
   1065}
   1066
   1067static int test__group_gh3(struct evlist *evlist)
   1068{
   1069	struct evsel *evsel, *leader;
   1070
   1071	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
   1072	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->core.nr_groups);
   1073
   1074	/* cycles:G + :u group modifier */
   1075	evsel = leader = evlist__first(evlist);
   1076	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1077	TEST_ASSERT_VAL("wrong config",
   1078			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
   1079	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1080	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
   1081	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
   1082	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
   1083	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
   1084	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
   1085	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
   1086	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
   1087	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
   1088	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
   1089
   1090	/* cache-misses:H + :u group modifier */
   1091	evsel = evsel__next(evsel);
   1092	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1093	TEST_ASSERT_VAL("wrong config",
   1094			PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
   1095	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1096	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
   1097	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
   1098	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
   1099	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
   1100	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
   1101	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1102	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
   1103
   1104	return TEST_OK;
   1105}
   1106
   1107static int test__group_gh4(struct evlist *evlist)
   1108{
   1109	struct evsel *evsel, *leader;
   1110
   1111	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
   1112	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->core.nr_groups);
   1113
   1114	/* cycles:G + :uG group modifier */
   1115	evsel = leader = evlist__first(evlist);
   1116	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1117	TEST_ASSERT_VAL("wrong config",
   1118			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
   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);
   1125	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
   1126	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
   1127	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
   1128	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
   1129
   1130	/* cache-misses:H + :uG group modifier */
   1131	evsel = evsel__next(evsel);
   1132	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1133	TEST_ASSERT_VAL("wrong config",
   1134			PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
   1135	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1136	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
   1137	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
   1138	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
   1139	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
   1140	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
   1141	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1142	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
   1143
   1144	return TEST_OK;
   1145}
   1146
   1147static int test__leader_sample1(struct evlist *evlist)
   1148{
   1149	struct evsel *evsel, *leader;
   1150
   1151	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
   1152
   1153	/* cycles - sampling group leader */
   1154	evsel = leader = evlist__first(evlist);
   1155	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1156	TEST_ASSERT_VAL("wrong config",
   1157			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
   1158	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1159	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
   1160	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
   1161	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
   1162	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
   1163	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
   1164	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
   1165	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1166	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
   1167
   1168	/* cache-misses - not sampling */
   1169	evsel = evsel__next(evsel);
   1170	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1171	TEST_ASSERT_VAL("wrong config",
   1172			PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
   1173	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1174	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
   1175	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
   1176	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
   1177	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
   1178	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
   1179	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1180	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
   1181
   1182	/* branch-misses - not sampling */
   1183	evsel = evsel__next(evsel);
   1184	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1185	TEST_ASSERT_VAL("wrong config",
   1186			PERF_COUNT_HW_BRANCH_MISSES == evsel->core.attr.config);
   1187	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1188	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
   1189	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
   1190	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
   1191	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
   1192	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
   1193	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
   1194	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1195	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
   1196
   1197	return TEST_OK;
   1198}
   1199
   1200static int test__leader_sample2(struct evlist *evlist __maybe_unused)
   1201{
   1202	struct evsel *evsel, *leader;
   1203
   1204	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
   1205
   1206	/* instructions - sampling group leader */
   1207	evsel = leader = evlist__first(evlist);
   1208	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1209	TEST_ASSERT_VAL("wrong config",
   1210			PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config);
   1211	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1212	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
   1213	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
   1214	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
   1215	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
   1216	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
   1217	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
   1218	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1219	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
   1220
   1221	/* branch-misses - not sampling */
   1222	evsel = evsel__next(evsel);
   1223	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1224	TEST_ASSERT_VAL("wrong config",
   1225			PERF_COUNT_HW_BRANCH_MISSES == evsel->core.attr.config);
   1226	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1227	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
   1228	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
   1229	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
   1230	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
   1231	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
   1232	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
   1233	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1234	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
   1235
   1236	return TEST_OK;
   1237}
   1238
   1239static int test__checkevent_pinned_modifier(struct evlist *evlist)
   1240{
   1241	struct evsel *evsel = evlist__first(evlist);
   1242
   1243	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1244	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
   1245	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
   1246	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
   1247	TEST_ASSERT_VAL("wrong pinned", evsel->core.attr.pinned);
   1248
   1249	return test__checkevent_symbolic_name(evlist);
   1250}
   1251
   1252static int test__pinned_group(struct evlist *evlist)
   1253{
   1254	struct evsel *evsel, *leader;
   1255
   1256	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
   1257
   1258	/* cycles - group leader */
   1259	evsel = leader = evlist__first(evlist);
   1260	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1261	TEST_ASSERT_VAL("wrong config",
   1262			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
   1263	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
   1264	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1265	TEST_ASSERT_VAL("wrong pinned", evsel->core.attr.pinned);
   1266
   1267	/* cache-misses - can not be pinned, but will go on with the leader */
   1268	evsel = evsel__next(evsel);
   1269	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1270	TEST_ASSERT_VAL("wrong config",
   1271			PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
   1272	TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
   1273
   1274	/* branch-misses - ditto */
   1275	evsel = evsel__next(evsel);
   1276	TEST_ASSERT_VAL("wrong config",
   1277			PERF_COUNT_HW_BRANCH_MISSES == evsel->core.attr.config);
   1278	TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
   1279
   1280	return TEST_OK;
   1281}
   1282
   1283static int test__checkevent_exclusive_modifier(struct evlist *evlist)
   1284{
   1285	struct evsel *evsel = evlist__first(evlist);
   1286
   1287	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1288	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
   1289	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
   1290	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
   1291	TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive);
   1292
   1293	return test__checkevent_symbolic_name(evlist);
   1294}
   1295
   1296static int test__exclusive_group(struct evlist *evlist)
   1297{
   1298	struct evsel *evsel, *leader;
   1299
   1300	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
   1301
   1302	/* cycles - group leader */
   1303	evsel = leader = evlist__first(evlist);
   1304	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1305	TEST_ASSERT_VAL("wrong config",
   1306			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
   1307	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
   1308	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1309	TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive);
   1310
   1311	/* cache-misses - can not be pinned, but will go on with the leader */
   1312	evsel = evsel__next(evsel);
   1313	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
   1314	TEST_ASSERT_VAL("wrong config",
   1315			PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
   1316	TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
   1317
   1318	/* branch-misses - ditto */
   1319	evsel = evsel__next(evsel);
   1320	TEST_ASSERT_VAL("wrong config",
   1321			PERF_COUNT_HW_BRANCH_MISSES == evsel->core.attr.config);
   1322	TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
   1323
   1324	return TEST_OK;
   1325}
   1326static int test__checkevent_breakpoint_len(struct evlist *evlist)
   1327{
   1328	struct evsel *evsel = evlist__first(evlist);
   1329
   1330	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
   1331	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
   1332	TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config);
   1333	TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
   1334					 evsel->core.attr.bp_type);
   1335	TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_1 ==
   1336					evsel->core.attr.bp_len);
   1337
   1338	return TEST_OK;
   1339}
   1340
   1341static int test__checkevent_breakpoint_len_w(struct evlist *evlist)
   1342{
   1343	struct evsel *evsel = evlist__first(evlist);
   1344
   1345	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
   1346	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
   1347	TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config);
   1348	TEST_ASSERT_VAL("wrong bp_type", HW_BREAKPOINT_W ==
   1349					 evsel->core.attr.bp_type);
   1350	TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_2 ==
   1351					evsel->core.attr.bp_len);
   1352
   1353	return TEST_OK;
   1354}
   1355
   1356static int
   1357test__checkevent_breakpoint_len_rw_modifier(struct evlist *evlist)
   1358{
   1359	struct evsel *evsel = evlist__first(evlist);
   1360
   1361	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1362	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
   1363	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
   1364	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
   1365
   1366	return test__checkevent_breakpoint_rw(evlist);
   1367}
   1368
   1369static int test__checkevent_precise_max_modifier(struct evlist *evlist)
   1370{
   1371	struct evsel *evsel = evlist__first(evlist);
   1372
   1373	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
   1374	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
   1375	TEST_ASSERT_VAL("wrong config",
   1376			PERF_COUNT_SW_TASK_CLOCK == evsel->core.attr.config);
   1377	return TEST_OK;
   1378}
   1379
   1380static int test__checkevent_config_symbol(struct evlist *evlist)
   1381{
   1382	struct evsel *evsel = evlist__first(evlist);
   1383
   1384	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "insn") == 0);
   1385	return TEST_OK;
   1386}
   1387
   1388static int test__checkevent_config_raw(struct evlist *evlist)
   1389{
   1390	struct evsel *evsel = evlist__first(evlist);
   1391
   1392	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "rawpmu") == 0);
   1393	return TEST_OK;
   1394}
   1395
   1396static int test__checkevent_config_num(struct evlist *evlist)
   1397{
   1398	struct evsel *evsel = evlist__first(evlist);
   1399
   1400	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "numpmu") == 0);
   1401	return TEST_OK;
   1402}
   1403
   1404static int test__checkevent_config_cache(struct evlist *evlist)
   1405{
   1406	struct evsel *evsel = evlist__first(evlist);
   1407
   1408	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "cachepmu") == 0);
   1409	return TEST_OK;
   1410}
   1411
   1412static bool test__intel_pt_valid(void)
   1413{
   1414	return !!perf_pmu__find("intel_pt");
   1415}
   1416
   1417static int test__intel_pt(struct evlist *evlist)
   1418{
   1419	struct evsel *evsel = evlist__first(evlist);
   1420
   1421	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "intel_pt//u") == 0);
   1422	return TEST_OK;
   1423}
   1424
   1425static int test__checkevent_complex_name(struct evlist *evlist)
   1426{
   1427	struct evsel *evsel = evlist__first(evlist);
   1428
   1429	TEST_ASSERT_VAL("wrong complex name parsing", strcmp(evsel->name, "COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks") == 0);
   1430	return TEST_OK;
   1431}
   1432
   1433static int test__checkevent_raw_pmu(struct evlist *evlist)
   1434{
   1435	struct evsel *evsel = evlist__first(evlist);
   1436
   1437	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
   1438	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
   1439	TEST_ASSERT_VAL("wrong config", 0x1a == evsel->core.attr.config);
   1440	return TEST_OK;
   1441}
   1442
   1443static int test__sym_event_slash(struct evlist *evlist)
   1444{
   1445	struct evsel *evsel = evlist__first(evlist);
   1446
   1447	TEST_ASSERT_VAL("wrong type", evsel->core.attr.type == PERF_TYPE_HARDWARE);
   1448	TEST_ASSERT_VAL("wrong config", evsel->core.attr.config == PERF_COUNT_HW_CPU_CYCLES);
   1449	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
   1450	return TEST_OK;
   1451}
   1452
   1453static int test__sym_event_dc(struct evlist *evlist)
   1454{
   1455	struct evsel *evsel = evlist__first(evlist);
   1456
   1457	TEST_ASSERT_VAL("wrong type", evsel->core.attr.type == PERF_TYPE_HARDWARE);
   1458	TEST_ASSERT_VAL("wrong config", evsel->core.attr.config == PERF_COUNT_HW_CPU_CYCLES);
   1459	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
   1460	return TEST_OK;
   1461}
   1462
   1463static int count_tracepoints(void)
   1464{
   1465	struct dirent *events_ent;
   1466	DIR *events_dir;
   1467	int cnt = 0;
   1468
   1469	events_dir = tracing_events__opendir();
   1470
   1471	TEST_ASSERT_VAL("Can't open events dir", events_dir);
   1472
   1473	while ((events_ent = readdir(events_dir))) {
   1474		char *sys_path;
   1475		struct dirent *sys_ent;
   1476		DIR *sys_dir;
   1477
   1478		if (!strcmp(events_ent->d_name, ".")
   1479		    || !strcmp(events_ent->d_name, "..")
   1480		    || !strcmp(events_ent->d_name, "enable")
   1481		    || !strcmp(events_ent->d_name, "header_event")
   1482		    || !strcmp(events_ent->d_name, "header_page"))
   1483			continue;
   1484
   1485		sys_path = get_events_file(events_ent->d_name);
   1486		TEST_ASSERT_VAL("Can't get sys path", sys_path);
   1487
   1488		sys_dir = opendir(sys_path);
   1489		TEST_ASSERT_VAL("Can't open sys dir", sys_dir);
   1490
   1491		while ((sys_ent = readdir(sys_dir))) {
   1492			if (!strcmp(sys_ent->d_name, ".")
   1493			    || !strcmp(sys_ent->d_name, "..")
   1494			    || !strcmp(sys_ent->d_name, "enable")
   1495			    || !strcmp(sys_ent->d_name, "filter"))
   1496				continue;
   1497
   1498			cnt++;
   1499		}
   1500
   1501		closedir(sys_dir);
   1502		put_events_file(sys_path);
   1503	}
   1504
   1505	closedir(events_dir);
   1506	return cnt;
   1507}
   1508
   1509static int test__all_tracepoints(struct evlist *evlist)
   1510{
   1511	TEST_ASSERT_VAL("wrong events count",
   1512			count_tracepoints() == evlist->core.nr_entries);
   1513
   1514	return test__checkevent_tracepoint_multi(evlist);
   1515}
   1516
   1517static int test__hybrid_hw_event_with_pmu(struct evlist *evlist)
   1518{
   1519	struct evsel *evsel = evlist__first(evlist);
   1520
   1521	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
   1522	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
   1523	TEST_ASSERT_VAL("wrong config", 0x3c == evsel->core.attr.config);
   1524	return TEST_OK;
   1525}
   1526
   1527static int test__hybrid_hw_group_event(struct evlist *evlist)
   1528{
   1529	struct evsel *evsel, *leader;
   1530
   1531	evsel = leader = evlist__first(evlist);
   1532	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
   1533	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
   1534	TEST_ASSERT_VAL("wrong config", 0x3c == evsel->core.attr.config);
   1535	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1536
   1537	evsel = evsel__next(evsel);
   1538	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
   1539	TEST_ASSERT_VAL("wrong config", 0xc0 == evsel->core.attr.config);
   1540	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1541	return TEST_OK;
   1542}
   1543
   1544static int test__hybrid_sw_hw_group_event(struct evlist *evlist)
   1545{
   1546	struct evsel *evsel, *leader;
   1547
   1548	evsel = leader = evlist__first(evlist);
   1549	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
   1550	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
   1551	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1552
   1553	evsel = evsel__next(evsel);
   1554	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
   1555	TEST_ASSERT_VAL("wrong config", 0x3c == evsel->core.attr.config);
   1556	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1557	return TEST_OK;
   1558}
   1559
   1560static int test__hybrid_hw_sw_group_event(struct evlist *evlist)
   1561{
   1562	struct evsel *evsel, *leader;
   1563
   1564	evsel = leader = evlist__first(evlist);
   1565	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
   1566	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
   1567	TEST_ASSERT_VAL("wrong config", 0x3c == evsel->core.attr.config);
   1568	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1569
   1570	evsel = evsel__next(evsel);
   1571	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
   1572	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1573	return TEST_OK;
   1574}
   1575
   1576static int test__hybrid_group_modifier1(struct evlist *evlist)
   1577{
   1578	struct evsel *evsel, *leader;
   1579
   1580	evsel = leader = evlist__first(evlist);
   1581	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
   1582	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
   1583	TEST_ASSERT_VAL("wrong config", 0x3c == evsel->core.attr.config);
   1584	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   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
   1588	evsel = evsel__next(evsel);
   1589	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
   1590	TEST_ASSERT_VAL("wrong config", 0xc0 == evsel->core.attr.config);
   1591	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
   1592	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
   1593	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
   1594	return TEST_OK;
   1595}
   1596
   1597static int test__hybrid_raw1(struct evlist *evlist)
   1598{
   1599	struct evsel *evsel = evlist__first(evlist);
   1600
   1601	if (!perf_pmu__hybrid_mounted("cpu_atom")) {
   1602		TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
   1603		TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
   1604		TEST_ASSERT_VAL("wrong config", 0x1a == evsel->core.attr.config);
   1605		return TEST_OK;
   1606	}
   1607
   1608	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
   1609	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
   1610	TEST_ASSERT_VAL("wrong config", 0x1a == evsel->core.attr.config);
   1611
   1612	/* The type of second event is randome value */
   1613	evsel = evsel__next(evsel);
   1614	TEST_ASSERT_VAL("wrong config", 0x1a == evsel->core.attr.config);
   1615	return TEST_OK;
   1616}
   1617
   1618static int test__hybrid_raw2(struct evlist *evlist)
   1619{
   1620	struct evsel *evsel = evlist__first(evlist);
   1621
   1622	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
   1623	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
   1624	TEST_ASSERT_VAL("wrong config", 0x1a == evsel->core.attr.config);
   1625	return TEST_OK;
   1626}
   1627
   1628static int test__hybrid_cache_event(struct evlist *evlist)
   1629{
   1630	struct evsel *evsel = evlist__first(evlist);
   1631
   1632	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
   1633	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->core.attr.type);
   1634	TEST_ASSERT_VAL("wrong config", 0x2 == (evsel->core.attr.config & 0xffffffff));
   1635	return TEST_OK;
   1636}
   1637
   1638struct evlist_test {
   1639	const char *name;
   1640	bool (*valid)(void);
   1641	int (*check)(struct evlist *evlist);
   1642};
   1643
   1644static const struct evlist_test test__events[] = {
   1645	{
   1646		.name  = "syscalls:sys_enter_openat",
   1647		.check = test__checkevent_tracepoint,
   1648		/* 0 */
   1649	},
   1650	{
   1651		.name  = "syscalls:*",
   1652		.check = test__checkevent_tracepoint_multi,
   1653		/* 1 */
   1654	},
   1655	{
   1656		.name  = "r1a",
   1657		.check = test__checkevent_raw,
   1658		/* 2 */
   1659	},
   1660	{
   1661		.name  = "1:1",
   1662		.check = test__checkevent_numeric,
   1663		/* 3 */
   1664	},
   1665	{
   1666		.name  = "instructions",
   1667		.check = test__checkevent_symbolic_name,
   1668		/* 4 */
   1669	},
   1670	{
   1671		.name  = "cycles/period=100000,config2/",
   1672		.check = test__checkevent_symbolic_name_config,
   1673		/* 5 */
   1674	},
   1675	{
   1676		.name  = "faults",
   1677		.check = test__checkevent_symbolic_alias,
   1678		/* 6 */
   1679	},
   1680	{
   1681		.name  = "L1-dcache-load-miss",
   1682		.check = test__checkevent_genhw,
   1683		/* 7 */
   1684	},
   1685	{
   1686		.name  = "mem:0",
   1687		.check = test__checkevent_breakpoint,
   1688		/* 8 */
   1689	},
   1690	{
   1691		.name  = "mem:0:x",
   1692		.check = test__checkevent_breakpoint_x,
   1693		/* 9 */
   1694	},
   1695	{
   1696		.name  = "mem:0:r",
   1697		.check = test__checkevent_breakpoint_r,
   1698		/* 0 */
   1699	},
   1700	{
   1701		.name  = "mem:0:w",
   1702		.check = test__checkevent_breakpoint_w,
   1703		/* 1 */
   1704	},
   1705	{
   1706		.name  = "syscalls:sys_enter_openat:k",
   1707		.check = test__checkevent_tracepoint_modifier,
   1708		/* 2 */
   1709	},
   1710	{
   1711		.name  = "syscalls:*:u",
   1712		.check = test__checkevent_tracepoint_multi_modifier,
   1713		/* 3 */
   1714	},
   1715	{
   1716		.name  = "r1a:kp",
   1717		.check = test__checkevent_raw_modifier,
   1718		/* 4 */
   1719	},
   1720	{
   1721		.name  = "1:1:hp",
   1722		.check = test__checkevent_numeric_modifier,
   1723		/* 5 */
   1724	},
   1725	{
   1726		.name  = "instructions:h",
   1727		.check = test__checkevent_symbolic_name_modifier,
   1728		/* 6 */
   1729	},
   1730	{
   1731		.name  = "faults:u",
   1732		.check = test__checkevent_symbolic_alias_modifier,
   1733		/* 7 */
   1734	},
   1735	{
   1736		.name  = "L1-dcache-load-miss:kp",
   1737		.check = test__checkevent_genhw_modifier,
   1738		/* 8 */
   1739	},
   1740	{
   1741		.name  = "mem:0:u",
   1742		.check = test__checkevent_breakpoint_modifier,
   1743		/* 9 */
   1744	},
   1745	{
   1746		.name  = "mem:0:x:k",
   1747		.check = test__checkevent_breakpoint_x_modifier,
   1748		/* 0 */
   1749	},
   1750	{
   1751		.name  = "mem:0:r:hp",
   1752		.check = test__checkevent_breakpoint_r_modifier,
   1753		/* 1 */
   1754	},
   1755	{
   1756		.name  = "mem:0:w:up",
   1757		.check = test__checkevent_breakpoint_w_modifier,
   1758		/* 2 */
   1759	},
   1760	{
   1761		.name  = "r1,syscalls:sys_enter_openat:k,1:1:hp",
   1762		.check = test__checkevent_list,
   1763		/* 3 */
   1764	},
   1765	{
   1766		.name  = "instructions:G",
   1767		.check = test__checkevent_exclude_host_modifier,
   1768		/* 4 */
   1769	},
   1770	{
   1771		.name  = "instructions:H",
   1772		.check = test__checkevent_exclude_guest_modifier,
   1773		/* 5 */
   1774	},
   1775	{
   1776		.name  = "mem:0:rw",
   1777		.check = test__checkevent_breakpoint_rw,
   1778		/* 6 */
   1779	},
   1780	{
   1781		.name  = "mem:0:rw:kp",
   1782		.check = test__checkevent_breakpoint_rw_modifier,
   1783		/* 7 */
   1784	},
   1785	{
   1786		.name  = "{instructions:k,cycles:upp}",
   1787		.check = test__group1,
   1788		/* 8 */
   1789	},
   1790	{
   1791		.name  = "{faults:k,cache-references}:u,cycles:k",
   1792		.check = test__group2,
   1793		/* 9 */
   1794	},
   1795	{
   1796		.name  = "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
   1797		.check = test__group3,
   1798		/* 0 */
   1799	},
   1800	{
   1801		.name  = "{cycles:u,instructions:kp}:p",
   1802		.check = test__group4,
   1803		/* 1 */
   1804	},
   1805	{
   1806		.name  = "{cycles,instructions}:G,{cycles:G,instructions:G},cycles",
   1807		.check = test__group5,
   1808		/* 2 */
   1809	},
   1810	{
   1811		.name  = "*:*",
   1812		.check = test__all_tracepoints,
   1813		/* 3 */
   1814	},
   1815	{
   1816		.name  = "{cycles,cache-misses:G}:H",
   1817		.check = test__group_gh1,
   1818		/* 4 */
   1819	},
   1820	{
   1821		.name  = "{cycles,cache-misses:H}:G",
   1822		.check = test__group_gh2,
   1823		/* 5 */
   1824	},
   1825	{
   1826		.name  = "{cycles:G,cache-misses:H}:u",
   1827		.check = test__group_gh3,
   1828		/* 6 */
   1829	},
   1830	{
   1831		.name  = "{cycles:G,cache-misses:H}:uG",
   1832		.check = test__group_gh4,
   1833		/* 7 */
   1834	},
   1835	{
   1836		.name  = "{cycles,cache-misses,branch-misses}:S",
   1837		.check = test__leader_sample1,
   1838		/* 8 */
   1839	},
   1840	{
   1841		.name  = "{instructions,branch-misses}:Su",
   1842		.check = test__leader_sample2,
   1843		/* 9 */
   1844	},
   1845	{
   1846		.name  = "instructions:uDp",
   1847		.check = test__checkevent_pinned_modifier,
   1848		/* 0 */
   1849	},
   1850	{
   1851		.name  = "{cycles,cache-misses,branch-misses}:D",
   1852		.check = test__pinned_group,
   1853		/* 1 */
   1854	},
   1855	{
   1856		.name  = "mem:0/1",
   1857		.check = test__checkevent_breakpoint_len,
   1858		/* 2 */
   1859	},
   1860	{
   1861		.name  = "mem:0/2:w",
   1862		.check = test__checkevent_breakpoint_len_w,
   1863		/* 3 */
   1864	},
   1865	{
   1866		.name  = "mem:0/4:rw:u",
   1867		.check = test__checkevent_breakpoint_len_rw_modifier,
   1868		/* 4 */
   1869	},
   1870#if defined(__s390x__)
   1871	{
   1872		.name  = "kvm-s390:kvm_s390_create_vm",
   1873		.check = test__checkevent_tracepoint,
   1874		.valid = kvm_s390_create_vm_valid,
   1875		/* 0 */
   1876	},
   1877#endif
   1878	{
   1879		.name  = "instructions:I",
   1880		.check = test__checkevent_exclude_idle_modifier,
   1881		/* 5 */
   1882	},
   1883	{
   1884		.name  = "instructions:kIG",
   1885		.check = test__checkevent_exclude_idle_modifier_1,
   1886		/* 6 */
   1887	},
   1888	{
   1889		.name  = "task-clock:P,cycles",
   1890		.check = test__checkevent_precise_max_modifier,
   1891		/* 7 */
   1892	},
   1893	{
   1894		.name  = "instructions/name=insn/",
   1895		.check = test__checkevent_config_symbol,
   1896		/* 8 */
   1897	},
   1898	{
   1899		.name  = "r1234/name=rawpmu/",
   1900		.check = test__checkevent_config_raw,
   1901		/* 9 */
   1902	},
   1903	{
   1904		.name  = "4:0x6530160/name=numpmu/",
   1905		.check = test__checkevent_config_num,
   1906		/* 0 */
   1907	},
   1908	{
   1909		.name  = "L1-dcache-misses/name=cachepmu/",
   1910		.check = test__checkevent_config_cache,
   1911		/* 1 */
   1912	},
   1913	{
   1914		.name  = "intel_pt//u",
   1915		.valid = test__intel_pt_valid,
   1916		.check = test__intel_pt,
   1917		/* 2 */
   1918	},
   1919	{
   1920		.name  = "cycles/name='COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks'/Duk",
   1921		.check = test__checkevent_complex_name,
   1922		/* 3 */
   1923	},
   1924	{
   1925		.name  = "cycles//u",
   1926		.check = test__sym_event_slash,
   1927		/* 4 */
   1928	},
   1929	{
   1930		.name  = "cycles:k",
   1931		.check = test__sym_event_dc,
   1932		/* 5 */
   1933	},
   1934	{
   1935		.name  = "instructions:uep",
   1936		.check = test__checkevent_exclusive_modifier,
   1937		/* 6 */
   1938	},
   1939	{
   1940		.name  = "{cycles,cache-misses,branch-misses}:e",
   1941		.check = test__exclusive_group,
   1942		/* 7 */
   1943	},
   1944};
   1945
   1946static const struct evlist_test test__events_pmu[] = {
   1947	{
   1948		.name  = "cpu/config=10,config1,config2=3,period=1000/u",
   1949		.check = test__checkevent_pmu,
   1950		/* 0 */
   1951	},
   1952	{
   1953		.name  = "cpu/config=1,name=krava/u,cpu/config=2/u",
   1954		.check = test__checkevent_pmu_name,
   1955		/* 1 */
   1956	},
   1957	{
   1958		.name  = "cpu/config=1,call-graph=fp,time,period=100000/,cpu/config=2,call-graph=no,time=0,period=2000/",
   1959		.check = test__checkevent_pmu_partial_time_callgraph,
   1960		/* 2 */
   1961	},
   1962	{
   1963		.name  = "cpu/name='COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks',period=0x1,event=0x2/ukp",
   1964		.check = test__checkevent_complex_name,
   1965		/* 3 */
   1966	},
   1967	{
   1968		.name  = "software/r1a/",
   1969		.check = test__checkevent_raw_pmu,
   1970		/* 4 */
   1971	},
   1972	{
   1973		.name  = "software/r0x1a/",
   1974		.check = test__checkevent_raw_pmu,
   1975		/* 5 */
   1976	},
   1977};
   1978
   1979struct terms_test {
   1980	const char *str;
   1981	int (*check)(struct list_head *terms);
   1982};
   1983
   1984static const struct terms_test test__terms[] = {
   1985	[0] = {
   1986		.str   = "config=10,config1,config2=3,umask=1,read,r0xead",
   1987		.check = test__checkterms_simple,
   1988	},
   1989};
   1990
   1991static const struct evlist_test test__hybrid_events[] = {
   1992	{
   1993		.name  = "cpu_core/cpu-cycles/",
   1994		.check = test__hybrid_hw_event_with_pmu,
   1995		/* 0 */
   1996	},
   1997	{
   1998		.name  = "{cpu_core/cpu-cycles/,cpu_core/instructions/}",
   1999		.check = test__hybrid_hw_group_event,
   2000		/* 1 */
   2001	},
   2002	{
   2003		.name  = "{cpu-clock,cpu_core/cpu-cycles/}",
   2004		.check = test__hybrid_sw_hw_group_event,
   2005		/* 2 */
   2006	},
   2007	{
   2008		.name  = "{cpu_core/cpu-cycles/,cpu-clock}",
   2009		.check = test__hybrid_hw_sw_group_event,
   2010		/* 3 */
   2011	},
   2012	{
   2013		.name  = "{cpu_core/cpu-cycles/k,cpu_core/instructions/u}",
   2014		.check = test__hybrid_group_modifier1,
   2015		/* 4 */
   2016	},
   2017	{
   2018		.name  = "r1a",
   2019		.check = test__hybrid_raw1,
   2020		/* 5 */
   2021	},
   2022	{
   2023		.name  = "cpu_core/r1a/",
   2024		.check = test__hybrid_raw2,
   2025		/* 6 */
   2026	},
   2027	{
   2028		.name  = "cpu_core/config=10,config1,config2=3,period=1000/u",
   2029		.check = test__checkevent_pmu,
   2030		/* 7 */
   2031	},
   2032	{
   2033		.name  = "cpu_core/LLC-loads/",
   2034		.check = test__hybrid_cache_event,
   2035		/* 8 */
   2036	},
   2037};
   2038
   2039static int test_event(const struct evlist_test *e)
   2040{
   2041	struct parse_events_error err;
   2042	struct evlist *evlist;
   2043	int ret;
   2044
   2045	if (e->valid && !e->valid()) {
   2046		pr_debug("... SKIP\n");
   2047		return TEST_OK;
   2048	}
   2049
   2050	evlist = evlist__new();
   2051	if (evlist == NULL) {
   2052		pr_err("Failed allocation");
   2053		return TEST_FAIL;
   2054	}
   2055	parse_events_error__init(&err);
   2056	ret = parse_events(evlist, e->name, &err);
   2057	if (ret) {
   2058		pr_debug("failed to parse event '%s', err %d, str '%s'\n",
   2059			 e->name, ret, err.str);
   2060		parse_events_error__print(&err, e->name);
   2061		ret = TEST_FAIL;
   2062		if (strstr(err.str, "can't access trace events"))
   2063			ret = TEST_SKIP;
   2064	} else {
   2065		ret = e->check(evlist);
   2066	}
   2067	parse_events_error__exit(&err);
   2068	evlist__delete(evlist);
   2069
   2070	return ret;
   2071}
   2072
   2073static int test_event_fake_pmu(const char *str)
   2074{
   2075	struct parse_events_error err;
   2076	struct evlist *evlist;
   2077	int ret;
   2078
   2079	evlist = evlist__new();
   2080	if (!evlist)
   2081		return -ENOMEM;
   2082
   2083	parse_events_error__init(&err);
   2084	perf_pmu__test_parse_init();
   2085	ret = __parse_events(evlist, str, &err, &perf_pmu__fake);
   2086	if (ret) {
   2087		pr_debug("failed to parse event '%s', err %d, str '%s'\n",
   2088			 str, ret, err.str);
   2089		parse_events_error__print(&err, str);
   2090	}
   2091
   2092	parse_events_error__exit(&err);
   2093	evlist__delete(evlist);
   2094
   2095	return ret;
   2096}
   2097
   2098static int combine_test_results(int existing, int latest)
   2099{
   2100	if (existing == TEST_FAIL)
   2101		return TEST_FAIL;
   2102	if (existing == TEST_SKIP)
   2103		return latest == TEST_OK ? TEST_SKIP : latest;
   2104	return latest;
   2105}
   2106
   2107static int test_events(const struct evlist_test *events, int cnt)
   2108{
   2109	int ret = TEST_OK;
   2110
   2111	for (int i = 0; i < cnt; i++) {
   2112		const struct evlist_test *e = &events[i];
   2113		int test_ret;
   2114
   2115		pr_debug("running test %d '%s'\n", i, e->name);
   2116		test_ret = test_event(e);
   2117		if (test_ret != TEST_OK) {
   2118			pr_debug("Event test failure: test %d '%s'", i, e->name);
   2119			ret = combine_test_results(ret, test_ret);
   2120		}
   2121	}
   2122
   2123	return ret;
   2124}
   2125
   2126static int test__events2(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
   2127{
   2128	return test_events(test__events, ARRAY_SIZE(test__events));
   2129}
   2130
   2131static int test_term(const struct terms_test *t)
   2132{
   2133	struct list_head terms;
   2134	int ret;
   2135
   2136	INIT_LIST_HEAD(&terms);
   2137
   2138	/*
   2139	 * The perf_pmu__test_parse_init prepares perf_pmu_events_list
   2140	 * which gets freed in parse_events_terms.
   2141	 */
   2142	if (perf_pmu__test_parse_init())
   2143		return -1;
   2144
   2145	ret = parse_events_terms(&terms, t->str);
   2146	if (ret) {
   2147		pr_debug("failed to parse terms '%s', err %d\n",
   2148			 t->str , ret);
   2149		return ret;
   2150	}
   2151
   2152	ret = t->check(&terms);
   2153	parse_events_terms__purge(&terms);
   2154
   2155	return ret;
   2156}
   2157
   2158static int test_terms(const struct terms_test *terms, int cnt)
   2159{
   2160	int ret = 0;
   2161
   2162	for (int i = 0; i < cnt; i++) {
   2163		const struct terms_test *t = &terms[i];
   2164
   2165		pr_debug("running test %d '%s'\n", i, t->str);
   2166		ret = test_term(t);
   2167		if (ret)
   2168			break;
   2169	}
   2170
   2171	return ret;
   2172}
   2173
   2174static int test__terms2(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
   2175{
   2176	return test_terms(test__terms, ARRAY_SIZE(test__terms));
   2177}
   2178
   2179static int test_pmu(void)
   2180{
   2181	struct stat st;
   2182	char path[PATH_MAX];
   2183	int ret;
   2184
   2185	snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/format/",
   2186		 sysfs__mountpoint());
   2187
   2188	ret = stat(path, &st);
   2189	if (ret)
   2190		pr_debug("omitting PMU cpu tests\n");
   2191	return !ret;
   2192}
   2193
   2194static int test__pmu_events(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
   2195{
   2196	struct stat st;
   2197	char path[PATH_MAX];
   2198	struct dirent *ent;
   2199	DIR *dir;
   2200	int ret;
   2201
   2202	if (!test_pmu())
   2203		return TEST_SKIP;
   2204
   2205	snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/events/",
   2206		 sysfs__mountpoint());
   2207
   2208	ret = stat(path, &st);
   2209	if (ret) {
   2210		pr_debug("omitting PMU cpu events tests: %s\n", path);
   2211		return TEST_OK;
   2212	}
   2213
   2214	dir = opendir(path);
   2215	if (!dir) {
   2216		pr_debug("can't open pmu event dir: %s\n", path);
   2217		return TEST_FAIL;
   2218	}
   2219
   2220	ret = TEST_OK;
   2221	while ((ent = readdir(dir))) {
   2222		struct evlist_test e = { .name = NULL, };
   2223		char name[2 * NAME_MAX + 1 + 12 + 3];
   2224		int test_ret;
   2225
   2226		/* Names containing . are special and cannot be used directly */
   2227		if (strchr(ent->d_name, '.'))
   2228			continue;
   2229
   2230		snprintf(name, sizeof(name), "cpu/event=%s/u", ent->d_name);
   2231
   2232		e.name  = name;
   2233		e.check = test__checkevent_pmu_events;
   2234
   2235		test_ret = test_event(&e);
   2236		if (test_ret != TEST_OK) {
   2237			pr_debug("Test PMU event failed for '%s'", name);
   2238			ret = combine_test_results(ret, test_ret);
   2239		}
   2240		snprintf(name, sizeof(name), "%s:u,cpu/event=%s/u", ent->d_name, ent->d_name);
   2241		e.name  = name;
   2242		e.check = test__checkevent_pmu_events_mix;
   2243		test_ret = test_event(&e);
   2244		if (test_ret != TEST_OK) {
   2245			pr_debug("Test PMU event failed for '%s'", name);
   2246			ret = combine_test_results(ret, test_ret);
   2247		}
   2248	}
   2249
   2250	closedir(dir);
   2251	return ret;
   2252}
   2253
   2254static int test__pmu_events2(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
   2255{
   2256	if (!test_pmu())
   2257		return TEST_SKIP;
   2258
   2259	return test_events(test__events_pmu, ARRAY_SIZE(test__events_pmu));
   2260}
   2261
   2262static bool test_alias(char **event, char **alias)
   2263{
   2264	char path[PATH_MAX];
   2265	DIR *dir;
   2266	struct dirent *dent;
   2267	const char *sysfs = sysfs__mountpoint();
   2268	char buf[128];
   2269	FILE *file;
   2270
   2271	if (!sysfs)
   2272		return false;
   2273
   2274	snprintf(path, PATH_MAX, "%s/bus/event_source/devices/", sysfs);
   2275	dir = opendir(path);
   2276	if (!dir)
   2277		return false;
   2278
   2279	while ((dent = readdir(dir))) {
   2280		if (!strcmp(dent->d_name, ".") ||
   2281		    !strcmp(dent->d_name, ".."))
   2282			continue;
   2283
   2284		snprintf(path, PATH_MAX, "%s/bus/event_source/devices/%s/alias",
   2285			 sysfs, dent->d_name);
   2286
   2287		if (!file_available(path))
   2288			continue;
   2289
   2290		file = fopen(path, "r");
   2291		if (!file)
   2292			continue;
   2293
   2294		if (!fgets(buf, sizeof(buf), file)) {
   2295			fclose(file);
   2296			continue;
   2297		}
   2298
   2299		/* Remove the last '\n' */
   2300		buf[strlen(buf) - 1] = 0;
   2301
   2302		fclose(file);
   2303		*event = strdup(dent->d_name);
   2304		*alias = strdup(buf);
   2305		closedir(dir);
   2306
   2307		if (*event == NULL || *alias == NULL) {
   2308			free(*event);
   2309			free(*alias);
   2310			return false;
   2311		}
   2312
   2313		return true;
   2314	}
   2315
   2316	closedir(dir);
   2317	return false;
   2318}
   2319
   2320static int test__hybrid(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
   2321{
   2322	if (!perf_pmu__has_hybrid())
   2323		return TEST_SKIP;
   2324
   2325	return test_events(test__hybrid_events, ARRAY_SIZE(test__hybrid_events));
   2326}
   2327
   2328static int test__checkevent_pmu_events_alias(struct evlist *evlist)
   2329{
   2330	struct evsel *evsel1 = evlist__first(evlist);
   2331	struct evsel *evsel2 = evlist__last(evlist);
   2332
   2333	TEST_ASSERT_VAL("wrong type", evsel1->core.attr.type == evsel2->core.attr.type);
   2334	TEST_ASSERT_VAL("wrong config", evsel1->core.attr.config == evsel2->core.attr.config);
   2335	return TEST_OK;
   2336}
   2337
   2338static int test__pmu_events_alias(char *event, char *alias)
   2339{
   2340	struct evlist_test e = { .name = NULL, };
   2341	char name[2 * NAME_MAX + 20];
   2342
   2343	snprintf(name, sizeof(name), "%s/event=1/,%s/event=1/",
   2344		 event, alias);
   2345
   2346	e.name  = name;
   2347	e.check = test__checkevent_pmu_events_alias;
   2348	return test_event(&e);
   2349}
   2350
   2351static int test__alias(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
   2352{
   2353	char *event, *alias;
   2354	int ret;
   2355
   2356	if (!test_alias(&event, &alias))
   2357		return TEST_SKIP;
   2358
   2359	ret = test__pmu_events_alias(event, alias);
   2360
   2361	free(event);
   2362	free(alias);
   2363	return ret;
   2364}
   2365
   2366static int test__pmu_events_alias2(struct test_suite *test __maybe_unused,
   2367				   int subtest __maybe_unused)
   2368{
   2369	static const char events[][30] = {
   2370			"event-hyphen",
   2371			"event-two-hyph",
   2372	};
   2373	int ret = TEST_OK;
   2374
   2375	for (unsigned int i = 0; i < ARRAY_SIZE(events); i++) {
   2376		int test_ret = test_event_fake_pmu(&events[i][0]);
   2377
   2378		if (test_ret != TEST_OK) {
   2379			pr_debug("check_parse_fake %s failed\n", &events[i][0]);
   2380			ret = combine_test_results(ret, test_ret);
   2381		}
   2382	}
   2383
   2384	return ret;
   2385}
   2386
   2387static struct test_case tests__parse_events[] = {
   2388	TEST_CASE_REASON("Test event parsing",
   2389			 events2,
   2390			 "permissions"),
   2391	TEST_CASE_REASON("Test parsing of \"hybrid\" CPU events",
   2392			 hybrid,
   2393			"not hybrid"),
   2394	TEST_CASE_REASON("Parsing of all PMU events from sysfs",
   2395			 pmu_events,
   2396			 "permissions"),
   2397	TEST_CASE_REASON("Parsing of given PMU events from sysfs",
   2398			 pmu_events2,
   2399			 "permissions"),
   2400	TEST_CASE_REASON("Parsing of aliased events from sysfs", alias,
   2401			 "no aliases in sysfs"),
   2402	TEST_CASE("Parsing of aliased events", pmu_events_alias2),
   2403	TEST_CASE("Parsing of terms (event modifiers)", terms2),
   2404	{	.name = NULL, }
   2405};
   2406
   2407struct test_suite suite__parse_events = {
   2408	.desc = "Parse event definition strings",
   2409	.test_cases = tests__parse_events,
   2410};