perf cs-etm: Add configuration for ETMv3 trace protocol
authorMathieu Poirier <mathieu.poirier@linaro.org>
Tue, 4 Dec 2018 20:39:02 +0000 (13:39 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 17 Dec 2018 17:58:53 +0000 (14:58 -0300)
This patch deals with the proper initialisation of configuration
parameters for the ETMv3 trace protocol in order to properly handle
packets generated by tracers following this specification.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: coresight@lists.linaro.org
Cc: linux-arm-kernel@lists.infradead.org
Link: http://lkml.kernel.org/r/1543955944-10042-2-git-send-email-mathieu.poirier@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
tools/perf/util/cs-etm.c

index 9351bd10d864ee3a80fe50934c763ec034461c9b..6b5525410a435475c45479fa8e23981689d4d1dc 100644 (file)
@@ -53,6 +53,13 @@ struct cs_etm_queue;
 typedef u32 (*cs_etm_mem_cb_type)(struct cs_etm_queue *, u64,
                                  size_t, u8 *);
 
+struct cs_etmv3_trace_params {
+       u32 reg_ctrl;
+       u32 reg_trc_id;
+       u32 reg_ccer;
+       u32 reg_idr;
+};
+
 struct cs_etmv4_trace_params {
        u32 reg_idr0;
        u32 reg_idr1;
@@ -65,6 +72,7 @@ struct cs_etmv4_trace_params {
 struct cs_etm_trace_params {
        int protocol;
        union {
+               struct cs_etmv3_trace_params etmv3;
                struct cs_etmv4_trace_params etmv4;
        };
 };
index 48ad217bf0df0ba3474ca6c3e9040c4f06a07977..76e509c32a282545b2667cff3b1431a2571d6de9 100644 (file)
@@ -114,15 +114,28 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
        /* Use metadata to fill in trace parameters for trace decoder */
        t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
        for (i = 0; i < etm->num_cpu; i++) {
-               t_params[i].protocol = CS_ETM_PROTO_ETMV4i;
-               t_params[i].etmv4.reg_idr0 = etm->metadata[i][CS_ETMV4_TRCIDR0];
-               t_params[i].etmv4.reg_idr1 = etm->metadata[i][CS_ETMV4_TRCIDR1];
-               t_params[i].etmv4.reg_idr2 = etm->metadata[i][CS_ETMV4_TRCIDR2];
-               t_params[i].etmv4.reg_idr8 = etm->metadata[i][CS_ETMV4_TRCIDR8];
-               t_params[i].etmv4.reg_configr =
+               if (etm->metadata[i][CS_ETM_MAGIC] == __perf_cs_etmv3_magic) {
+                       t_params[i].protocol = CS_ETM_PROTO_ETMV3;
+                       t_params[i].etmv3.reg_ctrl =
+                                       etm->metadata[i][CS_ETM_ETMCR];
+                       t_params[i].etmv3.reg_trc_id =
+                                       etm->metadata[i][CS_ETM_ETMTRACEIDR];
+               } else if (etm->metadata[i][CS_ETM_MAGIC] ==
+                                                     __perf_cs_etmv4_magic) {
+                       t_params[i].protocol = CS_ETM_PROTO_ETMV4i;
+                       t_params[i].etmv4.reg_idr0 =
+                                       etm->metadata[i][CS_ETMV4_TRCIDR0];
+                       t_params[i].etmv4.reg_idr1 =
+                                       etm->metadata[i][CS_ETMV4_TRCIDR1];
+                       t_params[i].etmv4.reg_idr2 =
+                                       etm->metadata[i][CS_ETMV4_TRCIDR2];
+                       t_params[i].etmv4.reg_idr8 =
+                                       etm->metadata[i][CS_ETMV4_TRCIDR8];
+                       t_params[i].etmv4.reg_configr =
                                        etm->metadata[i][CS_ETMV4_TRCCONFIGR];
-               t_params[i].etmv4.reg_traceidr =
+                       t_params[i].etmv4.reg_traceidr =
                                        etm->metadata[i][CS_ETMV4_TRCTRACEIDR];
+               }
        }
 
        /* Set decoder parameters to simply print the trace packets */
@@ -352,15 +365,28 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm,
                goto out_free;
 
        for (i = 0; i < etm->num_cpu; i++) {
-               t_params[i].protocol = CS_ETM_PROTO_ETMV4i;
-               t_params[i].etmv4.reg_idr0 = etm->metadata[i][CS_ETMV4_TRCIDR0];
-               t_params[i].etmv4.reg_idr1 = etm->metadata[i][CS_ETMV4_TRCIDR1];
-               t_params[i].etmv4.reg_idr2 = etm->metadata[i][CS_ETMV4_TRCIDR2];
-               t_params[i].etmv4.reg_idr8 = etm->metadata[i][CS_ETMV4_TRCIDR8];
-               t_params[i].etmv4.reg_configr =
+               if (etm->metadata[i][CS_ETM_MAGIC] == __perf_cs_etmv3_magic) {
+                       t_params[i].protocol = CS_ETM_PROTO_ETMV3;
+                       t_params[i].etmv3.reg_ctrl =
+                                       etm->metadata[i][CS_ETM_ETMCR];
+                       t_params[i].etmv3.reg_trc_id =
+                                       etm->metadata[i][CS_ETM_ETMTRACEIDR];
+               } else if (etm->metadata[i][CS_ETM_MAGIC] ==
+                                                       __perf_cs_etmv4_magic) {
+                       t_params[i].protocol = CS_ETM_PROTO_ETMV4i;
+                       t_params[i].etmv4.reg_idr0 =
+                                       etm->metadata[i][CS_ETMV4_TRCIDR0];
+                       t_params[i].etmv4.reg_idr1 =
+                                       etm->metadata[i][CS_ETMV4_TRCIDR1];
+                       t_params[i].etmv4.reg_idr2 =
+                                       etm->metadata[i][CS_ETMV4_TRCIDR2];
+                       t_params[i].etmv4.reg_idr8 =
+                                       etm->metadata[i][CS_ETMV4_TRCIDR8];
+                       t_params[i].etmv4.reg_configr =
                                        etm->metadata[i][CS_ETMV4_TRCCONFIGR];
-               t_params[i].etmv4.reg_traceidr =
+                       t_params[i].etmv4.reg_traceidr =
                                        etm->metadata[i][CS_ETMV4_TRCTRACEIDR];
+               }
        }
 
        /* Set decoder parameters to simply print the trace packets */