perf scripts python: Support Arm CoreSight trace data disassembly
authorLeo Yan <leo.yan@linaro.org>
Sat, 21 May 2022 13:04:46 +0000 (21:04 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 27 May 2022 16:22:14 +0000 (13:22 -0300)
commit12fdd6c009da0d029ae54cff67242be02ea42a7a
tree04f5f42fa8d76ace7313550a7da02dd69d61553c
parentc4f462235c0f61a0eff2ca0f965a3fdceb80347d
perf scripts python: Support Arm CoreSight trace data disassembly

This commit adds python script to parse CoreSight tracing event and
print out source line and disassembly, it generates readable program
execution flow for easier humans inspecting.

The script receives CoreSight tracing packet with below format:

                +------------+------------+------------+
  packet(n):    |    addr    |    ip      |    cpu     |
                +------------+------------+------------+
  packet(n+1):  |    addr    |    ip      |    cpu     |
                +------------+------------+------------+

packet::addr presents the start address of the coming branch sample, and
packet::ip is the last address of the branch smple.  Therefore, a code
section between branches starts from packet(n)::addr and it stops at
packet(n+1)::ip.  As results we combines the two continuous packets to
generate the address range for instructions:

  [ sample(n)::addr .. sample(n+1)::ip ]

The script supports both objdump or llvm-objdump for disassembly with
specifying option '-d'.  If doesn't specify option '-d', the script
simply outputs source lines and symbols.

Below shows usages with llvm-objdump or objdump to output disassembly.

  # perf script -s scripts/python/arm-cs-trace-disasm.py -- -d llvm-objdump-11 -k ./vmlinux
  ARM CoreSight Trace Data Assembler Dump
   ffff800008eb3198 <etm4_enable_hw>:
   ffff800008eb3310: c0 38 00 35   cbnz w0, 0xffff800008eb3a28 <etm4_enable_hw+0x890>
   ffff800008eb3314: 9f 3f 03 d5   dsb sy
   ffff800008eb3318: df 3f 03 d5   isb
   ffff800008eb331c: f5 5b 42 a9   ldp x21, x22, [sp, #32]
   ffff800008eb3320: fb 73 45 a9   ldp x27, x28, [sp, #80]
   ffff800008eb3324: e0 82 40 39   ldrb w0, [x23, #32]
   ffff800008eb3328: 60 00 00 34   cbz w0, 0xffff800008eb3334 <etm4_enable_hw+0x19c>
   ffff800008eb332c: e0 03 19 aa   mov x0, x25
   ffff800008eb3330: 8c fe ff 97   bl 0xffff800008eb2d60 <etm4_cs_lock.isra.0.part.0>
              main  6728/6728  [0004]         0.000000000  etm4_enable_hw+0x198                    [kernel.kallsyms]
   ffff800008eb2d60 <etm4_cs_lock.isra.0.part.0>:
   ffff800008eb2d60: 1f 20 03 d5   nop
   ffff800008eb2d64: 1f 20 03 d5   nop
   ffff800008eb2d68: 3f 23 03 d5   hint #25
   ffff800008eb2d6c: 00 00 40 f9   ldr x0, [x0]
   ffff800008eb2d70: 9f 3f 03 d5   dsb sy
   ffff800008eb2d74: 00 c0 3e 91   add x0, x0, #4016
   ffff800008eb2d78: 1f 00 00 b9   str wzr, [x0]
   ffff800008eb2d7c: bf 23 03 d5   hint #29
   ffff800008eb2d80: c0 03 5f d6   ret
              main  6728/6728  [0004]         0.000000000  etm4_cs_lock.isra.0.part.0+0x20

  # perf script -s scripts/python/arm-cs-trace-disasm.py -- -d objdump -k ./vmlinux
  ARM CoreSight Trace Data Assembler Dump
   ffff800008eb3310 <etm4_enable_hw+0x178>:
   ffff800008eb3310: 350038c0  cbnz w0, ffff800008eb3a28 <etm4_enable_hw+0x890>
   ffff800008eb3314: d5033f9f  dsb sy
   ffff800008eb3318: d5033fdf  isb
   ffff800008eb331c: a9425bf5  ldp x21, x22, [sp, #32]
   ffff800008eb3320: a94573fb  ldp x27, x28, [sp, #80]
   ffff800008eb3324: 394082e0  ldrb w0, [x23, #32]
   ffff800008eb3328: 34000060  cbz w0, ffff800008eb3334 <etm4_enable_hw+0x19c>
   ffff800008eb332c: aa1903e0  mov x0, x25
   ffff800008eb3330: 97fffe8c  bl ffff800008eb2d60 <etm4_cs_lock.isra.0.part.0>
              main  6728/6728  [0004]         0.000000000  etm4_enable_hw+0x198                    [kernel.kallsyms]
   ffff800008eb2d60 <etm4_cs_lock.isra.0.part.0>:
   ffff800008eb2d60: d503201f  nop
   ffff800008eb2d64: d503201f  nop
   ffff800008eb2d68: d503233f  paciasp
   ffff800008eb2d6c: f9400000  ldr x0, [x0]
   ffff800008eb2d70: d5033f9f  dsb sy
   ffff800008eb2d74: 913ec000  add x0, x0, #0xfb0
   ffff800008eb2d78: b900001f  str wzr, [x0]
   ffff800008eb2d7c: d50323bf  autiasp
   ffff800008eb2d80: d65f03c0  ret
              main  6728/6728  [0004]         0.000000000  etm4_cs_lock.isra.0.part.0+0x20

Signed-off-by: Leo Yan <leo.yan@linaro.org>
Co-authored-by: Al Grant <al.grant@arm.com>
Co-authored-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Co-authored-by: Tor Jeremiassen <tor@ti.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Eelco Chaudron <echaudro@redhat.com>
Cc: German Gomez <german.gomez@arm.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephen Brennan <stephen.s.brennan@oracle.com>
Cc: Tanmay Jagdale <tanmay@marvell.com>
Cc: coresight@lists.linaro.org
Cc: zengshun . wu <zengshun.wu@outlook.com>
Link: https://lore.kernel.org/r/20220521130446.4163597-3-leo.yan@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/scripts/python/arm-cs-trace-disasm.py [new file with mode: 0755]