perf arm-spe: Add raw decoding for SPEv1.2 previous branch address
authorRob Herring <robh@kernel.org>
Fri, 3 Feb 2023 16:24:01 +0000 (10:24 -0600)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 3 Feb 2023 20:12:25 +0000 (17:12 -0300)
Arm SPEv1.2 adds a new optional address packet type: previous branch
target. The recorded address is the target virtual address of the most
recently taken branch in program order.

Add support for decoding the address packet in raw dumps.

Reviewed-by: Leo Yan <leo.yan@linaro.org>
Signed-off-by: Rob Herring <robh@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.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>
Link: https://lore.kernel.org/r/20230203162401.132931-1-robh@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.c
tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.h

index 2f31118..fed4741 100644 (file)
@@ -422,16 +422,18 @@ static int arm_spe_pkt_desc_addr(const struct arm_spe_pkt *packet,
        int ch, pat;
        u64 payload = packet->payload;
        int err = 0;
+       static const char *idx_name[] = {"PC", "TGT", "VA", "PA", "PBT"};
 
        switch (idx) {
        case SPE_ADDR_PKT_HDR_INDEX_INS:
        case SPE_ADDR_PKT_HDR_INDEX_BRANCH:
+       case SPE_ADDR_PKT_HDR_INDEX_PREV_BRANCH:
                ns = !!SPE_ADDR_PKT_GET_NS(payload);
                el = SPE_ADDR_PKT_GET_EL(payload);
                payload = SPE_ADDR_PKT_ADDR_GET_BYTES_0_6(payload);
                arm_spe_pkt_out_string(&err, &buf, &buf_len,
                                "%s 0x%llx el%d ns=%d",
-                               (idx == 1) ? "TGT" : "PC", payload, el, ns);
+                               idx_name[idx], payload, el, ns);
                break;
        case SPE_ADDR_PKT_HDR_INDEX_DATA_VIRT:
                arm_spe_pkt_out_string(&err, &buf, &buf_len,
index 9b970e7..f75ed3a 100644 (file)
@@ -65,6 +65,7 @@ struct arm_spe_pkt {
 #define SPE_ADDR_PKT_HDR_INDEX_BRANCH          0x1
 #define SPE_ADDR_PKT_HDR_INDEX_DATA_VIRT       0x2
 #define SPE_ADDR_PKT_HDR_INDEX_DATA_PHYS       0x3
+#define SPE_ADDR_PKT_HDR_INDEX_PREV_BRANCH     0x4
 
 /* Address packet payload */
 #define SPE_ADDR_PKT_ADDR_BYTE7_SHIFT          56