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 | } |
