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 2f311189c6e875d791c4f2cd53c5c9c0861dfb79..fed4741f372ee4782620f084688fc78d5d149b69 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 9b970e7bf1e21965c82cb36202a92eb719c8a553..f75ed3a8a0506540916617abd94b982fe1310bfc 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