Linux Audio

Check our new training course

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