Add decoder support for informing the tools of changes to the core-to-bus
ratio (CBR).

Signed-off-by: Adrian Hunter <adrian.hun...@intel.com>
---
 tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 19 +++++++++++++++++++
 tools/perf/util/intel-pt-decoder/intel-pt-decoder.h |  2 ++
 2 files changed, 21 insertions(+)

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 8062655bc112..9bb694290a28 100644
--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
+++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
@@ -121,6 +121,7 @@ struct intel_pt_decoder {
        int pkt_len;
        int last_packet_type;
        unsigned int cbr;
+       unsigned int cbr_seen;
        unsigned int max_non_turbo_ratio;
        double max_non_turbo_ratio_fp;
        double cbr_cyc_to_tsc;
@@ -147,6 +148,7 @@ struct intel_pt_decoder {
        uint64_t fup_ptw_payload;
        uint64_t fup_mwait_payload;
        uint64_t fup_pwre_payload;
+       uint64_t cbr_payload;
        uint64_t timestamp_insn_cnt;
        uint64_t stuck_ip;
        int no_progress;
@@ -1424,6 +1426,8 @@ static void intel_pt_calc_cbr(struct intel_pt_decoder 
*decoder)
 {
        unsigned int cbr = decoder->packet.payload & 0xff;
 
+       decoder->cbr_payload = decoder->packet.payload;
+
        if (decoder->cbr == cbr)
                return;
 
@@ -1784,6 +1788,16 @@ static int intel_pt_walk_trace(struct intel_pt_decoder 
*decoder)
 
                case INTEL_PT_CBR:
                        intel_pt_calc_cbr(decoder);
+                       if (!decoder->branch_enable &&
+                           decoder->cbr != decoder->cbr_seen) {
+                               decoder->cbr_seen = decoder->cbr;
+                               decoder->state.type = INTEL_PT_CBR_CHG;
+                               decoder->state.from_ip = decoder->ip;
+                               decoder->state.to_ip = 0;
+                               decoder->state.cbr_payload =
+                                                       decoder->packet.payload;
+                               return 0;
+                       }
                        break;
 
                case INTEL_PT_MODE_EXEC:
@@ -2324,6 +2338,11 @@ const struct intel_pt_state *intel_pt_decode(struct 
intel_pt_decoder *decoder)
                decoder->state.from_ip = decoder->ip;
        } else {
                decoder->state.err = 0;
+               if (decoder->cbr != decoder->cbr_seen && decoder->state.type) {
+                       decoder->cbr_seen = decoder->cbr;
+                       decoder->state.type |= INTEL_PT_CBR_CHG;
+                       decoder->state.cbr_payload = decoder->cbr_payload;
+               }
        }
 
        return &decoder->state;
diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h 
b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h
index 414c88e9e0da..921b22e8ca0e 100644
--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h
+++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h
@@ -36,6 +36,7 @@ enum intel_pt_sample_type {
        INTEL_PT_PWR_ENTRY      = 1 << 5,
        INTEL_PT_EX_STOP        = 1 << 6,
        INTEL_PT_PWR_EXIT       = 1 << 7,
+       INTEL_PT_CBR_CHG        = 1 << 8,
 };
 
 enum intel_pt_period_type {
@@ -73,6 +74,7 @@ struct intel_pt_state {
        uint64_t mwait_payload;
        uint64_t pwre_payload;
        uint64_t pwrx_payload;
+       uint64_t cbr_payload;
        uint32_t flags;
        enum intel_pt_insn_op insn_op;
        int insn_len;
-- 
1.9.1

Reply via email to