diff options
author | Adrian Hunter <adrian.hunter@intel.com> | 2017-05-26 04:17:07 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2017-06-21 10:35:46 -0400 |
commit | f952eaceb089b691eba7c4e13686e742a8f26bf5 (patch) | |
tree | b474fda9cee8d4d68eefd5de4e46b5bbb0d9bae2 /tools/perf | |
parent | ee14ac0ef6827cd6f9a572cc83dd0191ea17812c (diff) |
perf intel-pt: Ensure never to set 'last_ip' when packet 'count' is zero
Intel PT uses IP compression based on the last IP. For decoding purposes,
'last IP' is not updated when a branch target has been suppressed, which is
indicated by IPBytes == 0. IPBytes is stored in the packet 'count', so
ensure never to set 'last_ip' when packet 'count' is zero.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: stable@vger.kernel.org
Link: http://lkml.kernel.org/r/1495786658-18063-7-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 8 |
1 files changed, 5 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 62e2c2ad3f1d..72b9dc8135a2 100644 --- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | |||
@@ -1470,7 +1470,8 @@ static int intel_pt_walk_psbend(struct intel_pt_decoder *decoder) | |||
1470 | 1470 | ||
1471 | case INTEL_PT_FUP: | 1471 | case INTEL_PT_FUP: |
1472 | decoder->pge = true; | 1472 | decoder->pge = true; |
1473 | intel_pt_set_last_ip(decoder); | 1473 | if (decoder->packet.count) |
1474 | intel_pt_set_last_ip(decoder); | ||
1474 | break; | 1475 | break; |
1475 | 1476 | ||
1476 | case INTEL_PT_MODE_TSX: | 1477 | case INTEL_PT_MODE_TSX: |
@@ -1756,8 +1757,9 @@ next: | |||
1756 | 1757 | ||
1757 | static inline bool intel_pt_have_ip(struct intel_pt_decoder *decoder) | 1758 | static inline bool intel_pt_have_ip(struct intel_pt_decoder *decoder) |
1758 | { | 1759 | { |
1759 | return decoder->have_last_ip || decoder->packet.count == 0 || | 1760 | return decoder->packet.count && |
1760 | decoder->packet.count == 3 || decoder->packet.count == 6; | 1761 | (decoder->have_last_ip || decoder->packet.count == 3 || |
1762 | decoder->packet.count == 6); | ||
1761 | } | 1763 | } |
1762 | 1764 | ||
1763 | /* Walk PSB+ packets to get in sync. */ | 1765 | /* Walk PSB+ packets to get in sync. */ |