aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/util/intel-pt-decoder/intel-pt-decoder.c41
1 files changed, 31 insertions, 10 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 ef3a1c1cd250..a2384a314990 100644
--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
+++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
@@ -116,6 +116,7 @@ struct intel_pt_decoder {
116 bool have_cyc; 116 bool have_cyc;
117 bool fixup_last_mtc; 117 bool fixup_last_mtc;
118 bool have_last_ip; 118 bool have_last_ip;
119 bool in_psb;
119 enum intel_pt_param_flags flags; 120 enum intel_pt_param_flags flags;
120 uint64_t pos; 121 uint64_t pos;
121 uint64_t last_ip; 122 uint64_t last_ip;
@@ -1549,14 +1550,17 @@ static int intel_pt_walk_psbend(struct intel_pt_decoder *decoder)
1549{ 1550{
1550 int err; 1551 int err;
1551 1552
1553 decoder->in_psb = true;
1554
1552 while (1) { 1555 while (1) {
1553 err = intel_pt_get_next_packet(decoder); 1556 err = intel_pt_get_next_packet(decoder);
1554 if (err) 1557 if (err)
1555 return err; 1558 goto out;
1556 1559
1557 switch (decoder->packet.type) { 1560 switch (decoder->packet.type) {
1558 case INTEL_PT_PSBEND: 1561 case INTEL_PT_PSBEND:
1559 return 0; 1562 err = 0;
1563 goto out;
1560 1564
1561 case INTEL_PT_TIP_PGD: 1565 case INTEL_PT_TIP_PGD:
1562 case INTEL_PT_TIP_PGE: 1566 case INTEL_PT_TIP_PGE:
@@ -1574,10 +1578,12 @@ static int intel_pt_walk_psbend(struct intel_pt_decoder *decoder)
1574 case INTEL_PT_PWRX: 1578 case INTEL_PT_PWRX:
1575 decoder->have_tma = false; 1579 decoder->have_tma = false;
1576 intel_pt_log("ERROR: Unexpected packet\n"); 1580 intel_pt_log("ERROR: Unexpected packet\n");
1577 return -EAGAIN; 1581 err = -EAGAIN;
1582 goto out;
1578 1583
1579 case INTEL_PT_OVF: 1584 case INTEL_PT_OVF:
1580 return intel_pt_overflow(decoder); 1585 err = intel_pt_overflow(decoder);
1586 goto out;
1581 1587
1582 case INTEL_PT_TSC: 1588 case INTEL_PT_TSC:
1583 intel_pt_calc_tsc_timestamp(decoder); 1589 intel_pt_calc_tsc_timestamp(decoder);
@@ -1623,6 +1629,10 @@ static int intel_pt_walk_psbend(struct intel_pt_decoder *decoder)
1623 break; 1629 break;
1624 } 1630 }
1625 } 1631 }
1632out:
1633 decoder->in_psb = false;
1634
1635 return err;
1626} 1636}
1627 1637
1628static int intel_pt_walk_fup_tip(struct intel_pt_decoder *decoder) 1638static int intel_pt_walk_fup_tip(struct intel_pt_decoder *decoder)
@@ -1996,10 +2006,12 @@ static int intel_pt_walk_psb(struct intel_pt_decoder *decoder)
1996{ 2006{
1997 int err; 2007 int err;
1998 2008
2009 decoder->in_psb = true;
2010
1999 while (1) { 2011 while (1) {
2000 err = intel_pt_get_next_packet(decoder); 2012 err = intel_pt_get_next_packet(decoder);
2001 if (err) 2013 if (err)
2002 return err; 2014 goto out;
2003 2015
2004 switch (decoder->packet.type) { 2016 switch (decoder->packet.type) {
2005 case INTEL_PT_TIP_PGD: 2017 case INTEL_PT_TIP_PGD:
@@ -2015,7 +2027,8 @@ static int intel_pt_walk_psb(struct intel_pt_decoder *decoder)
2015 case INTEL_PT_PWRE: 2027 case INTEL_PT_PWRE:
2016 case INTEL_PT_PWRX: 2028 case INTEL_PT_PWRX:
2017 intel_pt_log("ERROR: Unexpected packet\n"); 2029 intel_pt_log("ERROR: Unexpected packet\n");
2018 return -ENOENT; 2030 err = -ENOENT;
2031 goto out;
2019 2032
2020 case INTEL_PT_FUP: 2033 case INTEL_PT_FUP:
2021 decoder->pge = true; 2034 decoder->pge = true;
@@ -2074,16 +2087,20 @@ static int intel_pt_walk_psb(struct intel_pt_decoder *decoder)
2074 decoder->pkt_state = INTEL_PT_STATE_ERR4; 2087 decoder->pkt_state = INTEL_PT_STATE_ERR4;
2075 else 2088 else
2076 decoder->pkt_state = INTEL_PT_STATE_ERR3; 2089 decoder->pkt_state = INTEL_PT_STATE_ERR3;
2077 return -ENOENT; 2090 err = -ENOENT;
2091 goto out;
2078 2092
2079 case INTEL_PT_BAD: /* Does not happen */ 2093 case INTEL_PT_BAD: /* Does not happen */
2080 return intel_pt_bug(decoder); 2094 err = intel_pt_bug(decoder);
2095 goto out;
2081 2096
2082 case INTEL_PT_OVF: 2097 case INTEL_PT_OVF:
2083 return intel_pt_overflow(decoder); 2098 err = intel_pt_overflow(decoder);
2099 goto out;
2084 2100
2085 case INTEL_PT_PSBEND: 2101 case INTEL_PT_PSBEND:
2086 return 0; 2102 err = 0;
2103 goto out;
2087 2104
2088 case INTEL_PT_PSB: 2105 case INTEL_PT_PSB:
2089 case INTEL_PT_VMCS: 2106 case INTEL_PT_VMCS:
@@ -2093,6 +2110,10 @@ static int intel_pt_walk_psb(struct intel_pt_decoder *decoder)
2093 break; 2110 break;
2094 } 2111 }
2095 } 2112 }
2113out:
2114 decoder->in_psb = false;
2115
2116 return err;
2096} 2117}
2097 2118
2098static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder) 2119static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder)