perf will output additional CoreSight debug information, from the 'perf report --dump' command, when the build option CSTRACE_RAW=1 is added to the usual CORESIGHT=1 at build time.
This additional information consists of raw trace data in the form of CoreSight formatted trace frames. This is intended to be used to investigate possible issues relating to trace data corruption, trace hardware issues or problems with decode.
The CoreSight formatted trace frames are used when multiple ETMs trace into an ETR, and not present when a single ETE traces into the TRBE.
When the build option is used and perf is used to dump an ETE/TRBE generated buffer a segfault will occur in the OpenCSD library.
Patch 1 of this set removes the unnecessary call to print the raw trace frames when not needed, and fixes the segfault where older versions of OpenCSD are in use.
Patch 2 enhances the debug output to associate raw data with individual packets, which means that raw data is now present for ETE and extended for ETM.
OpenCSD is being fixed independently.
Mike Leach (2): perf: tools: cs-etm: Fix print issue for Coresight debug in ETE/TRBE trace perf: tools: cs-etm: Enhance raw Coresight trace debug display
tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
Building perf with CORESIGHT=1 and the optional CSTRACE_RAW=1 enables additional debug printing of raw trace data when using command:- perf report --dump.
This raw trace prints the CoreSight formatted trace frames, which may be used to investigate suspected issues with trace quality / corruption / decode.
These frames are not present in ETE + TRBE trace. This fix removes the unnecessary call to print these frames.
Due to an addtional fault with the OpenCSD library, this call when ETE/TRBE are being decoded will cause a segfault in perf. This fix also prevents that problem for perf using older (<= 1.8.0 version) OpenCSD libraries.
Fixes: 68ffe3902898 ("perf tools: Add decoder mechanic to support dumping trace data")
Reported-by: Leo Yan leo.yan@arm.com Signed-off-by: Mike Leach mike.leach@arm.com --- tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c index 3050fe212666..f7e89693cf16 100644 --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c @@ -739,7 +739,8 @@ cs_etm_decoder__new(int decoders, struct cs_etm_decoder_params *d_params, goto err_free_decoder;
/* init raw frame logging if required */ - cs_etm_decoder__init_raw_frame_logging(d_params, decoder); + if (format == OCSD_TRC_SRC_FRAME_FORMATTED) + cs_etm_decoder__init_raw_frame_logging(d_params, decoder);
for (i = 0; i < decoders; i++) { ret = cs_etm_decoder__create_etm_decoder(d_params,
On Fri, Mar 13, 2026 at 01:21:28PM +0000, Mike Leach wrote:
Building perf with CORESIGHT=1 and the optional CSTRACE_RAW=1 enables additional debug printing of raw trace data when using command:- perf report --dump.
This raw trace prints the CoreSight formatted trace frames, which may be used to investigate suspected issues with trace quality / corruption / decode.
These frames are not present in ETE + TRBE trace. This fix removes the unnecessary call to print these frames.
Due to an addtional fault with the OpenCSD library, this call when ETE/TRBE are being decoded will cause a segfault in perf. This fix also prevents that problem for perf using older (<= 1.8.0 version) OpenCSD libraries.
Thanks for patches!
Fixes: 68ffe3902898 ("perf tools: Add decoder mechanic to support dumping trace data")
Redundant empty line.
Reported-by: Leo Yan leo.yan@arm.com Signed-off-by: Mike Leach mike.leach@arm.com
tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c index 3050fe212666..f7e89693cf16 100644 --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c @@ -739,7 +739,8 @@ cs_etm_decoder__new(int decoders, struct cs_etm_decoder_params *d_params, goto err_free_decoder; /* init raw frame logging if required */
- cs_etm_decoder__init_raw_frame_logging(d_params, decoder);
- if (format == OCSD_TRC_SRC_FRAME_FORMATTED)
cs_etm_decoder__init_raw_frame_logging(d_params, decoder);
Could we improve a bit to add checking in cs_etm_decoder__init_raw_frame_logging(), something like:
cs_etm_decoder__init_raw_frame_logging(struct cs_etm_decoder_params *d_params, struct cs_etm_decoder *decoder) { + /* No formatted trace frames */ + if (!d_params->formatted) + return;
Sorry I should have mentioned this early.
for (i = 0; i < decoders; i++) { ret = cs_etm_decoder__create_etm_decoder(d_params, -- 2.43.0
Hi Leo,
On 3/13/26 14:42, Leo Yan wrote:
On Fri, Mar 13, 2026 at 01:21:28PM +0000, Mike Leach wrote:
Building perf with CORESIGHT=1 and the optional CSTRACE_RAW=1 enables additional debug printing of raw trace data when using command:- perf report --dump.
This raw trace prints the CoreSight formatted trace frames, which may be used to investigate suspected issues with trace quality / corruption / decode.
These frames are not present in ETE + TRBE trace. This fix removes the unnecessary call to print these frames.
Due to an addtional fault with the OpenCSD library, this call when ETE/TRBE are being decoded will cause a segfault in perf. This fix also prevents that problem for perf using older (<= 1.8.0 version) OpenCSD libraries.
Thanks for patches!
Fixes: 68ffe3902898 ("perf tools: Add decoder mechanic to support dumping trace data")
Redundant empty line.
OK
Reported-by: Leo Yan leo.yan@arm.com Signed-off-by: Mike Leach mike.leach@arm.com
tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c index 3050fe212666..f7e89693cf16 100644 --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c @@ -739,7 +739,8 @@ cs_etm_decoder__new(int decoders, struct cs_etm_decoder_params *d_params, goto err_free_decoder; /* init raw frame logging if required */
- cs_etm_decoder__init_raw_frame_logging(d_params, decoder);
- if (format == OCSD_TRC_SRC_FRAME_FORMATTED)
cs_etm_decoder__init_raw_frame_logging(d_params, decoder);Could we improve a bit to add checking in cs_etm_decoder__init_raw_frame_logging(), something like:
cs_etm_decoder__init_raw_frame_logging(struct cs_etm_decoder_params *d_params, struct cs_etm_decoder *decoder) {
/* No formatted trace frames */if (!d_params->formatted)return;Sorry I should have mentioned this early.
Looking at cs_etm_decoder__init_raw_frame_logging(), this function is called once, after cs_etm_decoder__init_def_logger_printing(), and unnecessarily repeats a bunch of init calls that are done in that function. The one call needed to set up the extra logging could be folded into cs_etm_decoder__init_def_logger_printing() with the cond compile and d_params checks, removing init_raw_frame_logging() completely
I'll spin up a v2 with this simplification.
Regards
Mike
for (i = 0; i < decoders; i++) { ret = cs_etm_decoder__create_etm_decoder(d_params, -- 2.43.0
When compiling perf with CORESIGHT=1, an additional build option may be used: CSTRACE_RAW=1, which will cause the CoreSight formatted trace frames to be printed out during a perf --dump command. This is useful when investigating issues with trace generation, decode or possible data corruption.
e.g. for ETMv4 trace source into a formatted ETR sink a dump -
. ... CoreSight ETMV4I Trace data: size 0x28c150 bytes Idx:0; ID:14; I_ASYNC : Alignment Synchronisation. Idx:12; ID:14; I_TRACE_INFO : Trace Info.; INFO=0x0 { CC.0 }; Decoder Sync point TINFO Idx:17; ID:14; I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0x0000000000000000;
becomes with CSTRACE_RAW=1:
. ... CoreSight ETMV4I Trace data: size 0x28c150 bytes Frame Data; Index 0; ID_DATA[0x14]; 00 00 00 00 00 00 00 00 00 00 00 80 01 01 Idx:0; ID:14; I_ASYNC : Alignment Synchronisation. Frame Data; Index 16; ID_DATA[0x14]; 00 9d 00 00 00 00 00 00 00 00 04 85 57 08 f2 Idx:12; ID:14; I_TRACE_INFO : Trace Info.; INFO=0x0 { CC.0 }; Decoder Sync point TINFO Idx:17; ID:14; I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0x0000000000000000;
CSTRACE_RAW=1 has no effect on ETE + TRBE trace as there is no trace formatting in the TRBE buffer.
This patch enhances the output so that for each packet the individual bytes associated with the packet are printed.
Thus for ETMv4 this now becomes:
. ... CoreSight ETMV4I Trace data: size 0x28c150 bytes Frame Data; Index 0; ID_DATA[0x14]; 00 00 00 00 00 00 00 00 00 00 00 80 01 01 Idx:0; ID:14;[0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80]; I_ASYNC : Alignment Synchronisation. Frame Data; Index 16; ID_DATA[0x14]; 00 9d 00 00 00 00 00 00 00 00 04 85 57 08 f2 Idx:12; ID:14; [0x01 0x01 0x00 ]; I_TRACE_INFO : Trace Info.; INFO=0x0 { CC.0 }; Decoder Sync point TINFO Idx:17; ID:14; [0x9d 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 ]; I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0x0000000000000000;
ETE trace output changes from:
Idx:0; ID:14; I_ASYNC : Alignment Synchronisation. Idx:12; ID:14; I_TRACE_INFO : Trace Info.; INFO=0x0 { CC.0, TSTATE.0 }; Decoder Sync point TINFO Idx:15; ID:14; I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0xFFFF80007CF7F56C; becoming:
Idx:0; ID:14;[0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80]; I_ASYNC : Alignment Synchronisation. Idx:12; ID:14; [0x01 0x01 0x00 ]; I_TRACE_INFO : Trace Info.; INFO=0x0 { CC.0, TSTATE.0 }; Decoder Sync point TINFO Idx:15; ID:14; [0x9d 0x5b 0x7a 0xf7 0x7c 0x00 0x80 0xff 0xff ]; I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0xFFFF80007CF7F56C;
Signed-off-by: Mike Leach mike.leach@arm.com --- tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c index f7e89693cf16..229b28538757 100644 --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c @@ -22,12 +22,15 @@ /* use raw logging */ #ifdef CS_DEBUG_RAW #define CS_LOG_RAW_FRAMES +#define CS_PKT_MON 1 #ifdef CS_RAW_PACKED #define CS_RAW_DEBUG_FLAGS (OCSD_DFRMTR_UNPACKED_RAW_OUT | \ OCSD_DFRMTR_PACKED_RAW_OUT) #else #define CS_RAW_DEBUG_FLAGS (OCSD_DFRMTR_UNPACKED_RAW_OUT) #endif +#else +#define CS_PKT_MON 0 #endif
/* @@ -686,7 +689,7 @@ cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params, trace_config, &csid)) return -1;
- if (ocsd_dt_set_pkt_protocol_printer(decoder->dcd_tree, csid, 0)) + if (ocsd_dt_set_pkt_protocol_printer(decoder->dcd_tree, csid, CS_PKT_MON)) return -1;
return 0;
On Fri, Mar 13, 2026 at 01:21:29PM +0000, Coresight ML wrote:
[...]
ETE trace output changes from:
Idx:0; ID:14; I_ASYNC : Alignment Synchronisation. Idx:12; ID:14; I_TRACE_INFO : Trace Info.; INFO=0x0 { CC.0, TSTATE.0 }; Decoder Sync point TINFO Idx:15; ID:14; I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0xFFFF80007CF7F56C; becoming:
Idx:0; ID:14;[0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80]; I_ASYNC : Alignment Synchronisation. Idx:12; ID:14; [0x01 0x01 0x00 ]; I_TRACE_INFO : Trace Info.; INFO=0x0 { CC.0, TSTATE.0 }; Decoder Sync point TINFO Idx:15; ID:14; [0x9d 0x5b 0x7a 0xf7 0x7c 0x00 0x80 0xff 0xff ]; I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0xFFFF80007CF7F56C;
Signed-off-by: Mike Leach mike.leach@arm.com
LGTM and I tested it:
Tested-by: Leo Yan leo.yan@arm.com
On Fri, Mar 13, 2026 at 02:45:18PM +0000, Leo Yan wrote:
LGTM and I tested it:
Tested-by: Leo Yan leo.yan@arm.com
I think this is perf-tools-next material, Namhyung, please pick this one.
Acked-by: Arnaldo Carvalho de Melo acme@redhat.com
Ah, BTW, this one I picked up by perusing the https://sashiko.dev list of reviewed patches that were CCed to linux-perf-users:
https://sashiko.dev/#/?list=org.kernel.vger.linux-perf-users
Thanks,
- Arnaldo