Linux Audio

Check our new training course

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