aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/tests/sample-parsing.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/tests/sample-parsing.c')
-rw-r--r--tools/perf/tests/sample-parsing.c55
1 files changed, 40 insertions, 15 deletions
diff --git a/tools/perf/tests/sample-parsing.c b/tools/perf/tests/sample-parsing.c
index ca292f9a4ae2..4908c648a597 100644
--- a/tools/perf/tests/sample-parsing.c
+++ b/tools/perf/tests/sample-parsing.c
@@ -126,16 +126,28 @@ static bool samples_same(const struct perf_sample *s1,
126 if (type & PERF_SAMPLE_TRANSACTION) 126 if (type & PERF_SAMPLE_TRANSACTION)
127 COMP(transaction); 127 COMP(transaction);
128 128
129 if (type & PERF_SAMPLE_REGS_INTR) {
130 size_t sz = hweight_long(s1->intr_regs.mask) * sizeof(u64);
131
132 COMP(intr_regs.mask);
133 COMP(intr_regs.abi);
134 if (s1->intr_regs.abi &&
135 (!s1->intr_regs.regs || !s2->intr_regs.regs ||
136 memcmp(s1->intr_regs.regs, s2->intr_regs.regs, sz))) {
137 pr_debug("Samples differ at 'intr_regs'\n");
138 return false;
139 }
140 }
141
129 return true; 142 return true;
130} 143}
131 144
132static int do_test(u64 sample_type, u64 sample_regs_user, u64 read_format) 145static int do_test(u64 sample_type, u64 sample_regs, u64 read_format)
133{ 146{
134 struct perf_evsel evsel = { 147 struct perf_evsel evsel = {
135 .needs_swap = false, 148 .needs_swap = false,
136 .attr = { 149 .attr = {
137 .sample_type = sample_type, 150 .sample_type = sample_type,
138 .sample_regs_user = sample_regs_user,
139 .read_format = read_format, 151 .read_format = read_format,
140 }, 152 },
141 }; 153 };
@@ -154,7 +166,7 @@ static int do_test(u64 sample_type, u64 sample_regs_user, u64 read_format)
154 /* 1 branch_entry */ 166 /* 1 branch_entry */
155 .data = {1, 211, 212, 213}, 167 .data = {1, 211, 212, 213},
156 }; 168 };
157 u64 user_regs[64]; 169 u64 regs[64];
158 const u64 raw_data[] = {0x123456780a0b0c0dULL, 0x1102030405060708ULL}; 170 const u64 raw_data[] = {0x123456780a0b0c0dULL, 0x1102030405060708ULL};
159 const u64 data[] = {0x2211443366558877ULL, 0, 0xaabbccddeeff4321ULL}; 171 const u64 data[] = {0x2211443366558877ULL, 0, 0xaabbccddeeff4321ULL};
160 struct perf_sample sample = { 172 struct perf_sample sample = {
@@ -176,8 +188,8 @@ static int do_test(u64 sample_type, u64 sample_regs_user, u64 read_format)
176 .branch_stack = &branch_stack.branch_stack, 188 .branch_stack = &branch_stack.branch_stack,
177 .user_regs = { 189 .user_regs = {
178 .abi = PERF_SAMPLE_REGS_ABI_64, 190 .abi = PERF_SAMPLE_REGS_ABI_64,
179 .mask = sample_regs_user, 191 .mask = sample_regs,
180 .regs = user_regs, 192 .regs = regs,
181 }, 193 },
182 .user_stack = { 194 .user_stack = {
183 .size = sizeof(data), 195 .size = sizeof(data),
@@ -187,14 +199,25 @@ static int do_test(u64 sample_type, u64 sample_regs_user, u64 read_format)
187 .time_enabled = 0x030a59d664fca7deULL, 199 .time_enabled = 0x030a59d664fca7deULL,
188 .time_running = 0x011b6ae553eb98edULL, 200 .time_running = 0x011b6ae553eb98edULL,
189 }, 201 },
202 .intr_regs = {
203 .abi = PERF_SAMPLE_REGS_ABI_64,
204 .mask = sample_regs,
205 .regs = regs,
206 },
190 }; 207 };
191 struct sample_read_value values[] = {{1, 5}, {9, 3}, {2, 7}, {6, 4},}; 208 struct sample_read_value values[] = {{1, 5}, {9, 3}, {2, 7}, {6, 4},};
192 struct perf_sample sample_out; 209 struct perf_sample sample_out;
193 size_t i, sz, bufsz; 210 size_t i, sz, bufsz;
194 int err, ret = -1; 211 int err, ret = -1;
195 212
196 for (i = 0; i < sizeof(user_regs); i++) 213 if (sample_type & PERF_SAMPLE_REGS_USER)
197 *(i + (u8 *)user_regs) = i & 0xfe; 214 evsel.attr.sample_regs_user = sample_regs;
215
216 if (sample_type & PERF_SAMPLE_REGS_INTR)
217 evsel.attr.sample_regs_intr = sample_regs;
218
219 for (i = 0; i < sizeof(regs); i++)
220 *(i + (u8 *)regs) = i & 0xfe;
198 221
199 if (read_format & PERF_FORMAT_GROUP) { 222 if (read_format & PERF_FORMAT_GROUP) {
200 sample.read.group.nr = 4; 223 sample.read.group.nr = 4;
@@ -271,7 +294,7 @@ int test__sample_parsing(void)
271{ 294{
272 const u64 rf[] = {4, 5, 6, 7, 12, 13, 14, 15}; 295 const u64 rf[] = {4, 5, 6, 7, 12, 13, 14, 15};
273 u64 sample_type; 296 u64 sample_type;
274 u64 sample_regs_user; 297 u64 sample_regs;
275 size_t i; 298 size_t i;
276 int err; 299 int err;
277 300
@@ -280,7 +303,7 @@ int test__sample_parsing(void)
280 * were added. Please actually update the test rather than just change 303 * were added. Please actually update the test rather than just change
281 * the condition below. 304 * the condition below.
282 */ 305 */
283 if (PERF_SAMPLE_MAX > PERF_SAMPLE_TRANSACTION << 1) { 306 if (PERF_SAMPLE_MAX > PERF_SAMPLE_REGS_INTR << 1) {
284 pr_debug("sample format has changed, some new PERF_SAMPLE_ bit was introduced - test needs updating\n"); 307 pr_debug("sample format has changed, some new PERF_SAMPLE_ bit was introduced - test needs updating\n");
285 return -1; 308 return -1;
286 } 309 }
@@ -297,22 +320,24 @@ int test__sample_parsing(void)
297 } 320 }
298 continue; 321 continue;
299 } 322 }
323 sample_regs = 0;
300 324
301 if (sample_type == PERF_SAMPLE_REGS_USER) 325 if (sample_type == PERF_SAMPLE_REGS_USER)
302 sample_regs_user = 0x3fff; 326 sample_regs = 0x3fff;
303 else 327
304 sample_regs_user = 0; 328 if (sample_type == PERF_SAMPLE_REGS_INTR)
329 sample_regs = 0xff0fff;
305 330
306 err = do_test(sample_type, sample_regs_user, 0); 331 err = do_test(sample_type, sample_regs, 0);
307 if (err) 332 if (err)
308 return err; 333 return err;
309 } 334 }
310 335
311 /* Test all sample format bits together */ 336 /* Test all sample format bits together */
312 sample_type = PERF_SAMPLE_MAX - 1; 337 sample_type = PERF_SAMPLE_MAX - 1;
313 sample_regs_user = 0x3fff; 338 sample_regs = 0x3fff; /* shared yb intr and user regs */
314 for (i = 0; i < ARRAY_SIZE(rf); i++) { 339 for (i = 0; i < ARRAY_SIZE(rf); i++) {
315 err = do_test(sample_type, sample_regs_user, rf[i]); 340 err = do_test(sample_type, sample_regs, rf[i]);
316 if (err) 341 if (err)
317 return err; 342 return err;
318 } 343 }