xref: /openbmc/linux/tools/perf/tests/parse-events.c (revision d0b73b48)
1 
2 #include "parse-events.h"
3 #include "evsel.h"
4 #include "evlist.h"
5 #include "sysfs.h"
6 #include "tests.h"
7 #include <linux/hw_breakpoint.h>
8 
9 #define TEST_ASSERT_VAL(text, cond) \
10 do { \
11 	if (!(cond)) { \
12 		pr_debug("FAILED %s:%d %s\n", __FILE__, __LINE__, text); \
13 		return -1; \
14 	} \
15 } while (0)
16 
17 #define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \
18 			     PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
19 
20 static int test__checkevent_tracepoint(struct perf_evlist *evlist)
21 {
22 	struct perf_evsel *evsel = perf_evlist__first(evlist);
23 
24 	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
25 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
26 	TEST_ASSERT_VAL("wrong sample_type",
27 		PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
28 	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
29 	return 0;
30 }
31 
32 static int test__checkevent_tracepoint_multi(struct perf_evlist *evlist)
33 {
34 	struct perf_evsel *evsel;
35 
36 	TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
37 
38 	list_for_each_entry(evsel, &evlist->entries, node) {
39 		TEST_ASSERT_VAL("wrong type",
40 			PERF_TYPE_TRACEPOINT == evsel->attr.type);
41 		TEST_ASSERT_VAL("wrong sample_type",
42 			PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
43 		TEST_ASSERT_VAL("wrong sample_period",
44 			1 == evsel->attr.sample_period);
45 	}
46 	return 0;
47 }
48 
49 static int test__checkevent_raw(struct perf_evlist *evlist)
50 {
51 	struct perf_evsel *evsel = perf_evlist__first(evlist);
52 
53 	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
54 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
55 	TEST_ASSERT_VAL("wrong config", 0x1a == evsel->attr.config);
56 	return 0;
57 }
58 
59 static int test__checkevent_numeric(struct perf_evlist *evlist)
60 {
61 	struct perf_evsel *evsel = perf_evlist__first(evlist);
62 
63 	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
64 	TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
65 	TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
66 	return 0;
67 }
68 
69 static int test__checkevent_symbolic_name(struct perf_evlist *evlist)
70 {
71 	struct perf_evsel *evsel = perf_evlist__first(evlist);
72 
73 	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
74 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
75 	TEST_ASSERT_VAL("wrong config",
76 			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
77 	return 0;
78 }
79 
80 static int test__checkevent_symbolic_name_config(struct perf_evlist *evlist)
81 {
82 	struct perf_evsel *evsel = perf_evlist__first(evlist);
83 
84 	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
85 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
86 	TEST_ASSERT_VAL("wrong config",
87 			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
88 	TEST_ASSERT_VAL("wrong period",
89 			100000 == evsel->attr.sample_period);
90 	TEST_ASSERT_VAL("wrong config1",
91 			0 == evsel->attr.config1);
92 	TEST_ASSERT_VAL("wrong config2",
93 			1 == evsel->attr.config2);
94 	return 0;
95 }
96 
97 static int test__checkevent_symbolic_alias(struct perf_evlist *evlist)
98 {
99 	struct perf_evsel *evsel = perf_evlist__first(evlist);
100 
101 	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
102 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
103 	TEST_ASSERT_VAL("wrong config",
104 			PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config);
105 	return 0;
106 }
107 
108 static int test__checkevent_genhw(struct perf_evlist *evlist)
109 {
110 	struct perf_evsel *evsel = perf_evlist__first(evlist);
111 
112 	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
113 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->attr.type);
114 	TEST_ASSERT_VAL("wrong config", (1 << 16) == evsel->attr.config);
115 	return 0;
116 }
117 
118 static int test__checkevent_breakpoint(struct perf_evlist *evlist)
119 {
120 	struct perf_evsel *evsel = perf_evlist__first(evlist);
121 
122 	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
123 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
124 	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
125 	TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
126 					 evsel->attr.bp_type);
127 	TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_4 ==
128 					evsel->attr.bp_len);
129 	return 0;
130 }
131 
132 static int test__checkevent_breakpoint_x(struct perf_evlist *evlist)
133 {
134 	struct perf_evsel *evsel = perf_evlist__first(evlist);
135 
136 	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
137 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
138 	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
139 	TEST_ASSERT_VAL("wrong bp_type",
140 			HW_BREAKPOINT_X == evsel->attr.bp_type);
141 	TEST_ASSERT_VAL("wrong bp_len", sizeof(long) == evsel->attr.bp_len);
142 	return 0;
143 }
144 
145 static int test__checkevent_breakpoint_r(struct perf_evlist *evlist)
146 {
147 	struct perf_evsel *evsel = perf_evlist__first(evlist);
148 
149 	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
150 	TEST_ASSERT_VAL("wrong type",
151 			PERF_TYPE_BREAKPOINT == evsel->attr.type);
152 	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
153 	TEST_ASSERT_VAL("wrong bp_type",
154 			HW_BREAKPOINT_R == evsel->attr.bp_type);
155 	TEST_ASSERT_VAL("wrong bp_len",
156 			HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
157 	return 0;
158 }
159 
160 static int test__checkevent_breakpoint_w(struct perf_evlist *evlist)
161 {
162 	struct perf_evsel *evsel = perf_evlist__first(evlist);
163 
164 	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
165 	TEST_ASSERT_VAL("wrong type",
166 			PERF_TYPE_BREAKPOINT == evsel->attr.type);
167 	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
168 	TEST_ASSERT_VAL("wrong bp_type",
169 			HW_BREAKPOINT_W == evsel->attr.bp_type);
170 	TEST_ASSERT_VAL("wrong bp_len",
171 			HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
172 	return 0;
173 }
174 
175 static int test__checkevent_breakpoint_rw(struct perf_evlist *evlist)
176 {
177 	struct perf_evsel *evsel = perf_evlist__first(evlist);
178 
179 	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
180 	TEST_ASSERT_VAL("wrong type",
181 			PERF_TYPE_BREAKPOINT == evsel->attr.type);
182 	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
183 	TEST_ASSERT_VAL("wrong bp_type",
184 		(HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->attr.bp_type);
185 	TEST_ASSERT_VAL("wrong bp_len",
186 			HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
187 	return 0;
188 }
189 
190 static int test__checkevent_tracepoint_modifier(struct perf_evlist *evlist)
191 {
192 	struct perf_evsel *evsel = perf_evlist__first(evlist);
193 
194 	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
195 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
196 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
197 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
198 
199 	return test__checkevent_tracepoint(evlist);
200 }
201 
202 static int
203 test__checkevent_tracepoint_multi_modifier(struct perf_evlist *evlist)
204 {
205 	struct perf_evsel *evsel;
206 
207 	TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
208 
209 	list_for_each_entry(evsel, &evlist->entries, node) {
210 		TEST_ASSERT_VAL("wrong exclude_user",
211 				!evsel->attr.exclude_user);
212 		TEST_ASSERT_VAL("wrong exclude_kernel",
213 				evsel->attr.exclude_kernel);
214 		TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
215 		TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
216 	}
217 
218 	return test__checkevent_tracepoint_multi(evlist);
219 }
220 
221 static int test__checkevent_raw_modifier(struct perf_evlist *evlist)
222 {
223 	struct perf_evsel *evsel = perf_evlist__first(evlist);
224 
225 	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
226 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
227 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
228 	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
229 
230 	return test__checkevent_raw(evlist);
231 }
232 
233 static int test__checkevent_numeric_modifier(struct perf_evlist *evlist)
234 {
235 	struct perf_evsel *evsel = perf_evlist__first(evlist);
236 
237 	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
238 	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
239 	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
240 	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
241 
242 	return test__checkevent_numeric(evlist);
243 }
244 
245 static int test__checkevent_symbolic_name_modifier(struct perf_evlist *evlist)
246 {
247 	struct perf_evsel *evsel = perf_evlist__first(evlist);
248 
249 	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
250 	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
251 	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
252 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
253 
254 	return test__checkevent_symbolic_name(evlist);
255 }
256 
257 static int test__checkevent_exclude_host_modifier(struct perf_evlist *evlist)
258 {
259 	struct perf_evsel *evsel = perf_evlist__first(evlist);
260 
261 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
262 	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
263 
264 	return test__checkevent_symbolic_name(evlist);
265 }
266 
267 static int test__checkevent_exclude_guest_modifier(struct perf_evlist *evlist)
268 {
269 	struct perf_evsel *evsel = perf_evlist__first(evlist);
270 
271 	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
272 	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
273 
274 	return test__checkevent_symbolic_name(evlist);
275 }
276 
277 static int test__checkevent_symbolic_alias_modifier(struct perf_evlist *evlist)
278 {
279 	struct perf_evsel *evsel = perf_evlist__first(evlist);
280 
281 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
282 	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
283 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
284 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
285 
286 	return test__checkevent_symbolic_alias(evlist);
287 }
288 
289 static int test__checkevent_genhw_modifier(struct perf_evlist *evlist)
290 {
291 	struct perf_evsel *evsel = perf_evlist__first(evlist);
292 
293 	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
294 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
295 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
296 	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
297 
298 	return test__checkevent_genhw(evlist);
299 }
300 
301 static int test__checkevent_breakpoint_modifier(struct perf_evlist *evlist)
302 {
303 	struct perf_evsel *evsel = perf_evlist__first(evlist);
304 
305 
306 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
307 	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
308 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
309 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
310 	TEST_ASSERT_VAL("wrong name",
311 			!strcmp(perf_evsel__name(evsel), "mem:0:u"));
312 
313 	return test__checkevent_breakpoint(evlist);
314 }
315 
316 static int test__checkevent_breakpoint_x_modifier(struct perf_evlist *evlist)
317 {
318 	struct perf_evsel *evsel = perf_evlist__first(evlist);
319 
320 	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
321 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
322 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
323 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
324 	TEST_ASSERT_VAL("wrong name",
325 			!strcmp(perf_evsel__name(evsel), "mem:0:x:k"));
326 
327 	return test__checkevent_breakpoint_x(evlist);
328 }
329 
330 static int test__checkevent_breakpoint_r_modifier(struct perf_evlist *evlist)
331 {
332 	struct perf_evsel *evsel = perf_evlist__first(evlist);
333 
334 	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
335 	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
336 	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
337 	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
338 	TEST_ASSERT_VAL("wrong name",
339 			!strcmp(perf_evsel__name(evsel), "mem:0:r:hp"));
340 
341 	return test__checkevent_breakpoint_r(evlist);
342 }
343 
344 static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist)
345 {
346 	struct perf_evsel *evsel = perf_evlist__first(evlist);
347 
348 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
349 	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
350 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
351 	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
352 	TEST_ASSERT_VAL("wrong name",
353 			!strcmp(perf_evsel__name(evsel), "mem:0:w:up"));
354 
355 	return test__checkevent_breakpoint_w(evlist);
356 }
357 
358 static int test__checkevent_breakpoint_rw_modifier(struct perf_evlist *evlist)
359 {
360 	struct perf_evsel *evsel = perf_evlist__first(evlist);
361 
362 	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
363 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
364 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
365 	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
366 	TEST_ASSERT_VAL("wrong name",
367 			!strcmp(perf_evsel__name(evsel), "mem:0:rw:kp"));
368 
369 	return test__checkevent_breakpoint_rw(evlist);
370 }
371 
372 static int test__checkevent_pmu(struct perf_evlist *evlist)
373 {
374 
375 	struct perf_evsel *evsel = perf_evlist__first(evlist);
376 
377 	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
378 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
379 	TEST_ASSERT_VAL("wrong config",    10 == evsel->attr.config);
380 	TEST_ASSERT_VAL("wrong config1",    1 == evsel->attr.config1);
381 	TEST_ASSERT_VAL("wrong config2",    3 == evsel->attr.config2);
382 	TEST_ASSERT_VAL("wrong period",  1000 == evsel->attr.sample_period);
383 
384 	return 0;
385 }
386 
387 static int test__checkevent_list(struct perf_evlist *evlist)
388 {
389 	struct perf_evsel *evsel = perf_evlist__first(evlist);
390 
391 	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
392 
393 	/* r1 */
394 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
395 	TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
396 	TEST_ASSERT_VAL("wrong config1", 0 == evsel->attr.config1);
397 	TEST_ASSERT_VAL("wrong config2", 0 == evsel->attr.config2);
398 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
399 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
400 	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
401 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
402 
403 	/* syscalls:sys_enter_open:k */
404 	evsel = perf_evsel__next(evsel);
405 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
406 	TEST_ASSERT_VAL("wrong sample_type",
407 		PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
408 	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
409 	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
410 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
411 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
412 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
413 
414 	/* 1:1:hp */
415 	evsel = perf_evsel__next(evsel);
416 	TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
417 	TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
418 	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
419 	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
420 	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
421 	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
422 
423 	return 0;
424 }
425 
426 static int test__checkevent_pmu_name(struct perf_evlist *evlist)
427 {
428 	struct perf_evsel *evsel = perf_evlist__first(evlist);
429 
430 	/* cpu/config=1,name=krava/u */
431 	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
432 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
433 	TEST_ASSERT_VAL("wrong config",  1 == evsel->attr.config);
434 	TEST_ASSERT_VAL("wrong name", !strcmp(perf_evsel__name(evsel), "krava"));
435 
436 	/* cpu/config=2/u" */
437 	evsel = perf_evsel__next(evsel);
438 	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
439 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
440 	TEST_ASSERT_VAL("wrong config",  2 == evsel->attr.config);
441 	TEST_ASSERT_VAL("wrong name",
442 			!strcmp(perf_evsel__name(evsel), "cpu/config=2/u"));
443 
444 	return 0;
445 }
446 
447 static int test__checkevent_pmu_events(struct perf_evlist *evlist)
448 {
449 	struct perf_evsel *evsel;
450 
451 	evsel = list_entry(evlist->entries.next, struct perf_evsel, node);
452 	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
453 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
454 	TEST_ASSERT_VAL("wrong exclude_user",
455 			!evsel->attr.exclude_user);
456 	TEST_ASSERT_VAL("wrong exclude_kernel",
457 			evsel->attr.exclude_kernel);
458 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
459 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
460 
461 	return 0;
462 }
463 
464 static int test__checkterms_simple(struct list_head *terms)
465 {
466 	struct parse_events__term *term;
467 
468 	/* config=10 */
469 	term = list_entry(terms->next, struct parse_events__term, list);
470 	TEST_ASSERT_VAL("wrong type term",
471 			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG);
472 	TEST_ASSERT_VAL("wrong type val",
473 			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
474 	TEST_ASSERT_VAL("wrong val", term->val.num == 10);
475 	TEST_ASSERT_VAL("wrong config", !term->config);
476 
477 	/* config1 */
478 	term = list_entry(term->list.next, struct parse_events__term, list);
479 	TEST_ASSERT_VAL("wrong type term",
480 			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG1);
481 	TEST_ASSERT_VAL("wrong type val",
482 			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
483 	TEST_ASSERT_VAL("wrong val", term->val.num == 1);
484 	TEST_ASSERT_VAL("wrong config", !term->config);
485 
486 	/* config2=3 */
487 	term = list_entry(term->list.next, struct parse_events__term, list);
488 	TEST_ASSERT_VAL("wrong type term",
489 			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG2);
490 	TEST_ASSERT_VAL("wrong type val",
491 			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
492 	TEST_ASSERT_VAL("wrong val", term->val.num == 3);
493 	TEST_ASSERT_VAL("wrong config", !term->config);
494 
495 	/* umask=1*/
496 	term = list_entry(term->list.next, struct parse_events__term, list);
497 	TEST_ASSERT_VAL("wrong type term",
498 			term->type_term == PARSE_EVENTS__TERM_TYPE_USER);
499 	TEST_ASSERT_VAL("wrong type val",
500 			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
501 	TEST_ASSERT_VAL("wrong val", term->val.num == 1);
502 	TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "umask"));
503 
504 	return 0;
505 }
506 
507 static int test__group1(struct perf_evlist *evlist)
508 {
509 	struct perf_evsel *evsel, *leader;
510 
511 	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
512 
513 	/* instructions:k */
514 	evsel = leader = perf_evlist__first(evlist);
515 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
516 	TEST_ASSERT_VAL("wrong config",
517 			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
518 	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
519 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
520 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
521 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
522 	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
523 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
524 	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel));
525 
526 	/* cycles:upp */
527 	evsel = perf_evsel__next(evsel);
528 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
529 	TEST_ASSERT_VAL("wrong config",
530 			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
531 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
532 	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
533 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
534 	/* use of precise requires exclude_guest */
535 	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
536 	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
537 	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2);
538 	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
539 
540 	return 0;
541 }
542 
543 static int test__group2(struct perf_evlist *evlist)
544 {
545 	struct perf_evsel *evsel, *leader;
546 
547 	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
548 
549 	/* faults + :ku modifier */
550 	evsel = leader = perf_evlist__first(evlist);
551 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
552 	TEST_ASSERT_VAL("wrong config",
553 			PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config);
554 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
555 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
556 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
557 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
558 	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
559 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
560 	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel));
561 
562 	/* cache-references + :u modifier */
563 	evsel = perf_evsel__next(evsel);
564 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
565 	TEST_ASSERT_VAL("wrong config",
566 			PERF_COUNT_HW_CACHE_REFERENCES == evsel->attr.config);
567 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
568 	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
569 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
570 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
571 	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
572 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
573 	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
574 
575 	/* cycles:k */
576 	evsel = perf_evsel__next(evsel);
577 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
578 	TEST_ASSERT_VAL("wrong config",
579 			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
580 	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
581 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
582 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
583 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
584 	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
585 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
586 	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel));
587 
588 	return 0;
589 }
590 
591 static int test__group3(struct perf_evlist *evlist __maybe_unused)
592 {
593 	struct perf_evsel *evsel, *leader;
594 
595 	TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries);
596 
597 	/* group1 syscalls:sys_enter_open:H */
598 	evsel = leader = perf_evlist__first(evlist);
599 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
600 	TEST_ASSERT_VAL("wrong sample_type",
601 		PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
602 	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
603 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
604 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
605 	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
606 	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
607 	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
608 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
609 	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel));
610 	TEST_ASSERT_VAL("wrong group name",
611 		!strcmp(leader->group_name, "group1"));
612 
613 	/* group1 cycles:kppp */
614 	evsel = perf_evsel__next(evsel);
615 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
616 	TEST_ASSERT_VAL("wrong config",
617 			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
618 	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
619 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
620 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
621 	/* use of precise requires exclude_guest */
622 	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
623 	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
624 	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 3);
625 	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
626 	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
627 
628 	/* group2 cycles + G modifier */
629 	evsel = leader = 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 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
637 	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
638 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
639 	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel));
640 	TEST_ASSERT_VAL("wrong group name",
641 		!strcmp(leader->group_name, "group2"));
642 
643 	/* group2 1:3 + G modifier */
644 	evsel = perf_evsel__next(evsel);
645 	TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
646 	TEST_ASSERT_VAL("wrong config", 3 == evsel->attr.config);
647 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
648 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
649 	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
650 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
651 	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
652 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
653 	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
654 
655 	/* instructions:u */
656 	evsel = perf_evsel__next(evsel);
657 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
658 	TEST_ASSERT_VAL("wrong config",
659 			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
660 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
661 	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
662 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
663 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
664 	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
665 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
666 	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel));
667 
668 	return 0;
669 }
670 
671 static int test__group4(struct perf_evlist *evlist __maybe_unused)
672 {
673 	struct perf_evsel *evsel, *leader;
674 
675 	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
676 
677 	/* cycles:u + p */
678 	evsel = leader = perf_evlist__first(evlist);
679 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
680 	TEST_ASSERT_VAL("wrong config",
681 			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
682 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
683 	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
684 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
685 	/* use of precise requires exclude_guest */
686 	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
687 	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
688 	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 1);
689 	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
690 	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel));
691 
692 	/* instructions:kp + p */
693 	evsel = perf_evsel__next(evsel);
694 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
695 	TEST_ASSERT_VAL("wrong config",
696 			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
697 	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
698 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
699 	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
700 	/* use of precise requires exclude_guest */
701 	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
702 	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
703 	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2);
704 	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
705 
706 	return 0;
707 }
708 
709 static int test__group5(struct perf_evlist *evlist __maybe_unused)
710 {
711 	struct perf_evsel *evsel, *leader;
712 
713 	TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries);
714 
715 	/* cycles + G */
716 	evsel = leader = perf_evlist__first(evlist);
717 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
718 	TEST_ASSERT_VAL("wrong config",
719 			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
720 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
721 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
722 	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
723 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
724 	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
725 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
726 	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
727 	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel));
728 
729 	/* instructions + G */
730 	evsel = perf_evsel__next(evsel);
731 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
732 	TEST_ASSERT_VAL("wrong config",
733 			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
734 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
735 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
736 	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
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);
740 	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
741 
742 	/* cycles:G */
743 	evsel = leader = perf_evsel__next(evsel);
744 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
745 	TEST_ASSERT_VAL("wrong config",
746 			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
747 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
748 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
749 	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
750 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
751 	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
752 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
753 	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
754 	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel));
755 
756 	/* instructions:G */
757 	evsel = perf_evsel__next(evsel);
758 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
759 	TEST_ASSERT_VAL("wrong config",
760 			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
761 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
762 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
763 	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
764 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
765 	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
766 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
767 	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
768 
769 	/* cycles */
770 	evsel = perf_evsel__next(evsel);
771 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
772 	TEST_ASSERT_VAL("wrong config",
773 			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
774 	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
775 	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
776 	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
777 	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
778 	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
779 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
780 	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel));
781 
782 	return 0;
783 }
784 
785 struct test__event_st {
786 	const char *name;
787 	__u32 type;
788 	int (*check)(struct perf_evlist *evlist);
789 };
790 
791 static struct test__event_st test__events[] = {
792 	[0] = {
793 		.name  = "syscalls:sys_enter_open",
794 		.check = test__checkevent_tracepoint,
795 	},
796 	[1] = {
797 		.name  = "syscalls:*",
798 		.check = test__checkevent_tracepoint_multi,
799 	},
800 	[2] = {
801 		.name  = "r1a",
802 		.check = test__checkevent_raw,
803 	},
804 	[3] = {
805 		.name  = "1:1",
806 		.check = test__checkevent_numeric,
807 	},
808 	[4] = {
809 		.name  = "instructions",
810 		.check = test__checkevent_symbolic_name,
811 	},
812 	[5] = {
813 		.name  = "cycles/period=100000,config2/",
814 		.check = test__checkevent_symbolic_name_config,
815 	},
816 	[6] = {
817 		.name  = "faults",
818 		.check = test__checkevent_symbolic_alias,
819 	},
820 	[7] = {
821 		.name  = "L1-dcache-load-miss",
822 		.check = test__checkevent_genhw,
823 	},
824 	[8] = {
825 		.name  = "mem:0",
826 		.check = test__checkevent_breakpoint,
827 	},
828 	[9] = {
829 		.name  = "mem:0:x",
830 		.check = test__checkevent_breakpoint_x,
831 	},
832 	[10] = {
833 		.name  = "mem:0:r",
834 		.check = test__checkevent_breakpoint_r,
835 	},
836 	[11] = {
837 		.name  = "mem:0:w",
838 		.check = test__checkevent_breakpoint_w,
839 	},
840 	[12] = {
841 		.name  = "syscalls:sys_enter_open:k",
842 		.check = test__checkevent_tracepoint_modifier,
843 	},
844 	[13] = {
845 		.name  = "syscalls:*:u",
846 		.check = test__checkevent_tracepoint_multi_modifier,
847 	},
848 	[14] = {
849 		.name  = "r1a:kp",
850 		.check = test__checkevent_raw_modifier,
851 	},
852 	[15] = {
853 		.name  = "1:1:hp",
854 		.check = test__checkevent_numeric_modifier,
855 	},
856 	[16] = {
857 		.name  = "instructions:h",
858 		.check = test__checkevent_symbolic_name_modifier,
859 	},
860 	[17] = {
861 		.name  = "faults:u",
862 		.check = test__checkevent_symbolic_alias_modifier,
863 	},
864 	[18] = {
865 		.name  = "L1-dcache-load-miss:kp",
866 		.check = test__checkevent_genhw_modifier,
867 	},
868 	[19] = {
869 		.name  = "mem:0:u",
870 		.check = test__checkevent_breakpoint_modifier,
871 	},
872 	[20] = {
873 		.name  = "mem:0:x:k",
874 		.check = test__checkevent_breakpoint_x_modifier,
875 	},
876 	[21] = {
877 		.name  = "mem:0:r:hp",
878 		.check = test__checkevent_breakpoint_r_modifier,
879 	},
880 	[22] = {
881 		.name  = "mem:0:w:up",
882 		.check = test__checkevent_breakpoint_w_modifier,
883 	},
884 	[23] = {
885 		.name  = "r1,syscalls:sys_enter_open:k,1:1:hp",
886 		.check = test__checkevent_list,
887 	},
888 	[24] = {
889 		.name  = "instructions:G",
890 		.check = test__checkevent_exclude_host_modifier,
891 	},
892 	[25] = {
893 		.name  = "instructions:H",
894 		.check = test__checkevent_exclude_guest_modifier,
895 	},
896 	[26] = {
897 		.name  = "mem:0:rw",
898 		.check = test__checkevent_breakpoint_rw,
899 	},
900 	[27] = {
901 		.name  = "mem:0:rw:kp",
902 		.check = test__checkevent_breakpoint_rw_modifier,
903 	},
904 	[28] = {
905 		.name  = "{instructions:k,cycles:upp}",
906 		.check = test__group1,
907 	},
908 	[29] = {
909 		.name  = "{faults:k,cache-references}:u,cycles:k",
910 		.check = test__group2,
911 	},
912 	[30] = {
913 		.name  = "group1{syscalls:sys_enter_open:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
914 		.check = test__group3,
915 	},
916 	[31] = {
917 		.name  = "{cycles:u,instructions:kp}:p",
918 		.check = test__group4,
919 	},
920 	[32] = {
921 		.name  = "{cycles,instructions}:G,{cycles:G,instructions:G},cycles",
922 		.check = test__group5,
923 	},
924 };
925 
926 static struct test__event_st test__events_pmu[] = {
927 	[0] = {
928 		.name  = "cpu/config=10,config1,config2=3,period=1000/u",
929 		.check = test__checkevent_pmu,
930 	},
931 	[1] = {
932 		.name  = "cpu/config=1,name=krava/u,cpu/config=2/u",
933 		.check = test__checkevent_pmu_name,
934 	},
935 };
936 
937 struct test__term {
938 	const char *str;
939 	__u32 type;
940 	int (*check)(struct list_head *terms);
941 };
942 
943 static struct test__term test__terms[] = {
944 	[0] = {
945 		.str   = "config=10,config1,config2=3,umask=1",
946 		.check = test__checkterms_simple,
947 	},
948 };
949 
950 static int test_event(struct test__event_st *e)
951 {
952 	struct perf_evlist *evlist;
953 	int ret;
954 
955 	evlist = perf_evlist__new(NULL, NULL);
956 	if (evlist == NULL)
957 		return -ENOMEM;
958 
959 	ret = parse_events(evlist, e->name, 0);
960 	if (ret) {
961 		pr_debug("failed to parse event '%s', err %d\n",
962 			 e->name, ret);
963 		return ret;
964 	}
965 
966 	ret = e->check(evlist);
967 	perf_evlist__delete(evlist);
968 
969 	return ret;
970 }
971 
972 static int test_events(struct test__event_st *events, unsigned cnt)
973 {
974 	int ret1, ret2 = 0;
975 	unsigned i;
976 
977 	for (i = 0; i < cnt; i++) {
978 		struct test__event_st *e = &events[i];
979 
980 		pr_debug("running test %d '%s'\n", i, e->name);
981 		ret1 = test_event(e);
982 		if (ret1)
983 			ret2 = ret1;
984 	}
985 
986 	return ret2;
987 }
988 
989 static int test_term(struct test__term *t)
990 {
991 	struct list_head *terms;
992 	int ret;
993 
994 	terms = malloc(sizeof(*terms));
995 	if (!terms)
996 		return -ENOMEM;
997 
998 	INIT_LIST_HEAD(terms);
999 
1000 	ret = parse_events_terms(terms, t->str);
1001 	if (ret) {
1002 		pr_debug("failed to parse terms '%s', err %d\n",
1003 			 t->str , ret);
1004 		return ret;
1005 	}
1006 
1007 	ret = t->check(terms);
1008 	parse_events__free_terms(terms);
1009 
1010 	return ret;
1011 }
1012 
1013 static int test_terms(struct test__term *terms, unsigned cnt)
1014 {
1015 	int ret = 0;
1016 	unsigned i;
1017 
1018 	for (i = 0; i < cnt; i++) {
1019 		struct test__term *t = &terms[i];
1020 
1021 		pr_debug("running test %d '%s'\n", i, t->str);
1022 		ret = test_term(t);
1023 		if (ret)
1024 			break;
1025 	}
1026 
1027 	return ret;
1028 }
1029 
1030 static int test_pmu(void)
1031 {
1032 	struct stat st;
1033 	char path[PATH_MAX];
1034 	int ret;
1035 
1036 	snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/format/",
1037 		 sysfs_find_mountpoint());
1038 
1039 	ret = stat(path, &st);
1040 	if (ret)
1041 		pr_debug("omitting PMU cpu tests\n");
1042 	return !ret;
1043 }
1044 
1045 static int test_pmu_events(void)
1046 {
1047 	struct stat st;
1048 	char path[PATH_MAX];
1049 	struct dirent *ent;
1050 	DIR *dir;
1051 	int ret;
1052 
1053 	snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/events/",
1054 		 sysfs_find_mountpoint());
1055 
1056 	ret = stat(path, &st);
1057 	if (ret) {
1058 		pr_debug("ommiting PMU cpu events tests\n");
1059 		return 0;
1060 	}
1061 
1062 	dir = opendir(path);
1063 	if (!dir) {
1064 		pr_debug("can't open pmu event dir");
1065 		return -1;
1066 	}
1067 
1068 	while (!ret && (ent = readdir(dir))) {
1069 #define MAX_NAME 100
1070 		struct test__event_st e;
1071 		char name[MAX_NAME];
1072 
1073 		if (!strcmp(ent->d_name, ".") ||
1074 		    !strcmp(ent->d_name, ".."))
1075 			continue;
1076 
1077 		snprintf(name, MAX_NAME, "cpu/event=%s/u", ent->d_name);
1078 
1079 		e.name  = name;
1080 		e.check = test__checkevent_pmu_events;
1081 
1082 		ret = test_event(&e);
1083 #undef MAX_NAME
1084 	}
1085 
1086 	closedir(dir);
1087 	return ret;
1088 }
1089 
1090 int test__parse_events(void)
1091 {
1092 	int ret1, ret2 = 0;
1093 
1094 #define TEST_EVENTS(tests)				\
1095 do {							\
1096 	ret1 = test_events(tests, ARRAY_SIZE(tests));	\
1097 	if (!ret2)					\
1098 		ret2 = ret1;				\
1099 } while (0)
1100 
1101 	TEST_EVENTS(test__events);
1102 
1103 	if (test_pmu())
1104 		TEST_EVENTS(test__events_pmu);
1105 
1106 	if (test_pmu()) {
1107 		int ret = test_pmu_events();
1108 		if (ret)
1109 			return ret;
1110 	}
1111 
1112 	ret1 = test_terms(test__terms, ARRAY_SIZE(test__terms));
1113 	if (!ret2)
1114 		ret2 = ret1;
1115 
1116 	return ret2;
1117 }
1118