1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * builtin-test.c
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Builtin regression testing command: ever growing number of sanity tests
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "builtin.h"
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "intlist.h"
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "tests.h"
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "debug.h"
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "color.h"
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "parse-options.h"
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "symbol.h"
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic struct test {
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	const char *desc;
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int (*func)(void);
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} tests[] = {
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "vmlinux symtab matches kallsyms",
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__vmlinux_matches_kallsyms,
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "detect open syscall event",
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__open_syscall_event,
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "detect open syscall event on all cpus",
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__open_syscall_event_on_all_cpus,
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "read samples using the mmap interface",
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__basic_mmap,
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "parse events tests",
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__parse_events,
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#if defined(__x86_64__) || defined(__i386__)
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "x86 rdpmc test",
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__rdpmc,
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Validate PERF_RECORD_* events & perf_sample fields",
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__PERF_RECORD,
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Test perf pmu format parsing",
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__pmu,
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Test dso data interface",
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__dso_data,
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "roundtrip evsel->name check",
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__perf_evsel__roundtrip_name_test,
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Check parsing of sched tracepoints fields",
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__perf_evsel__tp_sched_test,
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Generate and check syscalls:sys_enter_open event fields",
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__syscall_open_tp_fields,
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "struct perf_event_attr setup",
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__attr,
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Test matching and linking multiple hists",
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__hists_link,
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Try 'use perf' in python, checking link problems",
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__python_use,
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Test breakpoint overflow signal handler",
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__bp_signal,
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Test breakpoint overflow sampling",
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__bp_signal_overflow,
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Test number of exit event of a simple workload",
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__task_exit,
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Test software clock events have valid period values",
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__sw_clock_freq,
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#if defined(__x86_64__) || defined(__i386__)
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Test converting perf time to TSC",
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__perf_time_to_tsc,
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Test object code reading",
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__code_reading,
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Test sample parsing",
108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__sample_parsing,
109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Test using a dummy software event to keep tracking",
112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__keep_tracking,
113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.desc = "Test parsing with no sample_id_all bit set",
116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = test__parse_no_sample_id_all,
117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	{
119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		.func = NULL,
120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	},
121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic bool perf_test__matches(int curr, int argc, const char *argv[])
124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int i;
126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (argc == 0)
128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return true;
129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	for (i = 0; i < argc; ++i) {
131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		char *end;
132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		long nr = strtoul(argv[i], &end, 10);
133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (*end == '\0') {
135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			if (nr == curr + 1)
136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				return true;
137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			continue;
138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (strstr(tests[curr].desc, argv[i]))
141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			return true;
142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return false;
145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int __cmd_test(int argc, const char *argv[], struct intlist *skiplist)
148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int i = 0;
150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int width = 0;
151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	while (tests[i].func) {
153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		int len = strlen(tests[i].desc);
154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (width < len)
156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			width = len;
157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		++i;
158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	i = 0;
161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	while (tests[i].func) {
162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		int curr = i++, err;
163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (!perf_test__matches(curr, argc, argv))
165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			continue;
166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pr_info("%2d: %-*s:", i, width, tests[curr].desc);
168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (intlist__find(skiplist, i)) {
170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			color_fprintf(stderr, PERF_COLOR_YELLOW, " Skip (user override)\n");
171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			continue;
172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pr_debug("\n--- start ---\n");
175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		err = tests[curr].func();
176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pr_debug("---- end ----\n%s:", tests[curr].desc);
177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		switch (err) {
179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		case TEST_OK:
180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			pr_info(" Ok\n");
181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			break;
182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		case TEST_SKIP:
183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			color_fprintf(stderr, PERF_COLOR_YELLOW, " Skip\n");
184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			break;
185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		case TEST_FAIL:
186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		default:
187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			color_fprintf(stderr, PERF_COLOR_RED, " FAILED!\n");
188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			break;
189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		}
190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return 0;
193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int perf_test__list(int argc, const char **argv)
196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int i = 0;
198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	while (tests[i].func) {
200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		int curr = i++;
201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (argc > 1 && !strstr(tests[curr].desc, argv[1]))
203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			continue;
204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		pr_info("%2d: %s\n", i, tests[curr].desc);
206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return 0;
209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint cmd_test(int argc, const char **argv, const char *prefix __maybe_unused)
212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	const char * const test_usage[] = {
214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	"perf test [<options>] [{list <test-name-fragment>|[<test-name-fragments>|<test-numbers>]}]",
215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	NULL,
216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	};
217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	const char *skip = NULL;
218e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	const struct option test_options[] = {
219e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	OPT_STRING('s', "skip", &skip, "tests", "tests to skip"),
220e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	OPT_INCR('v', "verbose", &verbose,
221e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		    "be more verbose (show symbol address, etc)"),
222e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	OPT_END()
223e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	};
224e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct intlist *skiplist = NULL;
225e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
226e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	argc = parse_options(argc, argv, test_options, test_usage, 0);
227e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (argc >= 1 && !strcmp(argv[0], "list"))
228e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return perf_test__list(argc, argv);
229e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
230e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	symbol_conf.priv_size = sizeof(int);
231e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	symbol_conf.sort_by_name = true;
232e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	symbol_conf.try_vmlinux_path = true;
233e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
234e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (symbol__init() < 0)
235e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return -1;
236e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
237e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (skip != NULL)
238e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		skiplist = intlist__new(skip);
239e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
240e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return __cmd_test(argc, argv, skiplist);
241e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
242