lkml.org 
[lkml]   [2020]   [Oct]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 05/21] perf arm-spe: Fix packet length handling
    Date
    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 <leo.yan@linaro.org>
    Reviewed-by: Andre Przywara <andre.przywara@arm.com>
    ---
    .../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 f1b4cb008837..04fd7fd7c15f 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
    \
     
     \ /
      Last update: 2020-10-27 04:11    [W:7.380 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site