mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-25 19:55:28 +07:00
edff7809c8
Add 3 new packets to supports PEBS via PT, namely Block Begin Packet (BBP), Block Item Packet (BIP) and Block End Packet (BEP). PEBS data is encoded into multiple BIP packets that come between BBP and BEP. The BEP packet might be associated with a FUP packet. That is indicated by using a separate packet type (INTEL_PT_BEP_IP) similar to other packets types with the _IP suffix. Refer to the Intel SDM for more information about PEBS via PT: https://software.intel.com/en-us/articles/intel-sdm May 2019 version: Vol. 3B 18.5.5.2 PEBS output to Intel® Processor Trace Decoding of BIP packets conflicts with single-byte TNT packets. Since BIP packets only occur in the context of a block (i.e. between BBP and BEP), that context must be recorded and passed to the packet decoder. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: Jiri Olsa <jolsa@redhat.com> Link: http://lkml.kernel.org/r/20190610072803.10456-2-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
88 lines
1.9 KiB
C
88 lines
1.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* intel_pt_pkt_decoder.h: Intel Processor Trace support
|
|
* Copyright (c) 2013-2014, Intel Corporation.
|
|
*/
|
|
|
|
#ifndef INCLUDE__INTEL_PT_PKT_DECODER_H__
|
|
#define INCLUDE__INTEL_PT_PKT_DECODER_H__
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#define INTEL_PT_PKT_DESC_MAX 256
|
|
|
|
#define INTEL_PT_NEED_MORE_BYTES -1
|
|
#define INTEL_PT_BAD_PACKET -2
|
|
|
|
#define INTEL_PT_PSB_STR "\002\202\002\202\002\202\002\202" \
|
|
"\002\202\002\202\002\202\002\202"
|
|
#define INTEL_PT_PSB_LEN 16
|
|
|
|
#define INTEL_PT_PKT_MAX_SZ 16
|
|
|
|
enum intel_pt_pkt_type {
|
|
INTEL_PT_BAD,
|
|
INTEL_PT_PAD,
|
|
INTEL_PT_TNT,
|
|
INTEL_PT_TIP_PGD,
|
|
INTEL_PT_TIP_PGE,
|
|
INTEL_PT_TSC,
|
|
INTEL_PT_TMA,
|
|
INTEL_PT_MODE_EXEC,
|
|
INTEL_PT_MODE_TSX,
|
|
INTEL_PT_MTC,
|
|
INTEL_PT_TIP,
|
|
INTEL_PT_FUP,
|
|
INTEL_PT_CYC,
|
|
INTEL_PT_VMCS,
|
|
INTEL_PT_PSB,
|
|
INTEL_PT_PSBEND,
|
|
INTEL_PT_CBR,
|
|
INTEL_PT_TRACESTOP,
|
|
INTEL_PT_PIP,
|
|
INTEL_PT_OVF,
|
|
INTEL_PT_MNT,
|
|
INTEL_PT_PTWRITE,
|
|
INTEL_PT_PTWRITE_IP,
|
|
INTEL_PT_EXSTOP,
|
|
INTEL_PT_EXSTOP_IP,
|
|
INTEL_PT_MWAIT,
|
|
INTEL_PT_PWRE,
|
|
INTEL_PT_PWRX,
|
|
INTEL_PT_BBP,
|
|
INTEL_PT_BIP,
|
|
INTEL_PT_BEP,
|
|
INTEL_PT_BEP_IP,
|
|
};
|
|
|
|
struct intel_pt_pkt {
|
|
enum intel_pt_pkt_type type;
|
|
int count;
|
|
uint64_t payload;
|
|
};
|
|
|
|
/*
|
|
* Decoding of BIP packets conflicts with single-byte TNT packets. Since BIP
|
|
* packets only occur in the context of a block (i.e. between BBP and BEP), that
|
|
* context must be recorded and passed to the packet decoder.
|
|
*/
|
|
enum intel_pt_pkt_ctx {
|
|
INTEL_PT_NO_CTX, /* BIP packets are invalid */
|
|
INTEL_PT_BLK_4_CTX, /* 4-byte BIP packets */
|
|
INTEL_PT_BLK_8_CTX, /* 8-byte BIP packets */
|
|
};
|
|
|
|
const char *intel_pt_pkt_name(enum intel_pt_pkt_type);
|
|
|
|
int intel_pt_get_packet(const unsigned char *buf, size_t len,
|
|
struct intel_pt_pkt *packet,
|
|
enum intel_pt_pkt_ctx *ctx);
|
|
|
|
void intel_pt_upd_pkt_ctx(const struct intel_pt_pkt *packet,
|
|
enum intel_pt_pkt_ctx *ctx);
|
|
|
|
int intel_pt_pkt_desc(const struct intel_pt_pkt *packet, char *buf, size_t len);
|
|
|
|
#endif
|