Linux Audio

Check our new training course

Loading...
  1
  2#include "parse-events.h"
  3#include "evsel.h"
  4#include "evlist.h"
  5#include "sysfs.h"
  6#include "../../../include/linux/hw_breakpoint.h"
  7
  8#define TEST_ASSERT_VAL(text, cond) \
  9do { \
 10	if (!(cond)) { \
 11		pr_debug("FAILED %s:%d %s\n", __FILE__, __LINE__, text); \
 12		return -1; \
 13	} \
 14} while (0)
 15
 16static int test__checkevent_tracepoint(struct perf_evlist *evlist)
 17{
 18	struct perf_evsel *evsel = list_entry(evlist->entries.next,
 19					      struct perf_evsel, node);
 20
 21	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
 22	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
 23	TEST_ASSERT_VAL("wrong sample_type",
 24		(PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | PERF_SAMPLE_CPU) ==
 25		evsel->attr.sample_type);
 26	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
 27	return 0;
 28}
 29
 30static int test__checkevent_tracepoint_multi(struct perf_evlist *evlist)
 31{
 32	struct perf_evsel *evsel;
 33
 34	TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
 35
 36	list_for_each_entry(evsel, &evlist->entries, node) {
 37		TEST_ASSERT_VAL("wrong type",
 38			PERF_TYPE_TRACEPOINT == evsel->attr.type);
 39		TEST_ASSERT_VAL("wrong sample_type",
 40			(PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | PERF_SAMPLE_CPU)
 41			== evsel->attr.sample_type);
 42		TEST_ASSERT_VAL("wrong sample_period",
 43			1 == evsel->attr.sample_period);
 44	}
 45	return 0;
 46}
 47
 48static int test__checkevent_raw(struct perf_evlist *evlist)
 49{
 50	struct perf_evsel *evsel = list_entry(evlist->entries.next,
 51					      struct perf_evsel, node);
 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
 59static int test__checkevent_numeric(struct perf_evlist *evlist)
 60{
 61	struct perf_evsel *evsel = list_entry(evlist->entries.next,
 62					      struct perf_evsel, node);
 63
 64	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
 65	TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
 66	TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
 67	return 0;
 68}
 69
 70static int test__checkevent_symbolic_name(struct perf_evlist *evlist)
 71{
 72	struct perf_evsel *evsel = list_entry(evlist->entries.next,
 73					      struct perf_evsel, node);
 74
 75	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
 76	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 77	TEST_ASSERT_VAL("wrong config",
 78			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
 79	return 0;
 80}
 81
 82static int test__checkevent_symbolic_name_config(struct perf_evlist *evlist)
 83{
 84	struct perf_evsel *evsel = list_entry(evlist->entries.next,
 85					      struct perf_evsel, node);
 86
 87	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
 88	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
 89	TEST_ASSERT_VAL("wrong config",
 90			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
 91	TEST_ASSERT_VAL("wrong period",
 92			100000 == evsel->attr.sample_period);
 93	TEST_ASSERT_VAL("wrong config1",
 94			0 == evsel->attr.config1);
 95	TEST_ASSERT_VAL("wrong config2",
 96			1 == evsel->attr.config2);
 97	return 0;
 98}
 99
100static int test__checkevent_symbolic_alias(struct perf_evlist *evlist)
101{
102	struct perf_evsel *evsel = list_entry(evlist->entries.next,
103					      struct perf_evsel, node);
104
105	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
106	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
107	TEST_ASSERT_VAL("wrong config",
108			PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config);
109	return 0;
110}
111
112static int test__checkevent_genhw(struct perf_evlist *evlist)
113{
114	struct perf_evsel *evsel = list_entry(evlist->entries.next,
115					      struct perf_evsel, node);
116
117	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
118	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->attr.type);
119	TEST_ASSERT_VAL("wrong config", (1 << 16) == evsel->attr.config);
120	return 0;
121}
122
123static int test__checkevent_breakpoint(struct perf_evlist *evlist)
124{
125	struct perf_evsel *evsel = list_entry(evlist->entries.next,
126					      struct perf_evsel, node);
127
128	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
129	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
130	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
131	TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
132					 evsel->attr.bp_type);
133	TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_4 ==
134					evsel->attr.bp_len);
135	return 0;
136}
137
138static int test__checkevent_breakpoint_x(struct perf_evlist *evlist)
139{
140	struct perf_evsel *evsel = list_entry(evlist->entries.next,
141					      struct perf_evsel, node);
142
143	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
144	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
145	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
146	TEST_ASSERT_VAL("wrong bp_type",
147			HW_BREAKPOINT_X == evsel->attr.bp_type);
148	TEST_ASSERT_VAL("wrong bp_len", sizeof(long) == evsel->attr.bp_len);
149	return 0;
150}
151
152static int test__checkevent_breakpoint_r(struct perf_evlist *evlist)
153{
154	struct perf_evsel *evsel = list_entry(evlist->entries.next,
155					      struct perf_evsel, node);
156
157	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
158	TEST_ASSERT_VAL("wrong type",
159			PERF_TYPE_BREAKPOINT == evsel->attr.type);
160	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
161	TEST_ASSERT_VAL("wrong bp_type",
162			HW_BREAKPOINT_R == evsel->attr.bp_type);
163	TEST_ASSERT_VAL("wrong bp_len",
164			HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
165	return 0;
166}
167
168static int test__checkevent_breakpoint_w(struct perf_evlist *evlist)
169{
170	struct perf_evsel *evsel = list_entry(evlist->entries.next,
171					      struct perf_evsel, node);
172
173	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
174	TEST_ASSERT_VAL("wrong type",
175			PERF_TYPE_BREAKPOINT == evsel->attr.type);
176	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
177	TEST_ASSERT_VAL("wrong bp_type",
178			HW_BREAKPOINT_W == evsel->attr.bp_type);
179	TEST_ASSERT_VAL("wrong bp_len",
180			HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
181	return 0;
182}
183
184static int test__checkevent_tracepoint_modifier(struct perf_evlist *evlist)
185{
186	struct perf_evsel *evsel = list_entry(evlist->entries.next,
187					      struct perf_evsel, node);
188
189	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
190	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
191	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
192	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
193
194	return test__checkevent_tracepoint(evlist);
195}
196
197static int
198test__checkevent_tracepoint_multi_modifier(struct perf_evlist *evlist)
199{
200	struct perf_evsel *evsel;
201
202	TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
203
204	list_for_each_entry(evsel, &evlist->entries, node) {
205		TEST_ASSERT_VAL("wrong exclude_user",
206				!evsel->attr.exclude_user);
207		TEST_ASSERT_VAL("wrong exclude_kernel",
208				evsel->attr.exclude_kernel);
209		TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
210		TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
211	}
212
213	return test__checkevent_tracepoint_multi(evlist);
214}
215
216static int test__checkevent_raw_modifier(struct perf_evlist *evlist)
217{
218	struct perf_evsel *evsel = list_entry(evlist->entries.next,
219					      struct perf_evsel, node);
220
221	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
222	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
223	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
224	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
225
226	return test__checkevent_raw(evlist);
227}
228
229static int test__checkevent_numeric_modifier(struct perf_evlist *evlist)
230{
231	struct perf_evsel *evsel = list_entry(evlist->entries.next,
232					      struct perf_evsel, node);
233
234	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
235	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
236	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
237	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
238
239	return test__checkevent_numeric(evlist);
240}
241
242static int test__checkevent_symbolic_name_modifier(struct perf_evlist *evlist)
243{
244	struct perf_evsel *evsel = list_entry(evlist->entries.next,
245					      struct perf_evsel, node);
246
247	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
248	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
249	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
250	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
251
252	return test__checkevent_symbolic_name(evlist);
253}
254
255static int test__checkevent_exclude_host_modifier(struct perf_evlist *evlist)
256{
257	struct perf_evsel *evsel = list_entry(evlist->entries.next,
258					      struct perf_evsel, node);
259
260	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
261	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
262
263	return test__checkevent_symbolic_name(evlist);
264}
265
266static int test__checkevent_exclude_guest_modifier(struct perf_evlist *evlist)
267{
268	struct perf_evsel *evsel = list_entry(evlist->entries.next,
269					      struct perf_evsel, node);
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
277static int test__checkevent_symbolic_alias_modifier(struct perf_evlist *evlist)
278{
279	struct perf_evsel *evsel = list_entry(evlist->entries.next,
280					      struct perf_evsel, node);
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 = list_entry(evlist->entries.next,
293					      struct perf_evsel, node);
294
295	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
296	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
297	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
298	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
299
300	return test__checkevent_genhw(evlist);
301}
302
303static int test__checkevent_breakpoint_modifier(struct perf_evlist *evlist)
304{
305	struct perf_evsel *evsel = list_entry(evlist->entries.next,
306					      struct perf_evsel, node);
307
308	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
309	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
310	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
311	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
312
313	return test__checkevent_breakpoint(evlist);
314}
315
316static int test__checkevent_breakpoint_x_modifier(struct perf_evlist *evlist)
317{
318	struct perf_evsel *evsel = list_entry(evlist->entries.next,
319					      struct perf_evsel, node);
320
321	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
322	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
323	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
324	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
325
326	return test__checkevent_breakpoint_x(evlist);
327}
328
329static int test__checkevent_breakpoint_r_modifier(struct perf_evlist *evlist)
330{
331	struct perf_evsel *evsel = list_entry(evlist->entries.next,
332					      struct perf_evsel, node);
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
339	return test__checkevent_breakpoint_r(evlist);
340}
341
342static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist)
343{
344	struct perf_evsel *evsel = list_entry(evlist->entries.next,
345					      struct perf_evsel, node);
346
347	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
348	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
349	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
350	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
351
352	return test__checkevent_breakpoint_w(evlist);
353}
354
355static int test__checkevent_pmu(struct perf_evlist *evlist)
356{
357
358	struct perf_evsel *evsel = list_entry(evlist->entries.next,
359					      struct perf_evsel, node);
360
361	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
362	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
363	TEST_ASSERT_VAL("wrong config",    10 == evsel->attr.config);
364	TEST_ASSERT_VAL("wrong config1",    1 == evsel->attr.config1);
365	TEST_ASSERT_VAL("wrong config2",    3 == evsel->attr.config2);
366	TEST_ASSERT_VAL("wrong period",  1000 == evsel->attr.sample_period);
367
368	return 0;
369}
370
371static int test__checkevent_list(struct perf_evlist *evlist)
372{
373	struct perf_evsel *evsel;
374
375	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
376
377	/* r1 */
378	evsel = list_entry(evlist->entries.next, struct perf_evsel, node);
379	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
380	TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
381	TEST_ASSERT_VAL("wrong config1", 0 == evsel->attr.config1);
382	TEST_ASSERT_VAL("wrong config2", 0 == evsel->attr.config2);
383	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
384	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
385	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
386	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
387
388	/* syscalls:sys_enter_open:k */
389	evsel = list_entry(evsel->node.next, struct perf_evsel, node);
390	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
391	TEST_ASSERT_VAL("wrong sample_type",
392		(PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | PERF_SAMPLE_CPU) ==
393		evsel->attr.sample_type);
394	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
395	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
396	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
397	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
398	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
399
400	/* 1:1:hp */
401	evsel = list_entry(evsel->node.next, struct perf_evsel, node);
402	TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
403	TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
404	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
405	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
406	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
407	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
408
409	return 0;
410}
411
412static int test__checkevent_pmu_name(struct perf_evlist *evlist)
413{
414	struct perf_evsel *evsel;
415
416	/* cpu/config=1,name=krava1/u */
417	evsel = list_entry(evlist->entries.next, struct perf_evsel, node);
418	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
419	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
420	TEST_ASSERT_VAL("wrong config",  1 == evsel->attr.config);
421	TEST_ASSERT_VAL("wrong name", !strcmp(evsel->name, "krava"));
422
423	/* cpu/config=2/" */
424	evsel = list_entry(evsel->node.next, struct perf_evsel, node);
425	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
426	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
427	TEST_ASSERT_VAL("wrong config",  2 == evsel->attr.config);
428	TEST_ASSERT_VAL("wrong name", !strcmp(evsel->name, "raw 0x2"));
429
430	return 0;
431}
432
433struct test__event_st {
434	const char *name;
435	__u32 type;
436	int (*check)(struct perf_evlist *evlist);
437};
438
439static struct test__event_st test__events[] = {
440	[0] = {
441		.name  = "syscalls:sys_enter_open",
442		.check = test__checkevent_tracepoint,
443	},
444	[1] = {
445		.name  = "syscalls:*",
446		.check = test__checkevent_tracepoint_multi,
447	},
448	[2] = {
449		.name  = "r1a",
450		.check = test__checkevent_raw,
451	},
452	[3] = {
453		.name  = "1:1",
454		.check = test__checkevent_numeric,
455	},
456	[4] = {
457		.name  = "instructions",
458		.check = test__checkevent_symbolic_name,
459	},
460	[5] = {
461		.name  = "cycles/period=100000,config2/",
462		.check = test__checkevent_symbolic_name_config,
463	},
464	[6] = {
465		.name  = "faults",
466		.check = test__checkevent_symbolic_alias,
467	},
468	[7] = {
469		.name  = "L1-dcache-load-miss",
470		.check = test__checkevent_genhw,
471	},
472	[8] = {
473		.name  = "mem:0",
474		.check = test__checkevent_breakpoint,
475	},
476	[9] = {
477		.name  = "mem:0:x",
478		.check = test__checkevent_breakpoint_x,
479	},
480	[10] = {
481		.name  = "mem:0:r",
482		.check = test__checkevent_breakpoint_r,
483	},
484	[11] = {
485		.name  = "mem:0:w",
486		.check = test__checkevent_breakpoint_w,
487	},
488	[12] = {
489		.name  = "syscalls:sys_enter_open:k",
490		.check = test__checkevent_tracepoint_modifier,
491	},
492	[13] = {
493		.name  = "syscalls:*:u",
494		.check = test__checkevent_tracepoint_multi_modifier,
495	},
496	[14] = {
497		.name  = "r1a:kp",
498		.check = test__checkevent_raw_modifier,
499	},
500	[15] = {
501		.name  = "1:1:hp",
502		.check = test__checkevent_numeric_modifier,
503	},
504	[16] = {
505		.name  = "instructions:h",
506		.check = test__checkevent_symbolic_name_modifier,
507	},
508	[17] = {
509		.name  = "faults:u",
510		.check = test__checkevent_symbolic_alias_modifier,
511	},
512	[18] = {
513		.name  = "L1-dcache-load-miss:kp",
514		.check = test__checkevent_genhw_modifier,
515	},
516	[19] = {
517		.name  = "mem:0:u",
518		.check = test__checkevent_breakpoint_modifier,
519	},
520	[20] = {
521		.name  = "mem:0:x:k",
522		.check = test__checkevent_breakpoint_x_modifier,
523	},
524	[21] = {
525		.name  = "mem:0:r:hp",
526		.check = test__checkevent_breakpoint_r_modifier,
527	},
528	[22] = {
529		.name  = "mem:0:w:up",
530		.check = test__checkevent_breakpoint_w_modifier,
531	},
532	[23] = {
533		.name  = "r1,syscalls:sys_enter_open:k,1:1:hp",
534		.check = test__checkevent_list,
535	},
536	[24] = {
537		.name  = "instructions:G",
538		.check = test__checkevent_exclude_host_modifier,
539	},
540	[25] = {
541		.name  = "instructions:H",
542		.check = test__checkevent_exclude_guest_modifier,
543	},
544};
545
546#define TEST__EVENTS_CNT (sizeof(test__events) / sizeof(struct test__event_st))
547
548static struct test__event_st test__events_pmu[] = {
549	[0] = {
550		.name  = "cpu/config=10,config1,config2=3,period=1000/u",
551		.check = test__checkevent_pmu,
552	},
553	[1] = {
554		.name  = "cpu/config=1,name=krava/u,cpu/config=2/u",
555		.check = test__checkevent_pmu_name,
556	},
557};
558
559#define TEST__EVENTS_PMU_CNT (sizeof(test__events_pmu) / \
560			      sizeof(struct test__event_st))
561
562static int test(struct test__event_st *e)
563{
564	struct perf_evlist *evlist;
565	int ret;
566
567	evlist = perf_evlist__new(NULL, NULL);
568	if (evlist == NULL)
569		return -ENOMEM;
570
571	ret = parse_events(evlist, e->name, 0);
572	if (ret) {
573		pr_debug("failed to parse event '%s', err %d\n",
574			 e->name, ret);
575		return ret;
576	}
577
578	ret = e->check(evlist);
579	perf_evlist__delete(evlist);
580
581	return ret;
582}
583
584static int test_events(struct test__event_st *events, unsigned cnt)
585{
586	int ret = 0;
587	unsigned i;
588
589	for (i = 0; i < cnt; i++) {
590		struct test__event_st *e = &events[i];
591
592		pr_debug("running test %d '%s'\n", i, e->name);
593		ret = test(e);
594		if (ret)
595			break;
596	}
597
598	return ret;
599}
600
601static int test_pmu(void)
602{
603	struct stat st;
604	char path[PATH_MAX];
605	int ret;
606
607	snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/format/",
608		 sysfs_find_mountpoint());
609
610	ret = stat(path, &st);
611	if (ret)
612		pr_debug("ommiting PMU cpu tests\n");
613	return !ret;
614}
615
616int parse_events__test(void)
617{
618	int ret;
619
620	ret = test_events(test__events, TEST__EVENTS_CNT);
621	if (!ret && test_pmu())
622		ret = test_events(test__events_pmu, TEST__EVENTS_PMU_CNT);
623
624	return ret;
625}