Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp2366378pxa; Mon, 17 Aug 2020 07:58:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxcxH/i9v4FKTekBZ2Zn84HPNnP8zzVpr1KwFNWsh86ITp0KdXQF8AW55wQ0RtXpeUE7bD9 X-Received: by 2002:a17:906:2451:: with SMTP id a17mr15104314ejb.274.1597676295192; Mon, 17 Aug 2020 07:58:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1597676295; cv=none; d=google.com; s=arc-20160816; b=L3FrBSXCh54EvT2Pw2J6909nHs8lNM664ZNXXU2tuvmKSBEgkrM5okJEc3RjI1GAUw WE3qHLOmbBDl9BXB9oSgx87UNbis9cY0fNqbxSOzys6UVm1d27N3JzaUEQxE9CignrgL FfVGgXLEd3tsdNAuiIk0RIXS4EuIHaXEbYmxk9825CtQOPmPbahi51rUzBbPcF6sYoIS OnXEWDl/SFMlqHiS26Ra66S4gTtWmNHdHcH7EONMKT8nZEsMP74iDaMs0hbxVSH6orok 8kpnV2CJ8wSuc7E+U5PN8VTmwSRr4bdt8sYVYNNsLvinHANGLlRP0rjVbkkKplGTMAbB oPgg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=+GmZLqRqCBxGNiL/K4/3XwerixrPqOChYFgw/4bX5hg=; b=ZA/9dJvakR1ukEoy+iB4i2j81tJnhhJD5VPEKlotH3Cabya7W4REhOqUPi6vo97xlG /If+SGc1dbSKfH6SpfaXe1Zo/36GYUXoWUX8Qn74lArekOYLkWp6X9ix1TLUAwccsXep fnRCK6LeQLD+Z07CfJ+1MkbNw89CgZ8T5uxb6b3TOjMQw+4wpu5upAytO84fA0kkDRIq /tJ+Q5UIltWwclF9r2Tldbs6umZy1f3jUCuEVgytidgVLSLvAi0ZWQmrbz1jik9L8qJ4 guYalYHE4WebhC8k5N0C+m+Y7Yy7Jehbrmkm20YWuRt96MMBZTw1taMwiUXKZLNBgAJF t+Ew== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=OxJ62YjE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d16si11311897eds.521.2020.08.17.07.57.51; Mon, 17 Aug 2020 07:58:15 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=OxJ62YjE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729111AbgHQOyo (ORCPT + 99 others); Mon, 17 Aug 2020 10:54:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56570 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726630AbgHQOyV (ORCPT ); Mon, 17 Aug 2020 10:54:21 -0400 Received: from mail-wm1-x342.google.com (mail-wm1-x342.google.com [IPv6:2a00:1450:4864:20::342]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C8255C061389 for ; Mon, 17 Aug 2020 07:54:20 -0700 (PDT) Received: by mail-wm1-x342.google.com with SMTP id k20so14136888wmi.5 for ; Mon, 17 Aug 2020 07:54:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+GmZLqRqCBxGNiL/K4/3XwerixrPqOChYFgw/4bX5hg=; b=OxJ62YjETf3c/7dCsx4kmzMZW10Wcxi01b3hx7eFT4eYO1gos9IzhZfs3nqc05GtHC kLrLNMpkEtunvSSRWmmRa6OqoFdIanFE2mcxaFxwfVs++/csiEGoJuX6Wtzq3pUxozqm /rn4nvIz5drjgcrRBqFQ1m86kSuGM+VJku9Edzqxnp7LNJ2KVH5GjOwTCDMAnxwnNOj8 fqD1PfBaDZkfmex1K/sDlbyhdNFj5bLo6h991PRCbnLXU9f6zxbtJXzwRq32R3Z9dLnZ LsriysvZGlBwKJ8cPWSYQPji9HCabiOhDrC5hqWOcUJsmRpJiuR3svT1xHxSoDHRub9V JGtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=+GmZLqRqCBxGNiL/K4/3XwerixrPqOChYFgw/4bX5hg=; b=HDPP+adrlIdyVwK0vsR7+hWWpVKRgx7rUqKA8FDo+wdifRxq6hTBKGUunj0IdCNjJH FoVdGqOEQYNO95cql84UkM4ifJDaJV9zv+ozSAf2w8CfvKF+xUEGBLSUiwvT1qPPZLYh X+Zqy/pEjGcjTp3PB+MkdpuI0FqS3/t6+8qU833xbM/D879LIQQ65YjoXS0zqYr73Q8N wlKD16iWwRdSEteFlT4/cqS2VWmJm+X14SelhsAUxc/M0D5AZR1nPrTfv5E3hu2zUYGq 8VQUyNgaShgX7QTWkRwMWhDtREU5f/zES7Ni3Cgp1sMOasaFsX1OlQZwJFFz2uAW62Po KVow== X-Gm-Message-State: AOAM5331BG2vZIF6Rv2nsbiSEhYjO2IdayUHq+boOMcv0lZY0doemsYX zijLYHudw+FTHfyhjGPCrVhUMg== X-Received: by 2002:a1c:286:: with SMTP id 128mr14187961wmc.37.1597676059473; Mon, 17 Aug 2020 07:54:19 -0700 (PDT) Received: from hackbox2.linaro.org ([81.128.185.34]) by smtp.gmail.com with ESMTPSA id r16sm35005678wrr.13.2020.08.17.07.54.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2020 07:54:18 -0700 (PDT) From: Leo Yan To: Arnaldo Carvalho de Melo , James Clark , Will Deacon , Al Grant , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Wei Li , linux-kernel@vger.kernel.org, Mathieu Poirier , Mike Leach Cc: Leo Yan Subject: [PATCH RESEND v1 05/13] perf arm-spe: Refactor packet header parsing Date: Mon, 17 Aug 2020 15:53:40 +0100 Message-Id: <20200817145348.14461-6-leo.yan@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200817145348.14461-1-leo.yan@linaro.org> References: <20200817145348.14461-1-leo.yan@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The packet header parsing uses the hard coded values and it uses nested if-else statements. To improve the readability, this patch refactors the macros for packet header format so it removes the hard coded values. Furthermore, based on the new mask macros it reduces the nested if-else statements and changes to use the flat conditions checking, this is directive and can easily map to the descriptions in ARMv8-a architecture reference manual (ARM DDI 0487E.a), chapter 'D10.1.5 Statistical Profiling Extension protocol packet headers'. Signed-off-by: Leo Yan --- .../arm-spe-decoder/arm-spe-pkt-decoder.c | 92 +++++++++---------- .../arm-spe-decoder/arm-spe-pkt-decoder.h | 17 ++++ 2 files changed, 58 insertions(+), 51 deletions(-) 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 4f0aeb62e97b..5f4f900a9980 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 @@ -15,28 +15,6 @@ #define NS_FLAG BIT(63) #define EL_FLAG (BIT(62) | BIT(61)) -#define SPE_HEADER0_PAD 0x0 -#define SPE_HEADER0_END 0x1 -#define SPE_HEADER0_ADDRESS 0x30 /* address packet (short) */ -#define SPE_HEADER0_ADDRESS_MASK 0x38 -#define SPE_HEADER0_COUNTER 0x18 /* counter packet (short) */ -#define SPE_HEADER0_COUNTER_MASK 0x38 -#define SPE_HEADER0_TIMESTAMP 0x71 -#define SPE_HEADER0_TIMESTAMP 0x71 -#define SPE_HEADER0_EVENTS 0x2 -#define SPE_HEADER0_EVENTS_MASK 0xf -#define SPE_HEADER0_SOURCE 0x3 -#define SPE_HEADER0_SOURCE_MASK 0xf -#define SPE_HEADER0_CONTEXT 0x24 -#define SPE_HEADER0_CONTEXT_MASK 0x3c -#define SPE_HEADER0_OP_TYPE 0x8 -#define SPE_HEADER0_OP_TYPE_MASK 0x3c -#define SPE_HEADER1_ALIGNMENT 0x0 -#define SPE_HEADER1_ADDRESS 0xb0 /* address packet (extended) */ -#define SPE_HEADER1_ADDRESS_MASK 0xf8 -#define SPE_HEADER1_COUNTER 0x98 /* counter packet (extended) */ -#define SPE_HEADER1_COUNTER_MASK 0xf8 - #if __BYTE_ORDER == __BIG_ENDIAN #define le16_to_cpu bswap_16 #define le32_to_cpu bswap_32 @@ -197,46 +175,58 @@ static int arm_spe_get_addr(const unsigned char *buf, size_t len, static int arm_spe_do_get_packet(const unsigned char *buf, size_t len, struct arm_spe_pkt *packet) { - unsigned int byte; + unsigned int hdr; + unsigned char ext_hdr = 0; memset(packet, 0, sizeof(struct arm_spe_pkt)); if (!len) return ARM_SPE_NEED_MORE_BYTES; - byte = buf[0]; - if (byte == SPE_HEADER0_PAD) + hdr = buf[0]; + + if (hdr == SPE_HEADER0_PAD) return arm_spe_get_pad(packet); - else if (byte == SPE_HEADER0_END) /* no timestamp at end of record */ + + if (hdr == SPE_HEADER0_END) /* no timestamp at end of record */ return arm_spe_get_end(packet); - else if (byte & 0xc0 /* 0y11xxxxxx */) { - if (byte & 0x80) { - if ((byte & SPE_HEADER0_ADDRESS_MASK) == SPE_HEADER0_ADDRESS) - return arm_spe_get_addr(buf, len, 0, packet); - if ((byte & SPE_HEADER0_COUNTER_MASK) == SPE_HEADER0_COUNTER) - return arm_spe_get_counter(buf, len, 0, packet); - } else - if (byte == SPE_HEADER0_TIMESTAMP) - return arm_spe_get_timestamp(buf, len, packet); - else if ((byte & SPE_HEADER0_EVENTS_MASK) == SPE_HEADER0_EVENTS) - return arm_spe_get_events(buf, len, packet); - else if ((byte & SPE_HEADER0_SOURCE_MASK) == SPE_HEADER0_SOURCE) - return arm_spe_get_data_source(buf, len, packet); - else if ((byte & SPE_HEADER0_CONTEXT_MASK) == SPE_HEADER0_CONTEXT) - return arm_spe_get_context(buf, len, packet); - else if ((byte & SPE_HEADER0_OP_TYPE_MASK) == SPE_HEADER0_OP_TYPE) - return arm_spe_get_op_type(buf, len, packet); - } else if ((byte & 0xe0) == 0x20 /* 0y001xxxxx */) { - /* 16-bit header */ - byte = buf[1]; - if (byte == SPE_HEADER1_ALIGNMENT) + + if (hdr == SPE_HEADER0_TIMESTAMP) + return arm_spe_get_timestamp(buf, len, packet); + + if ((hdr & SPE_HEADER0_MASK1) == SPE_HEADER0_EVENTS) + return arm_spe_get_events(buf, len, packet); + + if ((hdr & SPE_HEADER0_MASK1) == SPE_HEADER0_SOURCE) + return arm_spe_get_data_source(buf, len, packet); + + if ((hdr & SPE_HEADER0_MASK2) == SPE_HEADER0_CONTEXT) + return arm_spe_get_context(buf, len, packet); + + if ((hdr & SPE_HEADER0_MASK2) == SPE_HEADER0_OPERATION) + return arm_spe_get_op_type(buf, len, packet); + + if ((hdr & SPE_HEADER0_MASK3) == SPE_HEADER0_EXTENDED) { + /* 16-bit extended format header */ + ext_hdr = 1; + + hdr = buf[1]; + if (hdr == SPE_HEADER1_ALIGNMENT) return arm_spe_get_alignment(buf, len, packet); - else if ((byte & SPE_HEADER1_ADDRESS_MASK) == SPE_HEADER1_ADDRESS) - return arm_spe_get_addr(buf, len, 1, packet); - else if ((byte & SPE_HEADER1_COUNTER_MASK) == SPE_HEADER1_COUNTER) - return arm_spe_get_counter(buf, len, 1, packet); } + /* + * The short format header's byte 0 or the extended format header's + * byte 1 has been assigned to 'hdr', which uses the same encoding for + * address packet and counter packet, so don't need to distinguish if + * it's short format or extended format and handle in once. + */ + if ((hdr & SPE_HEADER0_MASK4) == SPE_HEADER0_ADDRESS) + return arm_spe_get_addr(buf, len, ext_hdr, packet); + + if ((hdr & SPE_HEADER0_MASK4) == SPE_HEADER0_COUNTER) + return arm_spe_get_counter(buf, len, ext_hdr, packet); + return ARM_SPE_BAD_PACKET; } 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 aca919159cad..9df5ebe02c5d 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 @@ -36,6 +36,23 @@ struct arm_spe_pkt { uint64_t payload; }; +/* Short header (HEADER0) and extended header (HEADER1) */ +#define SPE_HEADER0_PAD 0x0 +#define SPE_HEADER0_END 0x1 +#define SPE_HEADER0_TIMESTAMP 0x71 +#define SPE_HEADER0_MASK1 0xcf /* Mask for event & data source */ +#define SPE_HEADER0_EVENTS 0x42 +#define SPE_HEADER0_SOURCE 0x43 +#define SPE_HEADER0_MASK2 0xfc /* Mask for context & operation */ +#define SPE_HEADER0_CONTEXT 0x64 +#define SPE_HEADER0_OPERATION 0x48 +#define SPE_HEADER0_MASK3 0xe0 /* Mask for extended format */ +#define SPE_HEADER0_EXTENDED 0x20 +#define SPE_HEADER0_MASK4 0xf8 /* Mask for address & counter */ +#define SPE_HEADER0_ADDRESS 0xb0 +#define SPE_HEADER0_COUNTER 0x98 +#define SPE_HEADER1_ALIGNMENT 0x0 + #define SPE_HEADER_SZ_SHIFT (4) #define SPE_HEADER_SZ_MASK (0x30) -- 2.17.1