Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp152182pxb; Tue, 10 Nov 2020 23:27:30 -0800 (PST) X-Google-Smtp-Source: ABdhPJwpjCSKdqPGRUGSf8b4cb95osNS7hAQQJdbF24m3stGsP7d2ks+UUSPQuY92dzQ4vWO/Sc6 X-Received: by 2002:a05:6402:14cf:: with SMTP id f15mr3484824edx.18.1605079650786; Tue, 10 Nov 2020 23:27:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605079650; cv=none; d=google.com; s=arc-20160816; b=AeYcILFUlI7tHftQ7R+z9yCD9NETm0J2Q0ZuGF+IQggBIxA1QfNT+5CymYKWme49wH 8h3gjqNjwTyjNXSINQfn0iUM7wVQhX42CDunLcL7zJ5H4gjxOuvPFeMigJpeefPqWXZv kLPFOPB8Hpwj2xEUgZiLXk1+0h1K8DGfiXSBHNeeD9CbEP2E1Szylgtg8WV+z4sfzX3M OQaXSXPoGZXxUT2j1I5D1/lLO+fZBmhqCTy9V4/bmFQ6mY7jmYkEU8EkUYeSCI5LIgnA TYyevbM72A4PwrB4kP/MCCKJoFqaovBVMWdk6eUH+gFyAqct++9H+J+jRStSvUSLqH9R xhKw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=2qB7Q0MBMhc3zf25jRC9VxG5+at7sjiVekVGqJzH7oo=; b=m9n9edWX0HtuMYbAVb/FeKT645ucLyFUqRxDuJ1Bs6VydfPM6MxTE31Hj9qUwzlEUi 1aGxQj0hz8IyVAabGjw5tqw/KijmAo5hvQ3a4O7GR8SBJEonFTAA9RWxQzcfvH0hqYf/ Zbe+xQtM4iqJNPoaXohirVbLrnm68fwGf5AMDrWyM2v8R2Yk48HaLdv10TdqE3QMnxkg uSwserhJfSLN8svIkkwE/yUsV3gpVY7v0DYG6FC8XiQFPUypMl8SzpyvG0aqGl0PwIhL TbR0YoNd4/mtlI3EpsaZYpfZc/7VIAABy43Cf824QOZjuN2+yZP3L9ITIzbiSZBCLAot 6c5g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ZPtNxNtK; 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 f4si855687edq.363.2020.11.10.23.27.07; Tue, 10 Nov 2020 23:27:30 -0800 (PST) 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=ZPtNxNtK; 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 S1726597AbgKKHWF (ORCPT + 99 others); Wed, 11 Nov 2020 02:22:05 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48888 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726247AbgKKHMv (ORCPT ); Wed, 11 Nov 2020 02:12:51 -0500 Received: from mail-pl1-x62b.google.com (mail-pl1-x62b.google.com [IPv6:2607:f8b0:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EAED3C0613D4 for ; Tue, 10 Nov 2020 23:12:50 -0800 (PST) Received: by mail-pl1-x62b.google.com with SMTP id d3so514603plo.4 for ; Tue, 10 Nov 2020 23:12:50 -0800 (PST) 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=2qB7Q0MBMhc3zf25jRC9VxG5+at7sjiVekVGqJzH7oo=; b=ZPtNxNtKAbyiPZshRtpnOjQO+FW+w3ZJQVwxikHfhezWaeO8Aj7gHoJebxEs1BGQdl 8CkslFqkR6e280vdfQEbngVMChKjbbYb4hc8vCrCmfn+QO5iB74LCBHP6t1P6gSIyfxq 8WAjZmLmfmvpJleNqyAl+i9ef2Aam8yZt47qixPVRVNqnfux4D2G8j0xq7SrI0z015+4 LQOy4cPqx8rOV5LgyOdq+rDhsRpb2bK96TSvO3o0dSPovUkiMsWHosMob3vr6fHcAeFH HgnNjZmENsQrOQdksvVXg4Gw1XB2K0QaDH2kv3oAxovTThaKLPnGmpMkLIPVzwgAgdKM vJwA== 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=2qB7Q0MBMhc3zf25jRC9VxG5+at7sjiVekVGqJzH7oo=; b=CPt1H8c6QtQnIsk2iQ/BqZevPHmrf+JPKA49TxS8G+dDft5e5hLfV8WCU06QgsLXr/ diEeF/utI8oDcFg0zCEmeFvAxO4ZylbNXCo1o6SvRaZZvDuHJ7kMhE3Gx55uvq+Qx+hH Pb5+RkE11tcFWACEVGg70VR9PdT1HkyKL7RgdHkIdBxKWrs8PwBgk2bsHcUp5xgfJ9O+ wkw+WFLNpZ1mDDZzhGhPWuGlMo6+guzw4O2SVk3QZyWIWzvS4I3xyxxOZkcXv0hG9hJ4 D5Qn/NVn+Ju1hMd1g5BD5/sITShZmkDmIAThp/2vrQDeMXTbks6YCMKTg5elf0mlB/Fy tV6w== X-Gm-Message-State: AOAM532ONELYZTGb+oBOlKyskBbcF3meWWamHAA0LDaPOpBwUS8B1Rxg zCp9LliJTrUTzTZ8EksmHO3MoA== X-Received: by 2002:a17:902:c113:b029:d6:944e:fdb3 with SMTP id 19-20020a170902c113b02900d6944efdb3mr4288931pli.4.1605078770466; Tue, 10 Nov 2020 23:12:50 -0800 (PST) Received: from localhost ([45.137.216.7]) by smtp.gmail.com with ESMTPSA id l17sm1291166pjy.29.2020.11.10.23.12.49 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Tue, 10 Nov 2020 23:12:49 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Andre Przywara , Dave Martin , James Clark , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Al Grant , Wei Li , John Garry , Will Deacon , Mathieu Poirier , linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v8 08/22] perf arm-spe: Refactor packet header parsing Date: Wed, 11 Nov 2020 15:11:35 +0800 Message-Id: <20201111071149.815-9-leo.yan@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201111071149.815-1-leo.yan@linaro.org> References: <20201111071149.815-1-leo.yan@linaro.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 Reviewed-by: Andre Przywara --- .../arm-spe-decoder/arm-spe-pkt-decoder.c | 92 +++++++++---------- .../arm-spe-decoder/arm-spe-pkt-decoder.h | 20 ++++ 2 files changed, 61 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 424ff5862aa1..a43880e06547 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 @@ -16,28 +16,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 @@ -200,46 +178,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_OP_TYPE) + return arm_spe_get_op_type(buf, len, packet); + + if ((hdr & SPE_HEADER0_MASK2) == 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_MASK3) == SPE_HEADER0_ADDRESS) + return arm_spe_get_addr(buf, len, ext_hdr, packet); + + if ((hdr & SPE_HEADER0_MASK3) == 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 4c870521b8eb..129f43405eb1 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,26 @@ 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 +/* Mask for event & data source */ +#define SPE_HEADER0_MASK1 (GENMASK_ULL(7, 6) | GENMASK_ULL(3, 0)) +#define SPE_HEADER0_EVENTS 0x42 +#define SPE_HEADER0_SOURCE 0x43 +/* Mask for context & operation */ +#define SPE_HEADER0_MASK2 GENMASK_ULL(7, 2) +#define SPE_HEADER0_CONTEXT 0x64 +#define SPE_HEADER0_OP_TYPE 0x48 +/* Mask for extended format */ +#define SPE_HEADER0_EXTENDED 0x20 +/* Mask for address & counter */ +#define SPE_HEADER0_MASK3 GENMASK_ULL(7, 3) +#define SPE_HEADER0_ADDRESS 0xb0 +#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) -- 2.17.1