From: "André Przywara" <andre.przywara@arm.com>
To: Leo Yan <leo.yan@linaro.org>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@redhat.com>, Namhyung Kim <namhyung@kernel.org>,
Wei Li <liwei391@huawei.com>, James Clark <james.clark@arm.com>,
Al Grant <Al.Grant@arm.com>, Dave Martin <Dave.Martin@arm.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v4 09/21] perf arm-spe: Refactor address packet handling
Date: Tue, 27 Oct 2020 14:53:59 +0000 [thread overview]
Message-ID: <7f495290-e2b2-c74e-8337-05d7be348aad@arm.com> (raw)
In-Reply-To: <20201027030917.15404-10-leo.yan@linaro.org>
On 27/10/2020 03:09, Leo Yan wrote:
> This patch is to refactor address packet handling, it defines macros for
> address packet's header and payload, these macros are used by decoder
> and the dump flow.
>
> Signed-off-by: Leo Yan <leo.yan@linaro.org>
Thanks for the changes!
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
Cheers,
Andre
> ---
> .../util/arm-spe-decoder/arm-spe-decoder.c | 29 ++++++++-------
> .../arm-spe-decoder/arm-spe-pkt-decoder.c | 26 +++++++-------
> .../arm-spe-decoder/arm-spe-pkt-decoder.h | 35 ++++++++++++-------
> 3 files changed, 48 insertions(+), 42 deletions(-)
>
> diff --git a/tools/perf/util/arm-spe-decoder/arm-spe-decoder.c b/tools/perf/util/arm-spe-decoder/arm-spe-decoder.c
> index cc18a1e8c212..776b3e6628bb 100644
> --- a/tools/perf/util/arm-spe-decoder/arm-spe-decoder.c
> +++ b/tools/perf/util/arm-spe-decoder/arm-spe-decoder.c
> @@ -24,36 +24,35 @@
>
> static u64 arm_spe_calc_ip(int index, u64 payload)
> {
> - u8 *addr = (u8 *)&payload;
> - int ns, el;
> + u64 ns, el;
>
> /* Instruction virtual address or Branch target address */
> if (index == SPE_ADDR_PKT_HDR_INDEX_INS ||
> index == SPE_ADDR_PKT_HDR_INDEX_BRANCH) {
> - ns = addr[7] & SPE_ADDR_PKT_NS;
> - el = (addr[7] & SPE_ADDR_PKT_EL_MASK) >> SPE_ADDR_PKT_EL_OFFSET;
> + ns = SPE_ADDR_PKT_GET_NS(payload);
> + el = SPE_ADDR_PKT_GET_EL(payload);
> +
> + /* Clean highest byte */
> + payload = SPE_ADDR_PKT_ADDR_GET_BYTES_0_6(payload);
>
> /* Fill highest byte for EL1 or EL2 (VHE) mode */
> if (ns && (el == SPE_ADDR_PKT_EL1 || el == SPE_ADDR_PKT_EL2))
> - addr[7] = 0xff;
> - /* Clean highest byte for other cases */
> - else
> - addr[7] = 0x0;
> + payload |= 0xffULL << SPE_ADDR_PKT_ADDR_BYTE7_SHIFT;
>
> /* Data access virtual address */
> } else if (index == SPE_ADDR_PKT_HDR_INDEX_DATA_VIRT) {
>
> + /* Clean tags */
> + payload = SPE_ADDR_PKT_ADDR_GET_BYTES_0_6(payload);
> +
> /* Fill highest byte if bits [48..55] is 0xff */
> - if (addr[6] == 0xff)
> - addr[7] = 0xff;
> - /* Otherwise, cleanup tags */
> - else
> - addr[7] = 0x0;
> + if (SPE_ADDR_PKT_ADDR_GET_BYTE_6(payload) == 0xffULL)
> + payload |= 0xffULL << SPE_ADDR_PKT_ADDR_BYTE7_SHIFT;
>
> /* Data access physical address */
> } else if (index == SPE_ADDR_PKT_HDR_INDEX_DATA_PHYS) {
> - /* Cleanup byte 7 */
> - addr[7] = 0x0;
> + /* Clean highest byte */
> + payload = SPE_ADDR_PKT_ADDR_GET_BYTES_0_6(payload);
> } else {
> pr_err("unsupported address packet index: 0x%x\n", index);
> }
> diff --git a/tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.c b/tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.c
> index e372e85e1c14..1218a731638f 100644
> --- a/tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.c
> +++ b/tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.c
> @@ -13,9 +13,6 @@
>
> #include "arm-spe-pkt-decoder.h"
>
> -#define NS_FLAG BIT(63)
> -#define EL_FLAG (BIT(62) | BIT(61))
> -
> #if __BYTE_ORDER == __BIG_ENDIAN
> #define le16_to_cpu bswap_16
> #define le32_to_cpu bswap_32
> @@ -167,10 +164,11 @@ static int arm_spe_get_addr(const unsigned char *buf, size_t len,
> const unsigned char ext_hdr, struct arm_spe_pkt *packet)
> {
> packet->type = ARM_SPE_ADDRESS;
> +
> if (ext_hdr)
> - packet->index = ((buf[0] & 0x3) << 3) | (buf[1] & 0x7);
> + packet->index = SPE_HDR_EXTENDED_INDEX(buf[0], buf[1]);
> else
> - packet->index = buf[0] & 0x7;
> + packet->index = SPE_HDR_SHORT_INDEX(buf[0]);
>
> return arm_spe_get_payload(buf, len, ext_hdr, packet);
> }
> @@ -274,20 +272,20 @@ static int arm_spe_pkt_desc_addr(const struct arm_spe_pkt *packet,
> u64 payload = packet->payload;
>
> switch (idx) {
> - case 0:
> - case 1:
> - ns = !!(packet->payload & NS_FLAG);
> - el = (packet->payload & EL_FLAG) >> 61;
> - payload &= ~(0xffULL << 56);
> + case SPE_ADDR_PKT_HDR_INDEX_INS:
> + case SPE_ADDR_PKT_HDR_INDEX_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);
> return arm_spe_pkt_snprintf(&buf, &buf_len,
> "%s 0x%llx el%d ns=%d",
> (idx == 1) ? "TGT" : "PC", payload, el, ns);
> - case 2:
> + case SPE_ADDR_PKT_HDR_INDEX_DATA_VIRT:
> return arm_spe_pkt_snprintf(&buf, &buf_len,
> "VA 0x%llx", payload);
> - case 3:
> - ns = !!(packet->payload & NS_FLAG);
> - payload &= ~(0xffULL << 56);
> + case SPE_ADDR_PKT_HDR_INDEX_DATA_PHYS:
> + ns = !!SPE_ADDR_PKT_GET_NS(payload);
> + payload = SPE_ADDR_PKT_ADDR_GET_BYTES_0_6(payload);
> return arm_spe_pkt_snprintf(&buf, &buf_len,
> "PA 0x%llx ns=%d", payload, ns);
> default:
> diff --git a/tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.h b/tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.h
> index 129f43405eb1..f97d6840be3a 100644
> --- a/tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.h
> +++ b/tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.h
> @@ -56,19 +56,28 @@ struct arm_spe_pkt {
> #define SPE_HEADER0_COUNTER 0x98
> #define SPE_HEADER1_ALIGNMENT 0x0
>
> -#define SPE_ADDR_PKT_HDR_INDEX_INS (0x0)
> -#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_NS BIT(7)
> -#define SPE_ADDR_PKT_CH BIT(6)
> -#define SPE_ADDR_PKT_EL_OFFSET (5)
> -#define SPE_ADDR_PKT_EL_MASK (0x3 << SPE_ADDR_PKT_EL_OFFSET)
> -#define SPE_ADDR_PKT_EL0 (0)
> -#define SPE_ADDR_PKT_EL1 (1)
> -#define SPE_ADDR_PKT_EL2 (2)
> -#define SPE_ADDR_PKT_EL3 (3)
> +#define SPE_HDR_SHORT_INDEX(h) ((h) & GENMASK_ULL(2, 0))
> +#define SPE_HDR_EXTENDED_INDEX(h0, h1) (((h0) & GENMASK_ULL(1, 0)) << 3 | \
> + SPE_HDR_SHORT_INDEX(h1))
> +
> +/* Address packet header */
> +#define SPE_ADDR_PKT_HDR_INDEX_INS 0x0
> +#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
> +
> +/* Address packet payload */
> +#define SPE_ADDR_PKT_ADDR_BYTE7_SHIFT 56
> +#define SPE_ADDR_PKT_ADDR_GET_BYTES_0_6(v) ((v) & GENMASK_ULL(55, 0))
> +#define SPE_ADDR_PKT_ADDR_GET_BYTE_6(v) (((v) & GENMASK_ULL(55, 48)) >> 48)
> +
> +#define SPE_ADDR_PKT_GET_NS(v) (((v) & BIT_ULL(63)) >> 63)
> +#define SPE_ADDR_PKT_GET_EL(v) (((v) & GENMASK_ULL(62, 61)) >> 61)
> +
> +#define SPE_ADDR_PKT_EL0 0
> +#define SPE_ADDR_PKT_EL1 1
> +#define SPE_ADDR_PKT_EL2 2
> +#define SPE_ADDR_PKT_EL3 3
>
> const char *arm_spe_pkt_name(enum arm_spe_pkt_type);
>
>
next prev parent reply other threads:[~2020-10-27 17:21 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-27 3:08 [PATCH v4 00/21] perf arm-spe: Refactor decoding & dumping flow Leo Yan
2020-10-27 3:08 ` [PATCH v4 01/21] perf arm-spe: Include bitops.h for BIT() macro Leo Yan
2020-10-27 3:08 ` [PATCH v4 02/21] perf arm-spe: Fix a typo in comment Leo Yan
2020-10-27 3:08 ` [PATCH v4 03/21] perf arm-spe: Refactor payload size calculation Leo Yan
2020-10-27 14:53 ` André Przywara
2020-10-27 3:09 ` [PATCH v4 04/21] perf arm-spe: Refactor arm_spe_get_events() Leo Yan
2020-10-27 3:09 ` [PATCH v4 05/21] perf arm-spe: Fix packet length handling Leo Yan
2020-10-27 3:09 ` [PATCH v4 06/21] perf arm-spe: Refactor printing string to buffer Leo Yan
2020-10-27 14:31 ` Dave Martin
2020-10-27 14:50 ` Leo Yan
2020-10-27 3:09 ` [PATCH v4 07/21] perf arm-spe: Refactor packet header parsing Leo Yan
2020-10-27 3:09 ` [PATCH v4 08/21] perf arm-spe: Add new function arm_spe_pkt_desc_addr() Leo Yan
2020-10-27 3:09 ` [PATCH v4 09/21] perf arm-spe: Refactor address packet handling Leo Yan
2020-10-27 14:53 ` André Przywara [this message]
2020-10-27 3:09 ` [PATCH v4 10/21] perf arm_spe: Fixup top byte for data virtual address Leo Yan
2020-10-27 15:01 ` André Przywara
2020-10-28 6:49 ` Leo Yan
2020-10-27 3:09 ` [PATCH v4 11/21] perf arm-spe: Refactor context packet handling Leo Yan
2020-10-27 3:09 ` [PATCH v4 12/21] perf arm-spe: Add new function arm_spe_pkt_desc_counter() Leo Yan
2020-10-27 3:09 ` [PATCH v4 13/21] perf arm-spe: Refactor counter packet handling Leo Yan
2020-10-27 14:54 ` André Przywara
2020-10-27 3:09 ` [PATCH v4 14/21] perf arm-spe: Add new function arm_spe_pkt_desc_event() Leo Yan
2020-10-27 3:09 ` [PATCH v4 15/21] perf arm-spe: Refactor event type handling Leo Yan
2020-10-27 3:09 ` [PATCH v4 16/21] perf arm-spe: Remove size condition checking for events Leo Yan
2020-10-27 3:09 ` [PATCH v4 17/21] perf arm-spe: Add new function arm_spe_pkt_desc_op_type() Leo Yan
2020-10-27 3:09 ` [PATCH v4 18/21] perf arm-spe: Refactor operation packet handling Leo Yan
2020-10-27 14:54 ` André Przywara
2020-10-27 3:09 ` [PATCH v4 19/21] perf arm-spe: Add more sub classes for operation packet Leo Yan
2020-10-27 3:09 ` [PATCH v4 20/21] perf arm_spe: Decode memory tagging properties Leo Yan
2020-10-27 3:09 ` [PATCH v4 21/21] perf arm-spe: Add support for ARMv8.3-SPE Leo Yan
2020-10-27 14:54 ` André Przywara
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7f495290-e2b2-c74e-8337-05d7be348aad@arm.com \
--to=andre.przywara@arm.com \
--cc=Al.Grant@arm.com \
--cc=Dave.Martin@arm.com \
--cc=acme@kernel.org \
--cc=alexander.shishkin@linux.intel.com \
--cc=james.clark@arm.com \
--cc=jolsa@redhat.com \
--cc=leo.yan@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=liwei391@huawei.com \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox