perf env: Track kernel 64-bit mode in environment
authorLeo Yan <leo.yan@linaro.org>
Mon, 9 Aug 2021 11:27:25 +0000 (19:27 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 9 Aug 2021 20:11:18 +0000 (17:11 -0300)
It's useful to know that the kernel is running in 32-bit or 64-bit mode.
E.g. We can decide if perf tool is running in compat mode based on the
info.

This patch adds an item "kernel_is_64_bit" into session's environment
structure perf_env, its value is initialized based on the architecture
string.

Suggested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Leo Yan <leo.yan@linaro.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: John Garry <john.garry@huawei.com>
Cc: Li Huafei <lihuafei1@huawei.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Riccardo Mancini <rickyman7@gmail.com>
Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: coresight@lists.linaro.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: russell king <linux@armlinux.org.uk>
Link: http://lore.kernel.org/lkml/20210809112727.596876-2-leo.yan@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/env.c
tools/perf/util/env.h

index ab34105..8f7ff00 100644 (file)
@@ -219,13 +219,35 @@ void perf_env__exit(struct perf_env *env)
        zfree(&env->hybrid_cpc_nodes);
 }
 
-void perf_env__init(struct perf_env *env __maybe_unused)
+void perf_env__init(struct perf_env *env)
 {
 #ifdef HAVE_LIBBPF_SUPPORT
        env->bpf_progs.infos = RB_ROOT;
        env->bpf_progs.btfs = RB_ROOT;
        init_rwsem(&env->bpf_progs.lock);
 #endif
+       env->kernel_is_64_bit = -1;
+}
+
+static void perf_env__init_kernel_mode(struct perf_env *env)
+{
+       const char *arch = perf_env__raw_arch(env);
+
+       if (!strncmp(arch, "x86_64", 6) || !strncmp(arch, "aarch64", 7) ||
+           !strncmp(arch, "arm64", 5) || !strncmp(arch, "mips64", 6) ||
+           !strncmp(arch, "parisc64", 8) || !strncmp(arch, "riscv64", 7) ||
+           !strncmp(arch, "s390x", 5) || !strncmp(arch, "sparc64", 7))
+               env->kernel_is_64_bit = 1;
+       else
+               env->kernel_is_64_bit = 0;
+}
+
+int perf_env__kernel_is_64_bit(struct perf_env *env)
+{
+       if (env->kernel_is_64_bit == -1)
+               perf_env__init_kernel_mode(env);
+
+       return env->kernel_is_64_bit;
 }
 
 int perf_env__set_cmdline(struct perf_env *env, int argc, const char *argv[])
index 6824a74..1f51758 100644 (file)
@@ -61,6 +61,7 @@ struct perf_env {
        unsigned long long      total_mem;
        unsigned int            msr_pmu_type;
        unsigned int            max_branches;
+       int                     kernel_is_64_bit;
 
        int                     nr_cmdline;
        int                     nr_sibling_cores;
@@ -143,6 +144,8 @@ extern struct perf_env perf_env;
 
 void perf_env__exit(struct perf_env *env);
 
+int perf_env__kernel_is_64_bit(struct perf_env *env);
+
 int perf_env__set_cmdline(struct perf_env *env, int argc, const char *argv[]);
 
 int perf_env__read_cpuid(struct perf_env *env);