aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.c121
1 files changed, 85 insertions, 36 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 71df7acf8643..eeeae0629ad3 100644
--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
+++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
@@ -22,6 +22,7 @@
22#include <errno.h> 22#include <errno.h>
23#include <stdint.h> 23#include <stdint.h>
24#include <inttypes.h> 24#include <inttypes.h>
25#include <linux/compiler.h>
25 26
26#include "../cache.h" 27#include "../cache.h"
27#include "../util.h" 28#include "../util.h"
@@ -63,6 +64,25 @@ enum intel_pt_pkt_state {
63 INTEL_PT_STATE_FUP_NO_TIP, 64 INTEL_PT_STATE_FUP_NO_TIP,
64}; 65};
65 66
67static inline bool intel_pt_sample_time(enum intel_pt_pkt_state pkt_state)
68{
69 switch (pkt_state) {
70 case INTEL_PT_STATE_NO_PSB:
71 case INTEL_PT_STATE_NO_IP:
72 case INTEL_PT_STATE_ERR_RESYNC:
73 case INTEL_PT_STATE_IN_SYNC:
74 case INTEL_PT_STATE_TNT:
75 return true;
76 case INTEL_PT_STATE_TIP:
77 case INTEL_PT_STATE_TIP_PGD:
78 case INTEL_PT_STATE_FUP:
79 case INTEL_PT_STATE_FUP_NO_TIP:
80 return false;
81 default:
82 return true;
83 };
84}
85
66#ifdef INTEL_PT_STRICT 86#ifdef INTEL_PT_STRICT
67#define INTEL_PT_STATE_ERR1 INTEL_PT_STATE_NO_PSB 87#define INTEL_PT_STATE_ERR1 INTEL_PT_STATE_NO_PSB
68#define INTEL_PT_STATE_ERR2 INTEL_PT_STATE_NO_PSB 88#define INTEL_PT_STATE_ERR2 INTEL_PT_STATE_NO_PSB
@@ -90,6 +110,7 @@ struct intel_pt_decoder {
90 bool have_tma; 110 bool have_tma;
91 bool have_cyc; 111 bool have_cyc;
92 bool fixup_last_mtc; 112 bool fixup_last_mtc;
113 bool have_last_ip;
93 uint64_t pos; 114 uint64_t pos;
94 uint64_t last_ip; 115 uint64_t last_ip;
95 uint64_t ip; 116 uint64_t ip;
@@ -97,6 +118,7 @@ struct intel_pt_decoder {
97 uint64_t timestamp; 118 uint64_t timestamp;
98 uint64_t tsc_timestamp; 119 uint64_t tsc_timestamp;
99 uint64_t ref_timestamp; 120 uint64_t ref_timestamp;
121 uint64_t sample_timestamp;
100 uint64_t ret_addr; 122 uint64_t ret_addr;
101 uint64_t ctc_timestamp; 123 uint64_t ctc_timestamp;
102 uint64_t ctc_delta; 124 uint64_t ctc_delta;
@@ -124,8 +146,6 @@ struct intel_pt_decoder {
124 bool have_calc_cyc_to_tsc; 146 bool have_calc_cyc_to_tsc;
125 int exec_mode; 147 int exec_mode;
126 unsigned int insn_bytes; 148 unsigned int insn_bytes;
127 uint64_t sign_bit;
128 uint64_t sign_bits;
129 uint64_t period; 149 uint64_t period;
130 enum intel_pt_period_type period_type; 150 enum intel_pt_period_type period_type;
131 uint64_t tot_insn_cnt; 151 uint64_t tot_insn_cnt;
@@ -139,6 +159,7 @@ struct intel_pt_decoder {
139 unsigned int fup_tx_flags; 159 unsigned int fup_tx_flags;
140 unsigned int tx_flags; 160 unsigned int tx_flags;
141 uint64_t timestamp_insn_cnt; 161 uint64_t timestamp_insn_cnt;
162 uint64_t sample_insn_cnt;
142 uint64_t stuck_ip; 163 uint64_t stuck_ip;
143 int no_progress; 164 int no_progress;
144 int stuck_ip_prd; 165 int stuck_ip_prd;
@@ -192,9 +213,6 @@ struct intel_pt_decoder *intel_pt_decoder_new(struct intel_pt_params *params)
192 decoder->data = params->data; 213 decoder->data = params->data;
193 decoder->return_compression = params->return_compression; 214 decoder->return_compression = params->return_compression;
194 215
195 decoder->sign_bit = (uint64_t)1 << 47;
196 decoder->sign_bits = ~(((uint64_t)1 << 48) - 1);
197
198 decoder->period = params->period; 216 decoder->period = params->period;
199 decoder->period_type = params->period_type; 217 decoder->period_type = params->period_type;
200 218
@@ -363,21 +381,30 @@ int intel_pt__strerror(int code, char *buf, size_t buflen)
363 return 0; 381 return 0;
364} 382}
365 383
366static uint64_t intel_pt_calc_ip(struct intel_pt_decoder *decoder, 384static uint64_t intel_pt_calc_ip(const struct intel_pt_pkt *packet,
367 const struct intel_pt_pkt *packet,
368 uint64_t last_ip) 385 uint64_t last_ip)
369{ 386{
370 uint64_t ip; 387 uint64_t ip;
371 388
372 switch (packet->count) { 389 switch (packet->count) {
373 case 2: 390 case 1:
374 ip = (last_ip & (uint64_t)0xffffffffffff0000ULL) | 391 ip = (last_ip & (uint64_t)0xffffffffffff0000ULL) |
375 packet->payload; 392 packet->payload;
376 break; 393 break;
377 case 4: 394 case 2:
378 ip = (last_ip & (uint64_t)0xffffffff00000000ULL) | 395 ip = (last_ip & (uint64_t)0xffffffff00000000ULL) |
379 packet->payload; 396 packet->payload;
380 break; 397 break;
398 case 3:
399 ip = packet->payload;
400 /* Sign-extend 6-byte ip */
401 if (ip & (uint64_t)0x800000000000ULL)
402 ip |= (uint64_t)0xffff000000000000ULL;
403 break;
404 case 4:
405 ip = (last_ip & (uint64_t)0xffff000000000000ULL) |
406 packet->payload;
407 break;
381 case 6: 408 case 6:
382 ip = packet->payload; 409 ip = packet->payload;
383 break; 410 break;
@@ -385,16 +412,13 @@ static uint64_t intel_pt_calc_ip(struct intel_pt_decoder *decoder,
385 return 0; 412 return 0;
386 } 413 }
387 414
388 if (ip & decoder->sign_bit)
389 return ip | decoder->sign_bits;
390
391 return ip; 415 return ip;
392} 416}
393 417
394static inline void intel_pt_set_last_ip(struct intel_pt_decoder *decoder) 418static inline void intel_pt_set_last_ip(struct intel_pt_decoder *decoder)
395{ 419{
396 decoder->last_ip = intel_pt_calc_ip(decoder, &decoder->packet, 420 decoder->last_ip = intel_pt_calc_ip(&decoder->packet, decoder->last_ip);
397 decoder->last_ip); 421 decoder->have_last_ip = true;
398} 422}
399 423
400static inline void intel_pt_set_ip(struct intel_pt_decoder *decoder) 424static inline void intel_pt_set_ip(struct intel_pt_decoder *decoder)
@@ -895,6 +919,7 @@ static int intel_pt_walk_insn(struct intel_pt_decoder *decoder,
895 919
896 decoder->tot_insn_cnt += insn_cnt; 920 decoder->tot_insn_cnt += insn_cnt;
897 decoder->timestamp_insn_cnt += insn_cnt; 921 decoder->timestamp_insn_cnt += insn_cnt;
922 decoder->sample_insn_cnt += insn_cnt;
898 decoder->period_insn_cnt += insn_cnt; 923 decoder->period_insn_cnt += insn_cnt;
899 924
900 if (err) { 925 if (err) {
@@ -1413,7 +1438,8 @@ static int intel_pt_walk_psbend(struct intel_pt_decoder *decoder)
1413 1438
1414 case INTEL_PT_FUP: 1439 case INTEL_PT_FUP:
1415 decoder->pge = true; 1440 decoder->pge = true;
1416 intel_pt_set_last_ip(decoder); 1441 if (decoder->packet.count)
1442 intel_pt_set_last_ip(decoder);
1417 break; 1443 break;
1418 1444
1419 case INTEL_PT_MODE_TSX: 1445 case INTEL_PT_MODE_TSX:
@@ -1617,6 +1643,8 @@ next:
1617 break; 1643 break;
1618 1644
1619 case INTEL_PT_PSB: 1645 case INTEL_PT_PSB:
1646 decoder->last_ip = 0;
1647 decoder->have_last_ip = true;
1620 intel_pt_clear_stack(&decoder->stack); 1648 intel_pt_clear_stack(&decoder->stack);
1621 err = intel_pt_walk_psbend(decoder); 1649 err = intel_pt_walk_psbend(decoder);
1622 if (err == -EAGAIN) 1650 if (err == -EAGAIN)
@@ -1695,6 +1723,13 @@ next:
1695 } 1723 }
1696} 1724}
1697 1725
1726static inline bool intel_pt_have_ip(struct intel_pt_decoder *decoder)
1727{
1728 return decoder->packet.count &&
1729 (decoder->have_last_ip || decoder->packet.count == 3 ||
1730 decoder->packet.count == 6);
1731}
1732
1698/* Walk PSB+ packets to get in sync. */ 1733/* Walk PSB+ packets to get in sync. */
1699static int intel_pt_walk_psb(struct intel_pt_decoder *decoder) 1734static int intel_pt_walk_psb(struct intel_pt_decoder *decoder)
1700{ 1735{
@@ -1708,6 +1743,7 @@ static int intel_pt_walk_psb(struct intel_pt_decoder *decoder)
1708 switch (decoder->packet.type) { 1743 switch (decoder->packet.type) {
1709 case INTEL_PT_TIP_PGD: 1744 case INTEL_PT_TIP_PGD:
1710 decoder->continuous_period = false; 1745 decoder->continuous_period = false;
1746 __fallthrough;
1711 case INTEL_PT_TIP_PGE: 1747 case INTEL_PT_TIP_PGE:
1712 case INTEL_PT_TIP: 1748 case INTEL_PT_TIP:
1713 intel_pt_log("ERROR: Unexpected packet\n"); 1749 intel_pt_log("ERROR: Unexpected packet\n");
@@ -1715,8 +1751,7 @@ static int intel_pt_walk_psb(struct intel_pt_decoder *decoder)
1715 1751
1716 case INTEL_PT_FUP: 1752 case INTEL_PT_FUP:
1717 decoder->pge = true; 1753 decoder->pge = true;
1718 if (decoder->last_ip || decoder->packet.count == 6 || 1754 if (intel_pt_have_ip(decoder)) {
1719 decoder->packet.count == 0) {
1720 uint64_t current_ip = decoder->ip; 1755 uint64_t current_ip = decoder->ip;
1721 1756
1722 intel_pt_set_ip(decoder); 1757 intel_pt_set_ip(decoder);
@@ -1762,6 +1797,8 @@ static int intel_pt_walk_psb(struct intel_pt_decoder *decoder)
1762 decoder->pge = false; 1797 decoder->pge = false;
1763 decoder->continuous_period = false; 1798 decoder->continuous_period = false;
1764 intel_pt_clear_tx_flags(decoder); 1799 intel_pt_clear_tx_flags(decoder);
1800 __fallthrough;
1801
1765 case INTEL_PT_TNT: 1802 case INTEL_PT_TNT:
1766 decoder->have_tma = false; 1803 decoder->have_tma = false;
1767 intel_pt_log("ERROR: Unexpected packet\n"); 1804 intel_pt_log("ERROR: Unexpected packet\n");
@@ -1802,27 +1839,21 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder)
1802 switch (decoder->packet.type) { 1839 switch (decoder->packet.type) {
1803 case INTEL_PT_TIP_PGD: 1840 case INTEL_PT_TIP_PGD:
1804 decoder->continuous_period = false; 1841 decoder->continuous_period = false;
1842 __fallthrough;
1805 case INTEL_PT_TIP_PGE: 1843 case INTEL_PT_TIP_PGE:
1806 case INTEL_PT_TIP: 1844 case INTEL_PT_TIP:
1807 decoder->pge = decoder->packet.type != INTEL_PT_TIP_PGD; 1845 decoder->pge = decoder->packet.type != INTEL_PT_TIP_PGD;
1808 if (decoder->last_ip || decoder->packet.count == 6 || 1846 if (intel_pt_have_ip(decoder))
1809 decoder->packet.count == 0)
1810 intel_pt_set_ip(decoder); 1847 intel_pt_set_ip(decoder);
1811 if (decoder->ip) 1848 if (decoder->ip)
1812 return 0; 1849 return 0;
1813 break; 1850 break;
1814 1851
1815 case INTEL_PT_FUP: 1852 case INTEL_PT_FUP:
1816 if (decoder->overflow) { 1853 if (intel_pt_have_ip(decoder))
1817 if (decoder->last_ip || 1854 intel_pt_set_ip(decoder);
1818 decoder->packet.count == 6 || 1855 if (decoder->ip)
1819 decoder->packet.count == 0) 1856 return 0;
1820 intel_pt_set_ip(decoder);
1821 if (decoder->ip)
1822 return 0;
1823 }
1824 if (decoder->packet.count)
1825 intel_pt_set_last_ip(decoder);
1826 break; 1857 break;
1827 1858
1828 case INTEL_PT_MTC: 1859 case INTEL_PT_MTC:
@@ -1871,6 +1902,9 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder)
1871 break; 1902 break;
1872 1903
1873 case INTEL_PT_PSB: 1904 case INTEL_PT_PSB:
1905 decoder->last_ip = 0;
1906 decoder->have_last_ip = true;
1907 intel_pt_clear_stack(&decoder->stack);
1874 err = intel_pt_walk_psb(decoder); 1908 err = intel_pt_walk_psb(decoder);
1875 if (err) 1909 if (err)
1876 return err; 1910 return err;
@@ -1896,6 +1930,8 @@ static int intel_pt_sync_ip(struct intel_pt_decoder *decoder)
1896{ 1930{
1897 int err; 1931 int err;
1898 1932
1933 decoder->set_fup_tx_flags = false;
1934
1899 intel_pt_log("Scanning for full IP\n"); 1935 intel_pt_log("Scanning for full IP\n");
1900 err = intel_pt_walk_to_ip(decoder); 1936 err = intel_pt_walk_to_ip(decoder);
1901 if (err) 1937 if (err)
@@ -2004,6 +2040,7 @@ static int intel_pt_sync(struct intel_pt_decoder *decoder)
2004 2040
2005 decoder->pge = false; 2041 decoder->pge = false;
2006 decoder->continuous_period = false; 2042 decoder->continuous_period = false;
2043 decoder->have_last_ip = false;
2007 decoder->last_ip = 0; 2044 decoder->last_ip = 0;
2008 decoder->ip = 0; 2045 decoder->ip = 0;
2009 intel_pt_clear_stack(&decoder->stack); 2046 intel_pt_clear_stack(&decoder->stack);
@@ -2012,6 +2049,7 @@ static int intel_pt_sync(struct intel_pt_decoder *decoder)
2012 if (err) 2049 if (err)
2013 return err; 2050 return err;
2014 2051
2052 decoder->have_last_ip = true;
2015 decoder->pkt_state = INTEL_PT_STATE_NO_IP; 2053 decoder->pkt_state = INTEL_PT_STATE_NO_IP;
2016 2054
2017 err = intel_pt_walk_psb(decoder); 2055 err = intel_pt_walk_psb(decoder);
@@ -2030,7 +2068,7 @@ static int intel_pt_sync(struct intel_pt_decoder *decoder)
2030 2068
2031static uint64_t intel_pt_est_timestamp(struct intel_pt_decoder *decoder) 2069static uint64_t intel_pt_est_timestamp(struct intel_pt_decoder *decoder)
2032{ 2070{
2033 uint64_t est = decoder->timestamp_insn_cnt << 1; 2071 uint64_t est = decoder->sample_insn_cnt << 1;
2034 2072
2035 if (!decoder->cbr || !decoder->max_non_turbo_ratio) 2073 if (!decoder->cbr || !decoder->max_non_turbo_ratio)
2036 goto out; 2074 goto out;
@@ -2038,7 +2076,7 @@ static uint64_t intel_pt_est_timestamp(struct intel_pt_decoder *decoder)
2038 est *= decoder->max_non_turbo_ratio; 2076 est *= decoder->max_non_turbo_ratio;
2039 est /= decoder->cbr; 2077 est /= decoder->cbr;
2040out: 2078out:
2041 return decoder->timestamp + est; 2079 return decoder->sample_timestamp + est;
2042} 2080}
2043 2081
2044const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder) 2082const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder)
@@ -2054,7 +2092,9 @@ const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder)
2054 err = intel_pt_sync(decoder); 2092 err = intel_pt_sync(decoder);
2055 break; 2093 break;
2056 case INTEL_PT_STATE_NO_IP: 2094 case INTEL_PT_STATE_NO_IP:
2095 decoder->have_last_ip = false;
2057 decoder->last_ip = 0; 2096 decoder->last_ip = 0;
2097 decoder->ip = 0;
2058 /* Fall through */ 2098 /* Fall through */
2059 case INTEL_PT_STATE_ERR_RESYNC: 2099 case INTEL_PT_STATE_ERR_RESYNC:
2060 err = intel_pt_sync_ip(decoder); 2100 err = intel_pt_sync_ip(decoder);
@@ -2091,15 +2131,24 @@ const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder)
2091 } 2131 }
2092 } while (err == -ENOLINK); 2132 } while (err == -ENOLINK);
2093 2133
2094 decoder->state.err = err ? intel_pt_ext_err(err) : 0; 2134 if (err) {
2095 decoder->state.timestamp = decoder->timestamp; 2135 decoder->state.err = intel_pt_ext_err(err);
2136 decoder->state.from_ip = decoder->ip;
2137 decoder->sample_timestamp = decoder->timestamp;
2138 decoder->sample_insn_cnt = decoder->timestamp_insn_cnt;
2139 } else {
2140 decoder->state.err = 0;
2141 if (intel_pt_sample_time(decoder->pkt_state)) {
2142 decoder->sample_timestamp = decoder->timestamp;
2143 decoder->sample_insn_cnt = decoder->timestamp_insn_cnt;
2144 }
2145 }
2146
2147 decoder->state.timestamp = decoder->sample_timestamp;
2096 decoder->state.est_timestamp = intel_pt_est_timestamp(decoder); 2148 decoder->state.est_timestamp = intel_pt_est_timestamp(decoder);
2097 decoder->state.cr3 = decoder->cr3; 2149 decoder->state.cr3 = decoder->cr3;
2098 decoder->state.tot_insn_cnt = decoder->tot_insn_cnt; 2150 decoder->state.tot_insn_cnt = decoder->tot_insn_cnt;
2099 2151
2100 if (err)
2101 decoder->state.from_ip = decoder->ip;
2102
2103 return &decoder->state; 2152 return &decoder->state;
2104} 2153}
2105 2154