perf intel-pt: Record Event Trace capability flag
authorAdrian Hunter <adrian.hunter@intel.com>
Mon, 24 Jan 2022 08:41:49 +0000 (10:41 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 15 Feb 2022 20:11:16 +0000 (17:11 -0300)
The change to the MODE.Exec packet means processing must distinguish
between the old and new cases. Record the Event Trace capability flag to
make that possible.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: https://lore.kernel.org/r/20220124084201.2699795-14-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/arch/x86/util/intel-pt.c
tools/perf/util/intel-pt.c

index 6df0dc0..8c31578 100644 (file)
@@ -306,6 +306,7 @@ intel_pt_info_priv_size(struct auxtrace_record *itr, struct evlist *evlist)
 
        ptr->priv_size = (INTEL_PT_AUXTRACE_PRIV_MAX * sizeof(u64)) +
                         intel_pt_filter_bytes(filter);
+       ptr->priv_size += sizeof(u64); /* Cap Event Trace */
 
        return ptr->priv_size;
 }
@@ -335,6 +336,7 @@ static int intel_pt_info_fill(struct auxtrace_record *itr,
        unsigned long max_non_turbo_ratio;
        size_t filter_str_len;
        const char *filter;
+       int event_trace;
        __u64 *info;
        int err;
 
@@ -357,6 +359,9 @@ static int intel_pt_info_fill(struct auxtrace_record *itr,
        if (perf_pmu__scan_file(intel_pt_pmu, "max_nonturbo_ratio",
                                "%lu", &max_non_turbo_ratio) != 1)
                max_non_turbo_ratio = 0;
+       if (perf_pmu__scan_file(intel_pt_pmu, "caps/event_trace",
+                               "%d", &event_trace) != 1)
+               event_trace = 0;
 
        filter = intel_pt_find_filter(session->evlist, ptr->intel_pt_pmu);
        filter_str_len = filter ? strlen(filter) : 0;
@@ -407,6 +412,8 @@ static int intel_pt_info_fill(struct auxtrace_record *itr,
                info += len >> 3;
        }
 
+       *info++ = event_trace;
+
        return 0;
 }
 
index f3e5c2d..23cb272 100644 (file)
@@ -75,6 +75,7 @@ struct intel_pt {
        bool mispred_all;
        bool use_thread_stack;
        bool callstack;
+       bool cap_event_trace;
        unsigned int br_stack_sz;
        unsigned int br_stack_sz_plus;
        int have_sched_switch;
@@ -3795,7 +3796,7 @@ int intel_pt_process_auxtrace_info(union perf_event *event,
        }
 
        info = &auxtrace_info->priv[INTEL_PT_FILTER_STR_LEN] + 1;
-       info_end = (void *)info + auxtrace_info->header.size;
+       info_end = (void *)auxtrace_info + auxtrace_info->header.size;
 
        if (intel_pt_has(auxtrace_info, INTEL_PT_FILTER_STR_LEN)) {
                size_t len;
@@ -3834,6 +3835,13 @@ int intel_pt_process_auxtrace_info(union perf_event *event,
                intel_pt_print_info_str("Filter string", pt->filter);
        }
 
+       if ((void *)info < info_end) {
+               pt->cap_event_trace = *info++;
+               if (dump_trace)
+                       fprintf(stdout, "  Cap Event Trace     %d\n",
+                               pt->cap_event_trace);
+       }
+
        pt->timeless_decoding = intel_pt_timeless_decoding(pt);
        if (pt->timeless_decoding && !pt->tc.time_mult)
                pt->tc.time_mult = 1;