Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf cs-etm: Create ETE decoder

If the magic number indicates ETE instantiate a OCSD_BUILTIN_DCD_ETE
decoder instead of OCSD_BUILTIN_DCD_ETMV4I. ETE is the new trace feature
for Armv9.

Testing performed
=================

* Old files with v0 and v1 headers for ETMv4 still open correctly
* New files with new magic number open on new versions of perf
* New files with new magic number fail to open on old versions of perf
* Decoding with the ETE decoder results in the same output as the ETMv4
decoder as long as there are no new ETE packet types

Reviewed-by: Leo Yan <leo.yan@linaro.org>
Signed-off-by: James Clark <james.clark@arm.com>
Acked-by: Suzuki Poulouse <suzuki.poulose@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: John Garry <john.garry@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: Will Deacon <will@kernel.org>
Cc: coresight@lists.linaro.org
Cc: linux-arm-kernel@lists.infradead.org
Link: https //lore.kernel.org/r/20210806134109.1182235-8-james.clark@arm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

James Clark and committed by
Arnaldo Carvalho de Melo
779f414a 212095f7

+50
+20
tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
··· 157 157 config->core_prof = profile_CortexA; 158 158 } 159 159 160 + static void cs_etm_decoder__gen_ete_config(struct cs_etm_trace_params *params, 161 + ocsd_ete_cfg *config) 162 + { 163 + config->reg_configr = params->ete.reg_configr; 164 + config->reg_traceidr = params->ete.reg_traceidr; 165 + config->reg_idr0 = params->ete.reg_idr0; 166 + config->reg_idr1 = params->ete.reg_idr1; 167 + config->reg_idr2 = params->ete.reg_idr2; 168 + config->reg_idr8 = params->ete.reg_idr8; 169 + config->reg_devarch = params->ete.reg_devarch; 170 + config->arch_ver = ARCH_AA64; 171 + config->core_prof = profile_CortexA; 172 + } 173 + 160 174 static void cs_etm_decoder__print_str_cb(const void *p_context, 161 175 const char *msg, 162 176 const int str_len) ··· 618 604 const char *decoder_name; 619 605 ocsd_etmv3_cfg config_etmv3; 620 606 ocsd_etmv4_cfg trace_config_etmv4; 607 + ocsd_ete_cfg trace_config_ete; 621 608 void *trace_config; 622 609 u8 csid; 623 610 ··· 635 620 cs_etm_decoder__gen_etmv4_config(t_params, &trace_config_etmv4); 636 621 decoder_name = OCSD_BUILTIN_DCD_ETMV4I; 637 622 trace_config = &trace_config_etmv4; 623 + break; 624 + case CS_ETM_PROTO_ETE: 625 + cs_etm_decoder__gen_ete_config(t_params, &trace_config_ete); 626 + decoder_name = OCSD_BUILTIN_DCD_ETE; 627 + trace_config = &trace_config_ete; 638 628 break; 639 629 default: 640 630 return -1;
+12
tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
··· 37 37 u32 reg_traceidr; 38 38 }; 39 39 40 + struct cs_ete_trace_params { 41 + u32 reg_idr0; 42 + u32 reg_idr1; 43 + u32 reg_idr2; 44 + u32 reg_idr8; 45 + u32 reg_configr; 46 + u32 reg_traceidr; 47 + u32 reg_devarch; 48 + }; 49 + 40 50 struct cs_etm_trace_params { 41 51 int protocol; 42 52 union { 43 53 struct cs_etmv3_trace_params etmv3; 44 54 struct cs_etmv4_trace_params etmv4; 55 + struct cs_ete_trace_params ete; 45 56 }; 46 57 }; 47 58 ··· 76 65 CS_ETM_PROTO_ETMV4i, 77 66 CS_ETM_PROTO_ETMV4d, 78 67 CS_ETM_PROTO_PTM, 68 + CS_ETM_PROTO_ETE 79 69 }; 80 70 81 71 enum cs_etm_decoder_operation {
+18
tools/perf/util/cs-etm.c
··· 460 460 t_params[idx].etmv4.reg_traceidr = metadata[idx][CS_ETMV4_TRCTRACEIDR]; 461 461 } 462 462 463 + static void cs_etm__set_trace_param_ete(struct cs_etm_trace_params *t_params, 464 + struct cs_etm_auxtrace *etm, int idx) 465 + { 466 + u64 **metadata = etm->metadata; 467 + 468 + t_params[idx].protocol = CS_ETM_PROTO_ETE; 469 + t_params[idx].ete.reg_idr0 = metadata[idx][CS_ETMV4_TRCIDR0]; 470 + t_params[idx].ete.reg_idr1 = metadata[idx][CS_ETMV4_TRCIDR1]; 471 + t_params[idx].ete.reg_idr2 = metadata[idx][CS_ETMV4_TRCIDR2]; 472 + t_params[idx].ete.reg_idr8 = metadata[idx][CS_ETMV4_TRCIDR8]; 473 + t_params[idx].ete.reg_configr = metadata[idx][CS_ETMV4_TRCCONFIGR]; 474 + t_params[idx].ete.reg_traceidr = metadata[idx][CS_ETMV4_TRCTRACEIDR]; 475 + t_params[idx].ete.reg_devarch = metadata[idx][CS_ETE_TRCDEVARCH]; 476 + } 477 + 463 478 static int cs_etm__init_trace_params(struct cs_etm_trace_params *t_params, 464 479 struct cs_etm_auxtrace *etm, 465 480 int decoders) ··· 493 478 break; 494 479 case __perf_cs_etmv4_magic: 495 480 cs_etm__set_trace_param_etmv4(t_params, etm, i); 481 + break; 482 + case __perf_cs_ete_magic: 483 + cs_etm__set_trace_param_ete(t_params, etm, i); 496 484 break; 497 485 default: 498 486 return -EINVAL;