diff options
Diffstat (limited to 'tools/perf')
| -rw-r--r-- | tools/perf/tests/code-reading.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c index 3bf7b145b826..c7115d369511 100644 --- a/tools/perf/tests/code-reading.c +++ b/tools/perf/tests/code-reading.c | |||
| @@ -482,6 +482,34 @@ static void fs_something(void) | |||
| 482 | } | 482 | } |
| 483 | } | 483 | } |
| 484 | 484 | ||
| 485 | static const char *do_determine_event(bool excl_kernel) | ||
| 486 | { | ||
| 487 | const char *event = excl_kernel ? "cycles:u" : "cycles"; | ||
| 488 | |||
| 489 | #ifdef __s390x__ | ||
| 490 | char cpuid[128], model[16], model_c[16], cpum_cf_v[16]; | ||
| 491 | unsigned int family; | ||
| 492 | int ret, cpum_cf_a; | ||
| 493 | |||
| 494 | if (get_cpuid(cpuid, sizeof(cpuid))) | ||
| 495 | goto out_clocks; | ||
| 496 | ret = sscanf(cpuid, "%*[^,],%u,%[^,],%[^,],%[^,],%x", &family, model_c, | ||
| 497 | model, cpum_cf_v, &cpum_cf_a); | ||
| 498 | if (ret != 5) /* Not available */ | ||
| 499 | goto out_clocks; | ||
| 500 | if (excl_kernel && (cpum_cf_a & 4)) | ||
| 501 | return event; | ||
| 502 | if (!excl_kernel && (cpum_cf_a & 2)) | ||
| 503 | return event; | ||
| 504 | |||
| 505 | /* Fall through: missing authorization */ | ||
| 506 | out_clocks: | ||
| 507 | event = excl_kernel ? "cpu-clock:u" : "cpu-clock"; | ||
| 508 | |||
| 509 | #endif | ||
| 510 | return event; | ||
| 511 | } | ||
| 512 | |||
| 485 | static void do_something(void) | 513 | static void do_something(void) |
| 486 | { | 514 | { |
| 487 | fs_something(); | 515 | fs_something(); |
| @@ -592,10 +620,7 @@ static int do_test_code_reading(bool try_kcore) | |||
| 592 | 620 | ||
| 593 | perf_evlist__set_maps(evlist, cpus, threads); | 621 | perf_evlist__set_maps(evlist, cpus, threads); |
| 594 | 622 | ||
| 595 | if (excl_kernel) | 623 | str = do_determine_event(excl_kernel); |
| 596 | str = "cycles:u"; | ||
| 597 | else | ||
| 598 | str = "cycles"; | ||
| 599 | pr_debug("Parsing event '%s'\n", str); | 624 | pr_debug("Parsing event '%s'\n", str); |
| 600 | ret = parse_events(evlist, str, NULL); | 625 | ret = parse_events(evlist, str, NULL); |
| 601 | if (ret < 0) { | 626 | if (ret < 0) { |
