diff options
Diffstat (limited to 'tools/perf/util/intel-pt-decoder/intel-pt-decoder.c')
| -rw-r--r-- | tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 37 | 
1 files changed, 34 insertions, 3 deletions
| diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c index d27715ff9a5f..94764efb0a6a 100644 --- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c @@ -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" @@ -1311,7 +1312,6 @@ static int intel_pt_overflow(struct intel_pt_decoder *decoder)  {  	intel_pt_log("ERROR: Buffer overflow\n");  	intel_pt_clear_tx_flags(decoder); -	decoder->cbr = 0;  	decoder->timestamp_insn_cnt = 0;  	decoder->pkt_state = INTEL_PT_STATE_ERR_RESYNC;  	decoder->overflow = true; @@ -2351,6 +2351,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. @@ -2401,8 +2429,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 */ @@ -2465,7 +2496,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' */ | 
