diff options
| -rw-r--r-- | tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 41 |
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 | } |
| 1632 | out: | ||
| 1633 | decoder->in_psb = false; | ||
| 1634 | |||
| 1635 | return err; | ||
| 1626 | } | 1636 | } |
| 1627 | 1637 | ||
| 1628 | static int intel_pt_walk_fup_tip(struct intel_pt_decoder *decoder) | 1638 | static 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 | } |
| 2113 | out: | ||
| 2114 | decoder->in_psb = false; | ||
| 2115 | |||
| 2116 | return err; | ||
| 2096 | } | 2117 | } |
| 2097 | 2118 | ||
| 2098 | static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder) | 2119 | static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder) |
