aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/tests/code-reading.c33
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
485static 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 */
506out_clocks:
507 event = excl_kernel ? "cpu-clock:u" : "cpu-clock";
508
509#endif
510 return event;
511}
512
485static void do_something(void) 513static 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) {