return do_write_string(ff, uts.machine);
}
+static int write_e_machine(struct feat_fd *ff,
+ struct evlist *evlist __maybe_unused)
+{
+ /* e_machine expanded from 16 to 32-bits for alignment. */
+ uint32_t e_flags;
+ uint32_t e_machine = perf_session__e_machine(evlist->session, &e_flags);
+ int ret;
+
+ ret = do_write(ff, &e_machine, sizeof(e_machine));
+ if (ret)
+ return ret;
+
+ return do_write(ff, &e_flags, sizeof(e_flags));
+}
+
static int write_version(struct feat_fd *ff,
struct evlist *evlist __maybe_unused)
{
fprintf(fp, "# arch : %s\n", ff->ph->env.arch);
}
+static void print_e_machine(struct feat_fd *ff, FILE *fp)
+{
+ fprintf(fp, "# e_machine : %u\n", ff->ph->env.e_machine);
+ fprintf(fp, "# e_flags : %u\n", ff->ph->env.e_flags);
+}
+
static void print_cpudesc(struct feat_fd *ff, FILE *fp)
{
fprintf(fp, "# cpudesc : %s\n", ff->ph->env.cpu_desc);
FEAT_PROCESS_STR_FUN(cpudesc, cpu_desc);
FEAT_PROCESS_STR_FUN(cpuid, cpuid);
+static int process_e_machine(struct feat_fd *ff, void *data __maybe_unused)
+{
+ int ret;
+
+ ret = do_read_u32(ff, &ff->ph->env.e_machine);
+ if (ret)
+ return ret;
+
+ return do_read_u32(ff, &ff->ph->env.e_flags);
+}
+
#ifdef HAVE_LIBTRACEEVENT
static int process_tracing_data(struct feat_fd *ff, void *data)
{
FEAT_OPN(HYBRID_TOPOLOGY, hybrid_topology, true),
FEAT_OPR(PMU_CAPS, pmu_caps, false),
FEAT_OPR(CPU_DOMAIN_INFO, cpu_domain_info, true),
+ FEAT_OPR(E_MACHINE, e_machine, false),
};
struct header_print_data {
struct perf_session__e_machine_cb_args {
uint32_t e_flags;
uint16_t e_machine;
- bool need_e_flags;
};
static int perf_session__e_machine_cb(struct thread *thread, void *_args)
struct perf_session__e_machine_cb_args *args = _args;
struct machine *machine = maps__machine(thread__maps(thread));
- args->e_machine = thread__e_machine(thread, machine,
- args->need_e_flags ? &args->e_flags : NULL);
+ args->e_machine = thread__e_machine(thread, machine, &args->e_flags);
return args->e_machine != EM_NONE ? 1 : 0;
}
{
struct perf_session__e_machine_cb_args args = {
.e_machine = EM_NONE,
- .need_e_flags = e_flags != NULL,
};
+ struct perf_env *env;
if (!session) {
/* Default to assuming a host machine. */
return EM_HOST;
}
+ env = perf_session__env(session);
+ if (env && env->e_machine != EM_NONE) {
+ if (e_flags)
+ *e_flags = env->e_flags;
+
+ return env->e_machine;
+ }
+
machines__for_each_thread(&session->machines,
perf_session__e_machine_cb,
&args);
+ if (args.e_machine != EM_NONE) {
+ if (env) {
+ env->e_machine = args.e_machine;
+ env->e_flags = args.e_flags;
+ }
+ if (e_flags)
+ *e_flags = args.e_flags;
+
+ return args.e_machine;
+ }
+
+ /*
+ * Couldn't determine from the perf_env or current set of
+ * threads. Default to the host.
+ */
if (e_flags)
- *e_flags = args.e_flags;
+ *e_flags = EF_HOST;
- return args.e_machine == EM_NONE ? EM_HOST : args.e_machine;
+ return EM_HOST;
}