Skip to content

Commit

Permalink
perf intel-pt: Fix overlap calculation for padding
Browse files Browse the repository at this point in the history
commit 5a99d99 upstream.

Auxtrace records might have up to 7 bytes of padding appended. Adjust
the overlap accordingly.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: stable@vger.kernel.org
Link: http://lkml.kernel.org/r/20190206103947.15750-3-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Adrian Hunter authored and Greg Kroah-Hartman committed Mar 23, 2019
1 parent 5664e60 commit 4426d5f
Showing 1 changed file with 34 additions and 2 deletions.
36 changes: 34 additions & 2 deletions tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@

#include "../cache.h"
#include "../util.h"
#include "../auxtrace.h"

#include "intel-pt-insn-decoder.h"
#include "intel-pt-pkt-decoder.h"
Expand Down Expand Up @@ -2320,6 +2321,34 @@ static int intel_pt_tsc_cmp(uint64_t tsc1, uint64_t tsc2)
}
}

#define MAX_PADDING (PERF_AUXTRACE_RECORD_ALIGNMENT - 1)

/**
* adj_for_padding - adjust overlap to account for padding.
* @buf_b: second buffer
* @buf_a: first buffer
* @len_a: size of first buffer
*
* @buf_a might have up to 7 bytes of padding appended. Adjust the overlap
* accordingly.
*
* Return: A pointer into @buf_b from where non-overlapped data starts
*/
static unsigned char *adj_for_padding(unsigned char *buf_b,
unsigned char *buf_a, size_t len_a)
{
unsigned char *p = buf_b - MAX_PADDING;
unsigned char *q = buf_a + len_a - MAX_PADDING;
int i;

for (i = MAX_PADDING; i; i--, p++, q++) {
if (*p != *q)
break;
}

return p;
}

/**
* intel_pt_find_overlap_tsc - determine start of non-overlapped trace data
* using TSC.
Expand Down Expand Up @@ -2370,8 +2399,11 @@ static unsigned char *intel_pt_find_overlap_tsc(unsigned char *buf_a,

/* Same TSC, so buffers are consecutive */
if (!cmp && rem_b >= rem_a) {
unsigned char *start;

*consecutive = true;
return buf_b + len_b - (rem_b - rem_a);
start = buf_b + len_b - (rem_b - rem_a);
return adj_for_padding(start, buf_a, len_a);
}
if (cmp < 0)
return buf_b; /* tsc_a < tsc_b => no overlap */
Expand Down Expand Up @@ -2434,7 +2466,7 @@ unsigned char *intel_pt_find_overlap(unsigned char *buf_a, size_t len_a,
found = memmem(buf_a, len_a, buf_b, len_a);
if (found) {
*consecutive = true;
return buf_b + len_a;
return adj_for_padding(buf_b + len_a, buf_a, len_a);
}

/* Try again at next PSB in buffer 'a' */
Expand Down

0 comments on commit 4426d5f

Please sign in to comment.