Re: [PATCH] perf scripts python arm-cs-trace-disasm.py: Skip disasm if address continuity is broken

From: Ganapatrao Kulkarni
Date: Mon Sep 02 2024 - 02:12:54 EST




On 30-08-2024 03:28 pm, James Clark wrote:


On 23/08/2024 10:57 am, Ganapatrao Kulkarni wrote:

Hi James/Mike,

On 23-08-2024 02:33 pm, James Clark wrote:


On 19/08/2024 11:59 am, Mike Leach wrote:
Hi,

A new branch of OpenCSD is available - ocsd-consistency-checks-1.5.4-rc1

Testing I managed to do confirms the N atom on unconditional branches
appear to work. I do not have a test case for the range
discontinuities.

The checks are enabled using operation flags on decoder creation. See
the docs for details.

Mike


Hi Mike,

I tested the new OpenCSD and I don't see the error anymore in the
disassembly script. I'm not sure if we need to go any further and add
the backwards check, it looks like just a later symptom and the checks
that you've added already prevent it.

If you release a new version I can send the perf patch. I was going to
use these flags if that looks right to you? As far as I know that's the
set that can be always on and won't fail on bad hardware?

I also assumed that ETM4_OPFLG_PKTDEC_AA64_OPCODE_CHK can be given even
for etmv3 and it's just a nop?

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 e917985bbbe6..90967fd807e6 100644
--- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
+++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
@@ -685,9 +685,14 @@ cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
                 return 0;

         if (d_params->operation == CS_ETM_OPERATION_DECODE) {
+               int decode_flags = OCSD_CREATE_FLG_FULL_DECODER;
+#ifdef OCSD_OPFLG_N_UNCOND_DIR_BR_CHK
+               decode_flags |= OCSD_OPFLG_N_UNCOND_DIR_BR_CHK | OCSD_OPFLG_CHK_RANGE_CONTINUE |
+                               ETM4_OPFLG_PKTDEC_AA64_OPCODE_CHK;
+#endif
                 if (ocsd_dt_create_decoder(decoder->dcd_tree,
                                            decoder->decoder_name,
-                                          OCSD_CREATE_FLG_FULL_DECODER,
+                                          decode_flags,
                                            trace_config, &csid))
                         return -1;


I tried Mike's branch with above James's patch and still the segfault is happening to us.


Looks like the Perf bug is only on the timestamped decode path, you can force timeless as a workaround. Timestamps aren't used by the disassembly script anyway:

  --itrace=Zb

Full command:

  perf script -i ./kcore -s python:tools/perf/scripts/python/arm-cs-\
     trace-disasm.py --itrace=Zb -- -k ./kcore/kcore_dir/kcore


Thanks James, I could run without any issue with "--itrace=Zb"

You can also disable timestamps when recording then you don't need the itrace option. This will save you a lot of data anyway.

But I'm still working on the proper fix.
Thanks.

--
Thanks,
Ganapat/GK