Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * intel_pt_pkt_decoder.h: Intel Processor Trace support
0004  * Copyright (c) 2013-2014, Intel Corporation.
0005  */
0006 
0007 #ifndef INCLUDE__INTEL_PT_PKT_DECODER_H__
0008 #define INCLUDE__INTEL_PT_PKT_DECODER_H__
0009 
0010 #include <stddef.h>
0011 #include <stdint.h>
0012 
0013 #define INTEL_PT_PKT_DESC_MAX   256
0014 
0015 #define INTEL_PT_NEED_MORE_BYTES    -1
0016 #define INTEL_PT_BAD_PACKET     -2
0017 
0018 #define INTEL_PT_PSB_STR        "\002\202\002\202\002\202\002\202" \
0019                     "\002\202\002\202\002\202\002\202"
0020 #define INTEL_PT_PSB_LEN        16
0021 
0022 #define INTEL_PT_PKT_MAX_SZ     16
0023 
0024 #define INTEL_PT_VMX_NR_FLAG        1
0025 
0026 enum intel_pt_pkt_type {
0027     INTEL_PT_BAD,
0028     INTEL_PT_PAD,
0029     INTEL_PT_TNT,
0030     INTEL_PT_TIP_PGD,
0031     INTEL_PT_TIP_PGE,
0032     INTEL_PT_TSC,
0033     INTEL_PT_TMA,
0034     INTEL_PT_MODE_EXEC,
0035     INTEL_PT_MODE_TSX,
0036     INTEL_PT_MTC,
0037     INTEL_PT_TIP,
0038     INTEL_PT_FUP,
0039     INTEL_PT_CYC,
0040     INTEL_PT_VMCS,
0041     INTEL_PT_PSB,
0042     INTEL_PT_PSBEND,
0043     INTEL_PT_CBR,
0044     INTEL_PT_TRACESTOP,
0045     INTEL_PT_PIP,
0046     INTEL_PT_OVF,
0047     INTEL_PT_MNT,
0048     INTEL_PT_PTWRITE,
0049     INTEL_PT_PTWRITE_IP,
0050     INTEL_PT_EXSTOP,
0051     INTEL_PT_EXSTOP_IP,
0052     INTEL_PT_MWAIT,
0053     INTEL_PT_PWRE,
0054     INTEL_PT_PWRX,
0055     INTEL_PT_BBP,
0056     INTEL_PT_BIP,
0057     INTEL_PT_BEP,
0058     INTEL_PT_BEP_IP,
0059     INTEL_PT_CFE,
0060     INTEL_PT_CFE_IP,
0061     INTEL_PT_EVD,
0062 };
0063 
0064 struct intel_pt_pkt {
0065     enum intel_pt_pkt_type  type;
0066     int         count;
0067     uint64_t        payload;
0068 };
0069 
0070 /*
0071  * Decoding of BIP packets conflicts with single-byte TNT packets. Since BIP
0072  * packets only occur in the context of a block (i.e. between BBP and BEP), that
0073  * context must be recorded and passed to the packet decoder.
0074  */
0075 enum intel_pt_pkt_ctx {
0076     INTEL_PT_NO_CTX,    /* BIP packets are invalid */
0077     INTEL_PT_BLK_4_CTX, /* 4-byte BIP packets */
0078     INTEL_PT_BLK_8_CTX, /* 8-byte BIP packets */
0079 };
0080 
0081 const char *intel_pt_pkt_name(enum intel_pt_pkt_type);
0082 
0083 int intel_pt_get_packet(const unsigned char *buf, size_t len,
0084             struct intel_pt_pkt *packet,
0085             enum intel_pt_pkt_ctx *ctx);
0086 
0087 void intel_pt_upd_pkt_ctx(const struct intel_pt_pkt *packet,
0088               enum intel_pt_pkt_ctx *ctx);
0089 
0090 int intel_pt_pkt_desc(const struct intel_pt_pkt *packet, char *buf, size_t len);
0091 
0092 #endif