162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * intel_pt_pkt_decoder.h: Intel Processor Trace support 462306a36Sopenharmony_ci * Copyright (c) 2013-2014, Intel Corporation. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef INCLUDE__INTEL_PT_PKT_DECODER_H__ 862306a36Sopenharmony_ci#define INCLUDE__INTEL_PT_PKT_DECODER_H__ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <stddef.h> 1162306a36Sopenharmony_ci#include <stdint.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define INTEL_PT_PKT_DESC_MAX 256 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define INTEL_PT_NEED_MORE_BYTES -1 1662306a36Sopenharmony_ci#define INTEL_PT_BAD_PACKET -2 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define INTEL_PT_PSB_STR "\002\202\002\202\002\202\002\202" \ 1962306a36Sopenharmony_ci "\002\202\002\202\002\202\002\202" 2062306a36Sopenharmony_ci#define INTEL_PT_PSB_LEN 16 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define INTEL_PT_PKT_MAX_SZ 16 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define INTEL_PT_VMX_NR_FLAG 1 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cienum intel_pt_pkt_type { 2762306a36Sopenharmony_ci INTEL_PT_BAD, 2862306a36Sopenharmony_ci INTEL_PT_PAD, 2962306a36Sopenharmony_ci INTEL_PT_TNT, 3062306a36Sopenharmony_ci INTEL_PT_TIP_PGD, 3162306a36Sopenharmony_ci INTEL_PT_TIP_PGE, 3262306a36Sopenharmony_ci INTEL_PT_TSC, 3362306a36Sopenharmony_ci INTEL_PT_TMA, 3462306a36Sopenharmony_ci INTEL_PT_MODE_EXEC, 3562306a36Sopenharmony_ci INTEL_PT_MODE_TSX, 3662306a36Sopenharmony_ci INTEL_PT_MTC, 3762306a36Sopenharmony_ci INTEL_PT_TIP, 3862306a36Sopenharmony_ci INTEL_PT_FUP, 3962306a36Sopenharmony_ci INTEL_PT_CYC, 4062306a36Sopenharmony_ci INTEL_PT_VMCS, 4162306a36Sopenharmony_ci INTEL_PT_PSB, 4262306a36Sopenharmony_ci INTEL_PT_PSBEND, 4362306a36Sopenharmony_ci INTEL_PT_CBR, 4462306a36Sopenharmony_ci INTEL_PT_TRACESTOP, 4562306a36Sopenharmony_ci INTEL_PT_PIP, 4662306a36Sopenharmony_ci INTEL_PT_OVF, 4762306a36Sopenharmony_ci INTEL_PT_MNT, 4862306a36Sopenharmony_ci INTEL_PT_PTWRITE, 4962306a36Sopenharmony_ci INTEL_PT_PTWRITE_IP, 5062306a36Sopenharmony_ci INTEL_PT_EXSTOP, 5162306a36Sopenharmony_ci INTEL_PT_EXSTOP_IP, 5262306a36Sopenharmony_ci INTEL_PT_MWAIT, 5362306a36Sopenharmony_ci INTEL_PT_PWRE, 5462306a36Sopenharmony_ci INTEL_PT_PWRX, 5562306a36Sopenharmony_ci INTEL_PT_BBP, 5662306a36Sopenharmony_ci INTEL_PT_BIP, 5762306a36Sopenharmony_ci INTEL_PT_BEP, 5862306a36Sopenharmony_ci INTEL_PT_BEP_IP, 5962306a36Sopenharmony_ci INTEL_PT_CFE, 6062306a36Sopenharmony_ci INTEL_PT_CFE_IP, 6162306a36Sopenharmony_ci INTEL_PT_EVD, 6262306a36Sopenharmony_ci}; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistruct intel_pt_pkt { 6562306a36Sopenharmony_ci enum intel_pt_pkt_type type; 6662306a36Sopenharmony_ci int count; 6762306a36Sopenharmony_ci uint64_t payload; 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci/* 7162306a36Sopenharmony_ci * Decoding of BIP packets conflicts with single-byte TNT packets. Since BIP 7262306a36Sopenharmony_ci * packets only occur in the context of a block (i.e. between BBP and BEP), that 7362306a36Sopenharmony_ci * context must be recorded and passed to the packet decoder. 7462306a36Sopenharmony_ci */ 7562306a36Sopenharmony_cienum intel_pt_pkt_ctx { 7662306a36Sopenharmony_ci INTEL_PT_NO_CTX, /* BIP packets are invalid */ 7762306a36Sopenharmony_ci INTEL_PT_BLK_4_CTX, /* 4-byte BIP packets */ 7862306a36Sopenharmony_ci INTEL_PT_BLK_8_CTX, /* 8-byte BIP packets */ 7962306a36Sopenharmony_ci}; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ciconst char *intel_pt_pkt_name(enum intel_pt_pkt_type); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ciint intel_pt_get_packet(const unsigned char *buf, size_t len, 8462306a36Sopenharmony_ci struct intel_pt_pkt *packet, 8562306a36Sopenharmony_ci enum intel_pt_pkt_ctx *ctx); 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_civoid intel_pt_upd_pkt_ctx(const struct intel_pt_pkt *packet, 8862306a36Sopenharmony_ci enum intel_pt_pkt_ctx *ctx); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ciint intel_pt_pkt_desc(const struct intel_pt_pkt *packet, char *buf, size_t len); 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#endif 93