|
@@ -482,6 +482,34 @@ static void fs_something(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static const char *do_determine_event(bool excl_kernel)
|
|
|
+{
|
|
|
+ const char *event = excl_kernel ? "cycles:u" : "cycles";
|
|
|
+
|
|
|
+#ifdef __s390x__
|
|
|
+ char cpuid[128], model[16], model_c[16], cpum_cf_v[16];
|
|
|
+ unsigned int family;
|
|
|
+ int ret, cpum_cf_a;
|
|
|
+
|
|
|
+ if (get_cpuid(cpuid, sizeof(cpuid)))
|
|
|
+ goto out_clocks;
|
|
|
+ ret = sscanf(cpuid, "%*[^,],%u,%[^,],%[^,],%[^,],%x", &family, model_c,
|
|
|
+ model, cpum_cf_v, &cpum_cf_a);
|
|
|
+ if (ret != 5) /* Not available */
|
|
|
+ goto out_clocks;
|
|
|
+ if (excl_kernel && (cpum_cf_a & 4))
|
|
|
+ return event;
|
|
|
+ if (!excl_kernel && (cpum_cf_a & 2))
|
|
|
+ return event;
|
|
|
+
|
|
|
+ /* Fall through: missing authorization */
|
|
|
+out_clocks:
|
|
|
+ event = excl_kernel ? "cpu-clock:u" : "cpu-clock";
|
|
|
+
|
|
|
+#endif
|
|
|
+ return event;
|
|
|
+}
|
|
|
+
|
|
|
static void do_something(void)
|
|
|
{
|
|
|
fs_something();
|
|
@@ -592,10 +620,7 @@ static int do_test_code_reading(bool try_kcore)
|
|
|
|
|
|
perf_evlist__set_maps(evlist, cpus, threads);
|
|
|
|
|
|
- if (excl_kernel)
|
|
|
- str = "cycles:u";
|
|
|
- else
|
|
|
- str = "cycles";
|
|
|
+ str = do_determine_event(excl_kernel);
|
|
|
pr_debug("Parsing event '%s'\n", str);
|
|
|
ret = parse_events(evlist, str, NULL);
|
|
|
if (ret < 0) {
|