perf intel-pt: Retain the last PIP packet payload as is
authorAdrian Hunter <adrian.hunter@intel.com>
Thu, 18 Feb 2021 09:57:53 +0000 (11:57 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 18 Feb 2021 19:13:46 +0000 (16:13 -0300)
Retain the PIP packet payload as is, instead of just the CR3, because it
contains also the VMX NR flag which is needed to track VM-Entry.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Andi Kleen <ak@linux.intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: https://lore.kernel.org/r/20210218095801.19576-4-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/arch/x86/tests/intel-pt-pkt-decoder-test.c
tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
tools/perf/util/intel-pt-decoder/intel-pt-decoder.h
tools/perf/util/intel-pt-decoder/intel-pt-pkt-decoder.c
tools/perf/util/intel-pt-decoder/intel-pt-pkt-decoder.h

index 901bf1f..c933e3d 100644 (file)
@@ -66,8 +66,8 @@ struct test_data {
        {7, {0x9d, 1, 2, 3, 4, 5, 6}, 0, {INTEL_PT_FUP, 4, 0x60504030201}, 0, 0 },
        {9, {0xdd, 1, 2, 3, 4, 5, 6, 7, 8}, 0, {INTEL_PT_FUP, 6, 0x807060504030201}, 0, 0 },
        /* Paging Information Packet */
-       {8, {0x02, 0x43, 2, 4, 6, 8, 10, 12}, 0, {INTEL_PT_PIP, 0, 0x60504030201}, 0, 0 },
-       {8, {0x02, 0x43, 3, 4, 6, 8, 10, 12}, 0, {INTEL_PT_PIP, 0, 0x60504030201 | (1ULL << 63)}, 0, 0 },
+       {8, {0x02, 0x43, 2, 4, 6, 8, 10, 12}, 0, {INTEL_PT_PIP, 0, 0xC0A08060402}, 0, 0 },
+       {8, {0x02, 0x43, 3, 4, 6, 8, 10, 12}, 0, {INTEL_PT_PIP, 0, 0xC0A08060403}, 0, 0 },
        /* Mode Exec Packet */
        {2, {0x99, 0x00}, 0, {INTEL_PT_MODE_EXEC, 0, 16}, 0, 0 },
        {2, {0x99, 0x01}, 0, {INTEL_PT_MODE_EXEC, 0, 64}, 0, 0 },
index 6df52d3..cfaa091 100644 (file)
@@ -126,7 +126,7 @@ struct intel_pt_decoder {
        uint64_t pos;
        uint64_t last_ip;
        uint64_t ip;
-       uint64_t cr3;
+       uint64_t pip_payload;
        uint64_t timestamp;
        uint64_t tsc_timestamp;
        uint64_t ref_timestamp;
@@ -1757,7 +1757,7 @@ static int intel_pt_walk_psbend(struct intel_pt_decoder *decoder)
                        break;
 
                case INTEL_PT_PIP:
-                       decoder->cr3 = decoder->packet.payload & (BIT63 - 1);
+                       decoder->pip_payload = decoder->packet.payload;
                        break;
 
                case INTEL_PT_FUP:
@@ -1884,7 +1884,7 @@ static int intel_pt_walk_fup_tip(struct intel_pt_decoder *decoder)
                        return 0;
 
                case INTEL_PT_PIP:
-                       decoder->cr3 = decoder->packet.payload & (BIT63 - 1);
+                       decoder->pip_payload = decoder->packet.payload;
                        break;
 
                case INTEL_PT_MTC:
@@ -2297,7 +2297,7 @@ next:
                        return err;
 
                case INTEL_PT_PIP:
-                       decoder->cr3 = decoder->packet.payload & (BIT63 - 1);
+                       decoder->pip_payload = decoder->packet.payload;
                        break;
 
                case INTEL_PT_MTC:
@@ -2536,7 +2536,7 @@ static int intel_pt_walk_psb(struct intel_pt_decoder *decoder)
                        break;
 
                case INTEL_PT_PIP:
-                       decoder->cr3 = decoder->packet.payload & (BIT63 - 1);
+                       decoder->pip_payload = decoder->packet.payload;
                        break;
 
                case INTEL_PT_MODE_EXEC:
@@ -2655,7 +2655,7 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder)
                        break;
 
                case INTEL_PT_PIP:
-                       decoder->cr3 = decoder->packet.payload & (BIT63 - 1);
+                       decoder->pip_payload = decoder->packet.payload;
                        break;
 
                case INTEL_PT_MODE_EXEC:
@@ -2987,7 +2987,7 @@ const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder)
 
        decoder->state.timestamp = decoder->sample_timestamp;
        decoder->state.est_timestamp = intel_pt_est_timestamp(decoder);
-       decoder->state.cr3 = decoder->cr3;
+       decoder->state.pip_payload = decoder->pip_payload;
        decoder->state.tot_insn_cnt = decoder->tot_insn_cnt;
        decoder->state.tot_cyc_cnt = decoder->sample_tot_cyc_cnt;
 
index ae13f32..b9564c9 100644 (file)
@@ -204,7 +204,7 @@ struct intel_pt_state {
        int err;
        uint64_t from_ip;
        uint64_t to_ip;
-       uint64_t cr3;
+       uint64_t pip_payload;
        uint64_t tot_insn_cnt;
        uint64_t tot_cyc_cnt;
        uint64_t timestamp;
index 4ce1099..02a3395 100644 (file)
@@ -16,8 +16,6 @@
 
 #define BIT63          ((uint64_t)1 << 63)
 
-#define NR_FLAG                BIT63
-
 #if __BYTE_ORDER == __BIG_ENDIAN
 #define le16_to_cpu bswap_16
 #define le32_to_cpu bswap_32
@@ -106,9 +104,7 @@ static int intel_pt_get_pip(const unsigned char *buf, size_t len,
 
        packet->type = INTEL_PT_PIP;
        memcpy_le64(&payload, buf + 2, 6);
-       packet->payload = payload >> 1;
-       if (payload & 1)
-               packet->payload |= NR_FLAG;
+       packet->payload = payload;
 
        return 8;
 }
@@ -719,10 +715,10 @@ int intel_pt_pkt_desc(const struct intel_pt_pkt *packet, char *buf,
                                name, (unsigned)(payload >> 1) & 1,
                                (unsigned)payload & 1);
        case INTEL_PT_PIP:
-               nr = packet->payload & NR_FLAG ? 1 : 0;
-               payload &= ~NR_FLAG;
+               nr = packet->payload & INTEL_PT_VMX_NR_FLAG ? 1 : 0;
+               payload &= ~INTEL_PT_VMX_NR_FLAG;
                ret = snprintf(buf, buf_len, "%s 0x%llx (NR=%d)",
-                              name, payload, nr);
+                              name, payload >> 1, nr);
                return ret;
        case INTEL_PT_PTWRITE:
                return snprintf(buf, buf_len, "%s 0x%llx IP:0", name, payload);
index 17ca9b5..996090c 100644 (file)
@@ -21,6 +21,8 @@
 
 #define INTEL_PT_PKT_MAX_SZ            16
 
+#define INTEL_PT_VMX_NR_FLAG           1
+
 enum intel_pt_pkt_type {
        INTEL_PT_BAD,
        INTEL_PT_PAD,