Provide hooks so that an Instruction Trace
decoder can process Instruction Tracing
events.

Signed-off-by: Adrian Hunter <adrian.hun...@intel.com>
---
 tools/perf/util/itrace.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++
 tools/perf/util/itrace.h | 13 +++++++++++++
 2 files changed, 62 insertions(+)

diff --git a/tools/perf/util/itrace.c b/tools/perf/util/itrace.c
index e9c46fc..c3b0993 100644
--- a/tools/perf/util/itrace.c
+++ b/tools/perf/util/itrace.c
@@ -602,6 +602,28 @@ out_free:
        return err;
 }
 
+static bool itrace__dont_decode(struct perf_session *session)
+{
+       return !session->itrace_synth_opts ||
+              session->itrace_synth_opts->dont_decode;
+}
+
+int perf_event__process_itrace_info(struct perf_tool *tool __maybe_unused,
+                                   union perf_event *event,
+                                   struct perf_session *session __maybe_unused)
+{
+       enum itrace_type type = event->itrace_info.type;
+
+       if (dump_trace)
+               fprintf(stdout, " type: %u\n", type);
+
+       switch (type) {
+       case PERF_ITRACE_UNKNOWN:
+       default:
+               return -EINVAL;
+       }
+}
+
 int perf_event__synthesize_itrace(struct perf_tool *tool,
                                  perf_event__handler_t process,
                                  size_t size, u64 offset, u64 ref, int idx,
@@ -622,6 +644,30 @@ int perf_event__synthesize_itrace(struct perf_tool *tool,
        return process(tool, &ev, NULL, NULL);
 }
 
+s64 perf_event__process_itrace(struct perf_tool *tool, union perf_event *event,
+                              struct perf_session *session)
+{
+       s64 err;
+
+       if (dump_trace)
+               fprintf(stdout, " size: %#"PRIx64"  offset: %#"PRIx64"  ref: 
%#"PRIx64"  idx: %u  tid: %d  cpu: %d\n",
+                       event->itrace.size, event->itrace.offset,
+                       event->itrace.reference, event->itrace.idx,
+                       event->itrace.tid, event->itrace.cpu);
+
+       if (itrace__dont_decode(session))
+               return event->itrace.size;
+
+       if (!session->itrace || event->header.type != PERF_RECORD_ITRACE)
+               return -EINVAL;
+
+       err = session->itrace->process_itrace_event(session, event, tool);
+       if (err < 0)
+               return err;
+
+       return event->itrace.size;
+}
+
 #define PERF_ITRACE_DEFAULT_PERIOD_TYPE                
PERF_ITRACE_PERIOD_NANOSECS
 #define PERF_ITRACE_DEFAULT_PERIOD             100000
 #define PERF_ITRACE_DEFAULT_CALLCHAIN_SZ       16
@@ -767,6 +813,9 @@ int perf_event__process_itrace_error(struct perf_tool *tool 
__maybe_unused,
                                     union perf_event *event,
                                     struct perf_session *session)
 {
+       if (itrace__dont_decode(session))
+               return 0;
+
        if (session->itrace)
                session->itrace->error_count += 1;
 
diff --git a/tools/perf/util/itrace.h b/tools/perf/util/itrace.h
index 0b00d50..08247d5 100644
--- a/tools/perf/util/itrace.h
+++ b/tools/perf/util/itrace.h
@@ -34,6 +34,10 @@ struct option;
 struct record_opts;
 struct itrace_info_event;
 
+enum itrace_type {
+       PERF_ITRACE_UNKNOWN,
+};
+
 enum itrace_error_type {
        PERF_ITRACE_DECODER_ERROR = 1,
 };
@@ -90,6 +94,9 @@ struct itrace {
                             union perf_event *event,
                             struct perf_sample *sample,
                             struct perf_tool *tool);
+       int (*process_itrace_event)(struct perf_session *session,
+                                   union perf_event *event,
+                                   struct perf_tool *tool);
        int (*flush_events)(struct perf_session *session,
                            struct perf_tool *tool);
        void (*free_events)(struct perf_session *session);
@@ -330,10 +337,16 @@ int perf_event__synthesize_itrace_info(struct 
itrace_record *itr,
                                       struct perf_tool *tool,
                                       struct perf_session *session,
                                       perf_event__handler_t process);
+int perf_event__process_itrace_info(struct perf_tool *tool,
+                                   union perf_event *event,
+                                   struct perf_session *session);
 int perf_event__synthesize_itrace(struct perf_tool *tool,
                                  perf_event__handler_t process,
                                  size_t size, u64 offset, u64 ref, int idx,
                                  u32 tid, u32 cpu);
+s64 perf_event__process_itrace(struct perf_tool *tool,
+                              union perf_event *event,
+                              struct perf_session *session);
 int perf_event__process_itrace_error(struct perf_tool *tool,
                                     union perf_event *event,
                                     struct perf_session *session);
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to