diff options
Diffstat (limited to 'tools/perf/tests/sample-parsing.c')
-rw-r--r-- | tools/perf/tests/sample-parsing.c | 55 |
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 | ||
132 | static int do_test(u64 sample_type, u64 sample_regs_user, u64 read_format) | 145 | static 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 | } |