Received: by 2002:a05:6a10:6744:0:0:0:0 with SMTP id w4csp5780804pxu; Thu, 22 Oct 2020 10:50:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwi3sFhTQCrPkjkXUPzCBkUd9wEpos5JaoqerObxIWXpoQRpOoFNXMB7y4+dbTS/qlWdOJq X-Received: by 2002:a17:906:e949:: with SMTP id jw9mr3313562ejb.109.1603389045658; Thu, 22 Oct 2020 10:50:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603389045; cv=none; d=google.com; s=arc-20160816; b=CW6rR3UpXaWB7vS5LacE09ST/Ml8Z3nes42XV4cXqFf8J9Bncl+vYHlNY4inzZgELE +oEuVL7NFqK4R9NOScrnfouXhnMy8w3fc7JT9fNbGe+4aFDdLl/ZlPvhn04REA0qq2Ar pKvR++1j1/4dVq1I03tiJhYsi0nz+C8cXsOvJqsLvX6fnXX54qNhTK4wDAb4ljxKTMYG ZV+TmCNSAyhwaW16/VY4bJqGofxPlM2GZSOBI/rmvn6utpyE/af4Qz6tBXyZHQrl5dSQ Kcxdr8tBvE6TvTC69y5Frf/RJbYoGIf/cNqkz6LSmn83B5B4YthTRXTFYIt28hGwKTzC U6dQ== 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=ngLakRbP3Z6ESa9i5OTmA+5xWZSsaXzHrY9rPhVEpZ4=; b=XUU9ZbR91RwByzxO6CWdnZF2HL6+8qp875axgvd5b8sopiCPf1LA+laFQ3adC0Uoi5 KEcuJGwTo/WKKcC8iTe/6YjRdHW/9aHaLPveJD0UyTsp2PAU0vpvXA+WC0+AbBiqiYxW Kl5zbDtWUs9EdgDSRoLEUNGVSzJH9DJ/L+FY2lEaqZ95ytt9JyALUZcYeEPLaFefSyZv Ob2JrURYqOsKx2mKyePS2JN1pzciAHP2McS10aaVMhOILzoUveZuLYWjMoBWwupJaqGX iapgf0+fsuBCnv88sSDnMNXkEyc3FHNK23Gr82SIxQ8dIqfJt0j4Wrviu7o8beD9caLL FioQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=PBERvvAU; 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 i8si1383072edr.518.2020.10.22.10.50.22; Thu, 22 Oct 2020 10:50:45 -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=PBERvvAU; 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 S368368AbgJVO6p (ORCPT + 99 others); Thu, 22 Oct 2020 10:58:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37888 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S368341AbgJVO6h (ORCPT ); Thu, 22 Oct 2020 10:58:37 -0400 Received: from mail-wm1-x343.google.com (mail-wm1-x343.google.com [IPv6:2a00:1450:4864:20::343]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EFC41C0613CE for ; Thu, 22 Oct 2020 07:58:36 -0700 (PDT) Received: by mail-wm1-x343.google.com with SMTP id d3so2623028wma.4 for ; Thu, 22 Oct 2020 07:58:36 -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=ngLakRbP3Z6ESa9i5OTmA+5xWZSsaXzHrY9rPhVEpZ4=; b=PBERvvAUWWvHPZGVSEv3DOALROJOdeMpL9YQnfQ9iPdujTrvVrWYjLPoz9r59l/Vuu 4RHHNd8Vb3OlH5EJVqGmKaLk71HsAv1IeImN5IgkinzAcUD4wksbdGUNzeyxBfq7z7hL OHDIfhmXOJ7ImtYj+KsFnRHKjTqakAd78BPooU+AyMQzCv//tiF76KWhIFzqTKSqClHe 4AUFsYUwdoU6Ynpmy0+yFeXlHSvpIhvp+w6tPzyZzOUekW/pwyvTBQmvjeC17dnUzKLh jh5hzpkGNZNsRDGVTX3qvAru2MP9tbySdKYXiwgNJ+yM59StSXpgd94lvenKOoIILsQO Jn5A== 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=ngLakRbP3Z6ESa9i5OTmA+5xWZSsaXzHrY9rPhVEpZ4=; b=CENAmUd95yIWGzK+M3AD1bCgomerX328/DhmryP41WGQ2zXgAd16P4hQZas+9S2Ait 45wLebvSxO0NA+L1Z0+Z7KrE5Y8RALnZcdIwWZGQ8UXG/e2qNYD5lxHB6TjZke341lKL h1Gw8rrgsmSiDzjv5ce3wWeAZ6VAcUaagj0W1Gd6CqPmA2epfZu0L+4PyBfyH8gRJx2I NHsU5RNiDkC3VSeJ/w/j3zhxOJWVqAb7pMh8Qz8GOYdXS6v1zp5kRcH1et8pBpjVa0LG o8JmTPVJbTvfH04MJG1VYokzskYYwDdCFSIu1B4e9Sk3K7MnjAQNdPZX36ekCIojsXx9 paNw== X-Gm-Message-State: AOAM533QPE4PXKwwvOpGSQyBuU+pokUAp2sK7G0D7f/y5hXoypqDbqDe L9FE4ymsR9Uwp3CsVzopFCXjWw== X-Received: by 2002:a1c:2c02:: with SMTP id s2mr3084054wms.66.1603378715701; Thu, 22 Oct 2020 07:58:35 -0700 (PDT) Received: from hackbox2.linaro.org ([81.128.185.34]) by smtp.gmail.com with ESMTPSA id 130sm4348021wmd.18.2020.10.22.07.58.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Oct 2020 07:58:35 -0700 (PDT) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Wei Li , James Clark , Andre Przywara , Al Grant , Dave Martin , linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 05/20] perf arm-spe: Fix packet length handling Date: Thu, 22 Oct 2020 15:58:01 +0100 Message-Id: <20201022145816.14069-6-leo.yan@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201022145816.14069-1-leo.yan@linaro.org> References: <20201022145816.14069-1-leo.yan@linaro.org> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When processing address packet and counter packet, if the packet contains extended header, it misses to account the extra one byte for header length calculation, thus returns the wrong packet length. To correct the packet length calculation, one possible fixing is simply to plus extra 1 for extended header, but will spread some duplicate code in the flows for processing address packet and counter packet. Alternatively, we can refine the function arm_spe_get_payload() to not only support short header and allow it to support extended header, and rely on it for the packet length calculation. So this patch refactors function arm_spe_get_payload() with a new argument 'ext_hdr' for support extended header; the packet processing flows can invoke this function to unify the packet length calculation. Signed-off-by: Leo Yan Reviewed-by: Andre Przywara --- .../arm-spe-decoder/arm-spe-pkt-decoder.c | 34 +++++++------------ 1 file changed, 12 insertions(+), 22 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 f3bb8bf102aa..e9ec7edb51a0 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 @@ -82,14 +82,15 @@ static unsigned int arm_spe_payload_len(unsigned char hdr) } static int arm_spe_get_payload(const unsigned char *buf, size_t len, + unsigned char ext_hdr, struct arm_spe_pkt *packet) { - size_t payload_len = arm_spe_payload_len(buf[0]); + size_t payload_len = arm_spe_payload_len(buf[ext_hdr]); - if (len < 1 + payload_len) + if (len < 1 + ext_hdr + payload_len) return ARM_SPE_NEED_MORE_BYTES; - buf++; + buf += 1 + ext_hdr; switch (payload_len) { case 1: packet->payload = *(uint8_t *)buf; break; @@ -99,7 +100,7 @@ static int arm_spe_get_payload(const unsigned char *buf, size_t len, default: return ARM_SPE_BAD_PACKET; } - return 1 + payload_len; + return 1 + ext_hdr + payload_len; } static int arm_spe_get_pad(struct arm_spe_pkt *packet) @@ -130,7 +131,7 @@ static int arm_spe_get_timestamp(const unsigned char *buf, size_t len, struct arm_spe_pkt *packet) { packet->type = ARM_SPE_TIMESTAMP; - return arm_spe_get_payload(buf, len, packet); + return arm_spe_get_payload(buf, len, 0, packet); } static int arm_spe_get_events(const unsigned char *buf, size_t len, @@ -145,14 +146,14 @@ static int arm_spe_get_events(const unsigned char *buf, size_t len, */ packet->index = arm_spe_payload_len(buf[0]); - return arm_spe_get_payload(buf, len, packet); + return arm_spe_get_payload(buf, len, 0, packet); } static int arm_spe_get_data_source(const unsigned char *buf, size_t len, struct arm_spe_pkt *packet) { packet->type = ARM_SPE_DATA_SOURCE; - return arm_spe_get_payload(buf, len, packet); + return arm_spe_get_payload(buf, len, 0, packet); } static int arm_spe_get_context(const unsigned char *buf, size_t len, @@ -160,8 +161,7 @@ static int arm_spe_get_context(const unsigned char *buf, size_t len, { packet->type = ARM_SPE_CONTEXT; packet->index = buf[0] & 0x3; - - return arm_spe_get_payload(buf, len, packet); + return arm_spe_get_payload(buf, len, 0, packet); } static int arm_spe_get_op_type(const unsigned char *buf, size_t len, @@ -169,41 +169,31 @@ static int arm_spe_get_op_type(const unsigned char *buf, size_t len, { packet->type = ARM_SPE_OP_TYPE; packet->index = buf[0] & 0x3; - return arm_spe_get_payload(buf, len, packet); + return arm_spe_get_payload(buf, len, 0, packet); } static int arm_spe_get_counter(const unsigned char *buf, size_t len, const unsigned char ext_hdr, struct arm_spe_pkt *packet) { - if (len < 2) - return ARM_SPE_NEED_MORE_BYTES; - packet->type = ARM_SPE_COUNTER; if (ext_hdr) packet->index = ((buf[0] & 0x3) << 3) | (buf[1] & 0x7); else packet->index = buf[0] & 0x7; - packet->payload = le16_to_cpu(*(uint16_t *)(buf + 1)); - - return 1 + ext_hdr + 2; + return arm_spe_get_payload(buf, len, ext_hdr, packet); } static int arm_spe_get_addr(const unsigned char *buf, size_t len, const unsigned char ext_hdr, struct arm_spe_pkt *packet) { - if (len < 8) - return ARM_SPE_NEED_MORE_BYTES; - packet->type = ARM_SPE_ADDRESS; if (ext_hdr) packet->index = ((buf[0] & 0x3) << 3) | (buf[1] & 0x7); else packet->index = buf[0] & 0x7; - memcpy_le64(&packet->payload, buf + 1, 8); - - return 1 + ext_hdr + 8; + return arm_spe_get_payload(buf, len, ext_hdr, packet); } static int arm_spe_do_get_packet(const unsigned char *buf, size_t len, -- 2.17.1